提问人:Mikhail T. 提问时间:2/21/2023 更新时间:2/21/2023 访问量:204
如何阻止 clang 优化 tautological-undefined-compare?[复制]
How to stop clang from optimizing away tautological-undefined-compare? [duplicate]
问:
我正在处理旧代码,其中有很多行,例如:
EST_Item_Content *contents() const { return (this == 0) ? 0 : p_contents;}
在编译此类函数时,clang 警告:
warning: 'this' pointer cannot be null in well-defined C++ code; comparison may be assumed to always evaluate to false [-Wtautological-undefined-compare]
警告是正确的,但代码不是“定义明确的”,检查是必不可少的......
然而,很明显,检查正在被优化,代码在运行时崩溃。下面是 gdb-session 示例:
Program terminated with signal SIGSEGV, Segmentation fault.
Address not mapped to object.
#0 EST_Item::contents (this=0x0) at ../include/ling_class/EST_Item.h:238
238 EST_Item_Content *contents() const { return (this == 0) ? 0 : p_contents;}
(gdb) p this
$1 = (const EST_Item *) 0x0
在没有 的情况下构建时,检查仍然存在,并且代码多年来一直像以前一样工作。-O2
我如何告诉 clang 不要优化这些检查,它认为这是多余的?它必须有一些 -flag......-f
答:
3赞
user17732522
2/21/2023
#1
旗帜是 。不过,它特定于针对 null 的指针的此类检查。它不适用于所有同义比较。-fno-delete-null-pointer-checks
this
评论
0赞
Cody Gray - on strike
2/21/2023
Clang 是否支持该标志?据我所知,它仅适用于 GCC。
0赞
Mikhail T.
2/21/2023
谢谢!任何想法,哪个版本的 clang 添加了此功能 - 以及禁用它的标志?13?还是更早?
2赞
harold
2/21/2023
Clang 版本 7 添加了它
评论
this == 0
正如编译器所提到的,有点没用。它可能是由原作者编写的,以防止其他错误,这些错误应该得到妥善解决而不是解决。正如你从崩溃中看到的那样,它并没有真正的帮助。代码中的其他位置存在一个更大的问题,您需要修复。this
this == NULL