1

我正在将遗留应用程序移植到 Linux 上的 64 位。有很多地方 long 和 int 可以互换使用,而且源代码相当大,很难通过测试来捕获所有这些。我打算使用插件来静态分析代码并修复不安全的代码。一种这样的模式是

void foo(unsigned long *x){
    *x = *x + 1; //x is pointing to a 32-bit space
    return;
}

int main(){
    unsigned int x = ;
    foo(reinterpret_cast<unsigned long*>(&x)); 
}

我们使用 gcc-4.2.1 来构建我们的应用程序。即使启用了 -Wall 和 -Wextra,它也不会警告我这些类型的演员表。

我尝试使用 -Weverything 运行 clang,但没有成功。铿锵声中是否有一个标志来警告我这些类型的有风险的显式强制转换?如果没有,我该如何添加一个?

4

3 回答 3

2

我认为clang不会直接警告您正在寻找的情况。但是,创建一个插件来检测所有 C 风格强制转换和/或reinterpret_cast<>()s 的使用是相当简单的。tools/clang/examples/PrintFunctionNames如果您有源代码树,则有一个如何在目录中创建插件的示例。如果您位于伦敦地区,您可能会对我下周一的演讲感兴趣。

于 2012-11-22T08:02:48.850 回答
2

那么想到的最简单的方法就是简单地查找/替换所有reinterpret_caststatic_cast编译 - GCC会给你一堆关于无效的错误static_cast

于 2012-11-22T08:08:29.567 回答
1

您通过 using 显式强制转换reinterpret_cast,因此编译器假定您知道自己在做什么。否则,无论你在哪里做的每一次演员都会收到警告。

于 2012-11-22T07:58:34.130 回答