我能否让GCC在将过宽的类型传递给函数时发出警告?

12

以下是一些明显存在问题的代码,我认为编译器应该发出警告。但是,无论我使用哪些警告选项,包括-pedantic -Wall -Wextragccg++都没有发出警告:

#include <stdio.h>

short f(short x)
{
    return x;
}

int main()
{
    long x = 0x10000007;   /* bigger than short */
    printf("%d\n", f(x));  /* hoping for a warning here */
    return 0;
}
有没有办法让gccg++发出警告?另外,你有没有另一个编译器默认或在常见的额外警告配置中发出警告?
注意:我正在使用GCC(C和C ++编译器)版本4.2.4。
编辑:我刚发现gcc -Wconversion可以解决问题,但对于g++来说却不行,而我真正使用的是C++,因此我需要一个适用于g++的解决方案(现在想知道为什么-Wconversion似乎不是它)。
编辑: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 表明这可能在g ++ 4.4中修复...也许?我还不确定这是否是相同的问题,修复是否真的在那个版本中实现。也许某个使用4.3或4.4的人可以尝试一下我的测试用例。
2个回答

9

使用-Wconversion——问题是在调用函数f(short x)时(而不是printf),将long x隐式转换(转换)为short,-Wconversion将显示类似“从long到short的转换可能会改变值”的内容。

..

编辑:刚看到您的注释。在Linux上使用g++ 4.3.2时,-Wconversion会产生警告...(Debian上的4.3.2-1)


啊哈——所以只是因为4.2.4版本太“老”,无法像应该一样发出警告,而4.3.2版本可以(我在这里做了一些假设,但我认为这是安全的,因为我正在使用Ubuntu,并且我看到了一些关于此问题的注释,使得认为这只是在4.3+中修复的问题)。 - John Zwinck
我现在在Ubuntu Intrepid机器上尝试使用GCC 4.3.2,而-Wconversion做了我想要的事情。太好了。但是4.2.4不起作用,真遗憾。 - John Zwinck
在g++中缺少对-Wsign-conversion的提及(至少在较新版本中是必需的)... - codeling

0
我强烈建议从Gimpel购买PC-lint/FlexeLint。该软件专门用于捕捉编译器无法发现的问题,像这样的问题。它价格相对较低,物有所值。该网站上有一个在线演示,您可以使用它来评估它,以下是它针对您示例中的行报告的内容:
diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)

正如被接受的答案所示,编译器完全能够检测到这样的事情。 - qwr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接