警告确定不安全的演员铿锵声

时间:2012-11-22 07:53:57

标签: c++ casting clang long-integer

我正在努力将遗留应用程序移植到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但没有成功。在clang中是否有一面旗帜警告我这些类型的风险明确演员?如果没有,我该如何添加?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

最简单的方法是用reinterpret_cast查找/替换所有static_cast并编译 - GCC会给你一堆关于无效static_cast的错误

答案 2 :(得分:1)

您使用reinterpret_cast显式转换,因此编译器会假设您知道自己在做什么。否则,你会在任何你做的任何演员阵容上收到警告。