$ cat main.c
#include <stdio.h>
int main(int argc, char **argv) {
if (argc != 2) {
return 0;
}
printf("argv[1] = %s\n", argv[1]);
}
$ clang -Weverything main.c
main.c:3:27: warning: 'argv' is an unsafe pointer used for buffer access [-Wunsafe-buffer-usage]
int main(int argc, char **argv) {
~~~~~~~^~~~
main.c:7:30: note: used in buffer access here
printf("argv[1] = %s\n", argv[1]);
^~~~
1 warning generated.
使用此警告无法合理推理代码。
clang文档如下:
由于-Weverything启用了每个诊断,我们通常不建议使用它。对于大多数项目来说,-Wall -Wextra是更好的选择。使用-Weverything意味着更新编译器更加困难,因为您会暴露于实验诊断,这些诊断可能比默认诊断质量低。如果您确实使用-Weverything,则建议您在添加到Clang的所有新编译器诊断时解决它们,无论是通过修复它们找到的东西还是通过显式禁用其相应的Wno-选项来禁用该诊断。
在这种情况下,我要如何“修复他们找到的一切”?
设置-Wno-unsafe-buffer-usage
有效,但这是一个丑陋的解决方案。
它会使Makefile变得杂乱无章,并感觉像是作弊。
-Weverything
进行斗争可能不是你想要开始的战斗。在这种情况下,你可能能够让-Weverything
满意,但是你还需要满足更多的警告,其中许多可能需要使你的代码变得更糟以进行“修复”。例如,满足-Wdeclaration-after-statement
将要求你在函数顶部而不是需要时声明所有局部变量。 - Brian61354270-Weverything
的地方,我也会用-Wno-xyz
变体来对抗一些选项。我使用的一个脚本是这样的:-Weverything -Wno-padded -Wno-vla -Wno-reserved-id-macro -Wno-documentation-unknown-command -Wno-poison-system-directories -Wno-format-nonliteral
。我在许多程序中构建格式字符串,因此需要-Wno-format-nonliteral
。我在矩阵操作代码中使用VLA(以及其他地方),所以需要-Wno-vla
。我使用特性测试宏(用于POSIX和Solaris等系统)来确定如何编译代码,因此-Wno-reserved-id-macro
是必要的。_[…继续…]_ - Jonathan Leffler-Wno-unsafe-buffer-usage
感觉像作弊,那么-Weverything
是否感觉像一个不合理的障碍呢?正如你引用的摘录所述,-Wall -Wextra
被期望成为一个有用的警告集合。 - Toby Speight