首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么方法可以为函数指针比较生成警告吗?

有什么方法可以为函数指针比较生成警告吗?
EN

Stack Overflow用户
提问于 2018-01-29 05:08:37
回答 1查看 902关注 0票数 29

我花了很长时间才找到我的代码中有一个错误是由/OPT:ICF触发的

因为/OPT:ICF可以使相同的地址分配给不同的函数或只读数据成员(使用/Gy编译的const变量),所以它可以中断依赖于函数的唯一地址或只读数据成员的程序。

(我一直在存储和比较函数指针的相等性,当链接器丢弃相同的函数时,这个指针就会中断)。

现在我需要找到我可能做过这种事的每一个地方。

测试用例当然是微不足道的:

代码语言:javascript
复制
//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或其他工具的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-30 17:06:18

是否有任何编译器选项或工具(无论是VisualC++、GCC、Clang或其他的一部分)可以分析我的代码并告诉我在哪里比较函数指针,就像上面的代码一样?

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

然而,有这样一个工具。咯咯-整齐。您可以自己编写clang支票,如果您遵循这个博客,这实际上是非常容易的。具体来说,AST已经有了一堆匹配器,它们应该处理所需的用例。

像这样的事情似乎很有效:

代码语言:javascript
复制
binaryOperator(
    anyOf(hasOperatorName("=="), hasOperatorName("!=")),
    hasLHS(ignoringImpCasts(declRefExpr(hasType(functionType())))),
    hasRHS(ignoringImpCasts(declRefExpr(hasType(functionType())))))

它标记OP中的示例:

代码语言:javascript
复制
fp.cxx:3:25: note: "root" binds here
int main(void) { return test1 == test2; }
                        ^~~~~~~~~~~~~~

这特别适用于OP情况,但实际上您必须更明确地匹配所有其他可能的情况:

代码语言:javascript
复制
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);

或者接近这种效果的东西。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48494733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档