有什么方法可以为函数指针比较生成警告?
Any way to generate warnings for function-pointer comparisons?
我花了很长时间才发现我的代码中有一个错误是由/OPT:ICF
触发的:
由于/OPT:ICF 可能导致将相同的地址分配给不同的函数或只读数据成员(使用/Gy 编译的 const 变量),因此它可以破坏依赖于函数的唯一地址或只读数据成员的程序。
(我一直在存储和比较函数指针以实现相等,当链接器抛弃相同的函数时,它会中断。
现在我需要找到我可能做过这样事情的每一个地方。
测试用例当然是微不足道的:
//MSVC: /Gy /link /OPT:ICF
int test1(void) { return 0; }
int test2(void) { return 0; }
int main(void) { return test1 == test2; }
我尝试过-Wall
、-Wextra
、-Weverything
、-pedantic
等,但没有一个生成警告。
是否有任何编译器选项或工具(无论是Visual C++,GCC,Clang还是其他的一部分)可以分析我的代码并告诉我在哪里将函数指针相互比较,如上面的代码所示?
是否有任何编译器选项或工具(无论是Visual C++,GCC,Clang还是其他的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?
我不确定是否存在这样的编译器选项。
但是,有这样一个工具。 叮叮当当整。您可以编写自己的检查来检查clang-tidy,如果您关注此博客,实际上非常容易。具体来说,AST已经带有一堆匹配器,它们应该可以处理您想要的用例。
这样的事情似乎有效:
binaryOperator(
anyOf(hasOperatorName("=="), hasOperatorName("!=")),
hasLHS(ignoringImpCasts(declRefExpr(hasType(functionType())))),
hasRHS(ignoringImpCasts(declRefExpr(hasType(functionType())))))
哪个标记了 OP 中的示例:
fp.cxx:3:25: note: "root" binds here
int main(void) { return test1 == test2; }
^~~~~~~~~~~~~~
这专门适用于 OP 情况,但实际上您必须更明确地匹配所有其他可能的情况:
const auto AnyFunc = ignoringImpCasts(declRefExpr(hasType(anyOf(
functionType(),
pointsTo(functionType()),
references(functionType())))));
Finder->AddMatcher(binaryOperator(
anyOf(hasOperatorName("=="), hasOperatorName("!=")),
hasLHS(AnyFunc),
hasRHS(AnyFunc)).bind("op"), this);
或者接近这种效果的东西。
相关文章:
- 禁止显示由于常量为零而比较始终为假的警告
- 与 string.size() 比较时 int 的符号性显示警告
- C++ 如何禁用具有不同符号变量比较的特定行的编译器警告?
- 在尝试提交作业警告时,我一直在警告:与未指定行为的字符串字面结果比较[-WADDRESS]
- 有什么方法可以为函数指针比较生成警告?
- C++ 斯特劳斯特鲁普的"std_lib_facilities.h"字符串结构 – 警告:无符号表达式的比较
- 即使启用了 Wextra,gcc 也不会给出将无符号整数< 0 进行比较的警告
- 为什么我没有警告枚举比较不匹配
- 不等式比较结果 移至 C++11 时未使用的警告
- C++:警告:与字符串文本进行比较会导致未指定的行为 [-Waddress]
- 警告:在 C++ 中比较数组和字符串
- 开发C++数据比较的警告
- 警告:有符号和无符号整数表达式之间的比较
- 有符号/无符号比较警告是什么意思
- xxx和bool在操作中的不安全混合仅在将值与TRUE进行比较时发出警告
- 如果您意外地使用布尔运算符 (||, &&) 比较常量,则发出警告
- - g++中的wsign -比较警告
- 抑制-同义比较警告
- 指向引用的指针的非空比较警告
- 针对比较警告的可能解决方法