2008-11-21 27 views
9

以下是我认为编译器应该发出诊断的一些明显缺陷的代码。但无论是gcc也不g++确实,即使所有我能想到的警告选项:-pedantic -Wall -Wextra我可以让GCC警告将太宽的类型传递给函数吗?

#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的人可以尝试我的测试用例。

回答

6

使用-Wconversion - 问题是隐式转换(转换)从长x到短,当函数f(short x)被调用[not printf]时,并且-Wconversion会说类似“从long到short可能会改变值”。

..

编辑:刚才看到你的笔记。 -Wconversion导致了我一个警告,在Linux上使用G ++ 4.3.2 ...(4.3.2-1在Debian)

+0

啊哈 - 所以它只是4.2.4太“老”,使之发出警告就像它应该和4.3.2一样(我在这里做了一些假设,但我认为可以肯定地说,因为我使用的是Ubuntu,并且我看到了一些关于这个问题的说明,认为这是合理的只是一些固定在4.3以上。 – 2008-11-21 21:16:02

0

我强烈建议从Gimpel投资PC-lint/FlexeLint。该软件是为了捕捉这样的东西,编译器不是。这是相对便宜,非常值得的价格。还有就是你可以用它来评估它在网站上的在线演示,这里是它从你的例子中,这个行报告:

diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits) 
相关问题