Meh*_*dad 29 c c++ function-pointers compiler-warnings comdat-folding
我花了很长时间才发现我的代码中有一个错误被触发/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; }
Run Code Online (Sandbox Code Playgroud)
我试过-Wall
,-Wextra
,-Weverything
,-pedantic
,等,但他们没有产生警告.
是否有任何编译器选项或工具(无论是Visual C++,GCC,Clang还是其他部分)可以分析我的代码并告诉我在哪里比较函数指针,就像在上面的代码中一样?
是否有任何编译器选项或工具(无论是视觉C++的一部分,GCC,铛,或其他),可以分析我的代码,并告诉我在哪里,我在上面的代码比较函数指针对方,什么样的?
我不确定是否存在这样的编译器选项.
但是,有这样一个工具.铛,整洁.您可以编写自己的检查以进行铿锵,如果您关注此博客,这实际上非常容易.具体来说,AST已经有一堆匹配器,它们应该处理你想要的用例.
这样的东西似乎有效:
binaryOperator(
anyOf(hasOperatorName("=="), hasOperatorName("!=")),
hasLHS(ignoringImpCasts(declRefExpr(hasType(functionType())))),
hasRHS(ignoringImpCasts(declRefExpr(hasType(functionType())))))
Run Code Online (Sandbox Code Playgroud)
哪个标志着OP中的例子:
fp.cxx:3:25: note: "root" binds here
int main(void) { return test1 == test2; }
^~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
这适用于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);
Run Code Online (Sandbox Code Playgroud)
或接近这种效果的东西.
归档时间: |
|
查看次数: |
800 次 |
最近记录: |