有没有办法让gcc或clang警告明确的演员阵容?

时间:2012-04-25 15:18:36

标签: c gcc compiler-construction clang

我要做的是找到所有显式的强制转换,从double类型或float到我拥有的某些源文件中的任何其他类型。有没有内置的gcc方法来做到这一点? 语言是C. 谢谢!

5 个答案:

答案 0 :(得分:7)

如果您的C代码也可以在C ++模式下编译,您可以使用g ++的-Wold-style-cast警告标志来触发所有此类强制转换的警告。

你可以通过使用-Weverything开关确定Clang是否有任何会触发特定编码模式的警告(但请注意,这对于几乎任何其他目的都没用 - clang已默认禁用触发各种形式的合法代码的警告)。但是,在这种情况下,clang没有任何触发此类演员的警告。

答案 1 :(得分:2)

-Wconversion警告可能改变值的隐式转换(double是大类型),-Wno-sign-conversion禁用有关有符号和无符号整数之间转换的警告(因此不必要的更少)警告)。否则,我没有看到任何标准替代品......

最糟糕的情况是,您可以直接在源文件中查找这些关键字......

答案 2 :(得分:2)

由于演员阵容是明确合法的,并且是执行怪异转换的正确方法,因此gcc不太可能包含警告他们的选项

相反,根据你的来源有多大,你可能会逃脱:

grep '\(double|float\) ' *

给你所有的double或float变量。由于c不是常规语言,因此将它解析为double或float变量列表并不是一件容易的事(使用shell工具),但如果你的源足够小,那么手动执行此操作很容易。

grep '([^()]*)[ ()]*\(your list of variable names\)' *

从那里可以看到你的很多演员阵容。

答案 3 :(得分:1)

虽然我知道的编译器没有这方面的选择,但Gimpel的FlexeLint可以做你想做的事情:

$ cat tst.c
int main (void)
{
    int i = 0, j = 0;
    float f = 0.0;
    double d = 0.0;

    i = (int) f;
    j = (int) d;
    d = (double) f;
    f = (float) d;
    i = (int)j;
    j = (unsigned) i;
    return (int) j;
}

$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012

--- Module:   tst.c (C)
               _
    i = (int) f;
tst.c  7  Note 922: cast from float to int
               _
    j = (int) d;
tst.c  8  Note 922: cast from double to int
                  _
    d = (double) f;
tst.c  9  Note 922: cast from float to double
                 _
    f = (float) d;
tst.c  10  Note 922: cast from double to float

shell returned 4

答案 4 :(得分:0)

我认为没有这样的选择。毕竟,编译器会发出警告,以警告您可能无意中执行的操作。但是,显式转换基本上是一种告诉编译器“闭嘴,我知道我在做什么”的方法。