编码:
#include <stdio.h>
void Print(char str[100])
{
printf("%s", str);
}
int main(void)
{
Print("A");
}
使用 GCC 11.1 及更高版本编译时会产生警告
警告:“打印”访问大小为 2 的区域中的 100 个字节 [-Wstringop-overflow=]
当我传递一个较小的字符串时。这没有启用任何警告标志。
示例代码:https ://godbolt.org/z/nWs1PK9Y6
正如您所看到的,其他编译器对此并不满意。
我确实找到了一个有相关问题的线程,但是关于一个更奇怪的 int 数组:
GCC 11 在不使用字符串操作时给出 -Wstringop-overflow
然而,这绝对是一个错误,已得到纠正,并且在树干尖端版本中不再发生,而在我显示的代码中,它在树干中仍然有相同的警告。
我认为这是另一个错误,或者至少是一个不是很有用的警告,因为据我所知,该参数将衰减为指针,但我想确认这一点。
正如评论部分所述,这对于警告 API 用户正在传递一个较小的字符串作为参数很有用,但这真的有意义吗,至少在没有启用警告标志的情况下显示它?
在其他情况下,将字符串传递给更大的数组是微不足道的。对我来说,如果传递的字符串大于参数应该采用的值,警告用户会更有意义,但如果我传递的字符串大于 100,警告就会消失。
该
-Wstringop-overflow=4
选项使用第三类对象大小检查来确定目标对象的大小。在此设置下,该选项会警告溢出任何数据成员,并且当目标是多个对象之一时,它使用其中最大的对象的大小来决定是否发出警告。-Wstringop-overflow=3
与此选项的设置类似,可能会导致良性代码的警告。
来源:https ://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
如果char str[100]
是char str[]
,则 gcc 会自动将其更改为char *
.
-O2
可以使用优化标志或来抑制此警告-O3
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句