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