12

以下是一些明显有缺陷的代码,我认为编译器应该对其进行诊断。但是,即使有我能想到的所有警告选项,gcc也没有:g++-pedantic -Wall -Wextra

#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;
}

有没有办法对此提出gcc警告g++?附带说明一下,您是否有另一个编译器在默认情况下或在相当常见的额外警告配置中对此发出警告?

注意:我使用的是 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 的人可以试试我的测试用例。

4

2 回答 2

9

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

..

编辑:刚刚看到你的笔记。-Wconversion 在 Linux 上使用 g++ 4.3.2 对我产生警告...(在 Debian 上使用 4.3.2-1)

于 2008-11-21T20:55:30.130 回答
0

我强烈建议投资Gimpel的 PC-lint/FlexeLint 。该软件旨在捕获编译器无法捕获的此类内容。它相对便宜,而且物有所值。网站上有一个在线演示,您可以使用它来评估它,这是它为您的示例中的相关行报告的内容:

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
于 2008-11-21T20:55:00.367 回答