有没有什么办法让GCC或铛警告在显式转换?(Is there any way to get gcc

2019-06-23 23:06发布

我正在试图做的是找到所有类型显式转换双重或浮动到任何其他类型的一些源文件,我有。 是否有一个内置的GCC办法做到这一点? 语言是C.谢谢!

Answer 1:

由于强制转换有明确的法律,并执行转换怪异正确的方式,这是极不可能的,GCC将包含一个选项,以警告他们

相反,这取决于你的来源是如何巨大,你也许能逃脱:

grep '\(double|float\) ' *

给你所有的双重或浮动的变量。 由于C是不是正规的语言,这是不平凡的(有壳工具)来解析成双层或浮动变量的名单,但如果你的来源是足够小,做手工,这是很容易。

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

从那里会告诉你许多你的类型转换。



Answer 2:

如果你的C代码,也可以在C ++模式下进行编译,你可以使用G ++的-Wold-style-cast警告标志,以触发所有这些类型转换的警告。

您可以决定是否铛具有将触发通过使用其特定的编码模式的任何警告-Weverything开关(但请注意,这不是几乎任何其他目的有用-铛已禁用按默认其触发各种形式的警告合法的代码)。 然而,在这种情况下,铛不具有触发这种类型转换的警告。



Answer 3:

-Wconversion警告上述可能改变的值(隐式转换double大类型),和-Wno-sign-conversion禁用有关符号和无符号整数之间的转换警告(所以会有较少不必要的警告)。 否则我看不出有什么标准替代...

最糟糕的情况下,你可以寻找那些关键字直接到源文件...



Answer 4:

虽然我知道,编译器不具有该选项,金培尔的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


Answer 5:

嗯,我觉得没有这样的选项。 毕竟,一个警告是由编译器,以便从事情你可能无意中做了提醒你发出的。 显式类型转换,但基本上是一个办法告诉你的编译器“闭嘴,我知道我在做什么”。



文章来源: Is there any way to get gcc or clang to warn on explicit casts?