Gcc 11+ 在使用 char str [100] 类型的参数并向其传递较小的字符串时警告 Wstringop 溢出
Gcc 11+ warning Wstringop-overflow when using parameter of type char str[100] and passing it a smaller string
代码:
#include <stdio.h>
void Print(char str[100])
{
printf("%s", str);
}
int main(void)
{
Print("A");
}
使用 GCC 11.1 及更高版本编译时会产生警告
warning: 'Print' accessing 100 bytes in a region of size 2 [-Wstringop-overflow=]
当我传递一个较小的字符串时。这没有启用任何警告标志。
示例代码:https://godbolt.org/z/nWs1PK9Y6
如您所见,其他编译器对此并不抱怨。
我确实找到了一个有相关问题但关于 int 数组的线程,这甚至更奇怪:
GCC 11 gives -Wstringop-overflow when no string operation is used
然而,这绝对是一个错误,已得到纠正,并且在 tip-of-trunk 版本中不再出现,而在我展示的代码中,它在 trunk 中仍然有相同的警告。
我认为这是另一个错误,或者至少是一个不太有用的警告,因为据我所知,该参数将衰减为指针,但我想确认这一点。
如评论部分所述,这对于警告 API 用户传递一个较小的字符串作为参数很有用,但这是否真的有意义,至少在没有显示的情况下启用警告标志?
在其他情况下,将字符串传递给更大的数组是微不足道的。对我来说,如果传递的字符串大于参数应该采用的字符串,则警告用户会更有意义,但如果我传递的字符串大于 100,警告就会消失。
The -Wstringop-overflow=4
option uses type-three Object Size Checking to determine the sizes of destination objects. At this setting the option warns about overflowing any data members, and when the destination is one of several objects it uses the size of the largest of them to decide whether to issue a warning. Similarly to -Wstringop-overflow=3
this setting of the option may result in warnings for benign code.
来源:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
如果 char str[100]
是 char str[]
,那么 gcc 会自动将其更改为 char *
。
可以通过使用优化标志 -O2
或 -O3
.
来抑制此警告
代码:
#include <stdio.h>
void Print(char str[100])
{
printf("%s", str);
}
int main(void)
{
Print("A");
}
使用 GCC 11.1 及更高版本编译时会产生警告
warning: 'Print' accessing 100 bytes in a region of size 2 [-Wstringop-overflow=]
当我传递一个较小的字符串时。这没有启用任何警告标志。
示例代码:https://godbolt.org/z/nWs1PK9Y6
如您所见,其他编译器对此并不抱怨。
我确实找到了一个有相关问题但关于 int 数组的线程,这甚至更奇怪:
GCC 11 gives -Wstringop-overflow when no string operation is used
然而,这绝对是一个错误,已得到纠正,并且在 tip-of-trunk 版本中不再出现,而在我展示的代码中,它在 trunk 中仍然有相同的警告。
我认为这是另一个错误,或者至少是一个不太有用的警告,因为据我所知,该参数将衰减为指针,但我想确认这一点。
如评论部分所述,这对于警告 API 用户传递一个较小的字符串作为参数很有用,但这是否真的有意义,至少在没有显示的情况下启用警告标志?
在其他情况下,将字符串传递给更大的数组是微不足道的。对我来说,如果传递的字符串大于参数应该采用的字符串,则警告用户会更有意义,但如果我传递的字符串大于 100,警告就会消失。
The
-Wstringop-overflow=4
option uses type-three Object Size Checking to determine the sizes of destination objects. At this setting the option warns about overflowing any data members, and when the destination is one of several objects it uses the size of the largest of them to decide whether to issue a warning. Similarly to-Wstringop-overflow=3
this setting of the option may result in warnings for benign code.
来源:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
如果 char str[100]
是 char str[]
,那么 gcc 会自动将其更改为 char *
。
可以通过使用优化标志 -O2
或 -O3
.