我花了很长时间才找到我的代码中有一个错误是由/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等,但它们都没有生成警告。
是否有任何编译器选项或工具(不管是VisualC++、GCC、Clang或其他工具的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?
发布于 2018-01-30 17:06:18
是否有任何编译器选项或工具(无论是VisualC++、GCC、Clang或其他的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?
我不确定是否存在这样的编译器选项。
然而,有这样一个工具。咯咯-整齐。您可以自己编写clang支票,如果您遵循这个博客,这实际上是非常容易的。具体来说,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);或者接近这种效果的东西。
https://stackoverflow.com/questions/48494733
复制相似问题