有没有办法让gcc或clang警告显式演员表?

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

由于强制转换是明确合法的,并且是执行奇怪转换的正确方法,因此gcc不太可能包含警告它们的选项

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

 grep '\(double|float\) ' * 

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

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

从那里会向你展示你的许多演员阵容。

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

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

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

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

虽然我知道的编译器没有这方面的选择,但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 

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