我正在努力将遗留应用程序移植到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中是否有一面旗帜警告我这些类型的风险明确演员?如果没有,我该如何添加?
答案 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
显式转换,因此编译器会假设您知道自己在做什么。否则,你会在任何你做的任何演员阵容上收到警告。