我想做的是在我拥有的一些源文件中找到从 double 或 float 类型到任何其他类型的所有显式转换。有内置的 gcc 方法可以做到这一点吗? 语言是 C。
如果您的 C 代码也可以在 C++ 模式下编译,您可以使用 g++ 的
-Wold-style-cast
警告标志来触发对所有此类强制转换的警告。
您可以使用其
-Weverything
开关来确定 Clang 是否有任何将针对特定编码模式触发的警告(但请注意,这对于几乎任何其他目的都没有用处——clang 具有默认禁用的警告,这些警告会在各种形式的合法代码)。然而,在这种情况下,clang 没有任何触发此类强制转换的警告。
由于强制转换是明确合法的,并且是执行奇怪转换的正确方法,因此 gcc 不太可能包含警告它们的选项
相反,根据您的来源有多大,您可能能够逃脱:
grep '\(double|float\) ' *
为您提供所有双精度或浮点变量。由于 c 不是常规语言,因此将其解析为 double 或 float 变量列表并不简单(使用 shell 工具),但如果您的源代码足够小,则手动执行此操作很容易。
grep '([^()]*)[ ()]*\(your list of variable names\)' *
从那里会向您展示许多演员阵容。
-Wconversion
警告可能改变值的隐式转换(double
是大类型),并且-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
我认为没有这样的选择。毕竟,编译器发出警告是为了警告您可能无意中所做的事情。然而,显式强制转换基本上是告诉编译器“闭嘴,我知道我在做什么”的一种方法。