繁体   English   中英

有没有办法为函数指针比较生成警告?

[英]Any way to generate warnings for function-pointer comparisons?

我花了很长时间才发现我的代码中有一个由/OPT:ICF触发的错误/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还是其他部分)可以分析我的代码并告诉我在哪里比较函数指针,就像在上面的代码中一样?

我不确定是否存在这样的编译器选项。

但是,有这样一个工具。 铛,整洁。 您可以编写自己的检查以进行铿锵,如果您关注此博客 ,这实际上非常容易。 具体来说,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);

或接近这种效果的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM