【发布时间】:2013-03-01 15:02:32
【问题描述】:
我正在寻找与 gcc 一起使用的正确警告标志,以检测以下内容:
#include <stdlib.h>
#include <stdio.h>
int main()
{
const size_t n = (size_t)-1;
for( unsigned int i = 0; i < n; ++i ) /* use `unsigned char` if you want */
{
printf( "%d\n", i );
}
return 0;
}
我试过了:
$ gcc -Wsign-conversion -Wconversion -pedantic -Wsign-compare -W -Wall -Wextra -std=c99 t.c
发生的事情是我一直在修改现有代码,该代码使用unsigned int 作为内存块大小。代码以较大的文件开始失败。所以我需要检查我没有遗漏任何剩余的东西。
编辑:
刚刚发现-Wtype-limits,但这又不适合我
【问题讨论】:
-
那么你希望它警告什么?因为我没有看到任何关于代码的可疑之处,当然 n 永远不会因为它的值太大而被修改。但是编译器看不到它。如果它是一个 const size_t n = -1,那么它可能会告诉你它总是正确的。但除此之外,我看不出它是如何分辨的。
-
顺便说一句,
-Wsign-conversion弊大于利。因为它会警告size_t n = -1,但这始终意味着size_t的最大值并试图修复它会使事情变得更糟,因为在size_t n = (size_t)-1中,在重构期间修改它的风险很小,而size_t n = -1u是完全错误的.
标签: gcc