如何阻止 clang 优化 tautological-undefined-compare?[复制]

How to stop clang from optimizing away tautological-undefined-compare? [duplicate]

提问人:Mikhail T. 提问时间:2/21/2023 更新时间:2/21/2023 访问量:204

问:

我正在处理旧代码,其中有很多行,例如:

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

C++ clang 编译器优化 this-pointer

评论

0赞 Some programmer dude 2/21/2023
this == 0正如编译器所提到的,有点没用。它可能是由原作者编写的,以防止其他错误,这些错误应该得到妥善解决而不是解决。正如你从崩溃中看到的那样,它并没有真正的帮助。代码中的其他位置存在一个更大的问题,您需要修复。
1赞 Peter Cordes 2/21/2023
@Someprogrammerdude:或者它是由某个人编写的,他认为指针只是结构指针的语法糖,对它们不是 NULL 没有任意限制。有时,编写代码来检查被调用方而不是每个调用方的 NULL 特殊情况会很方便。在 C++ 中,这意味着您必须显式传递指向自由函数的指针,而不是使用成员函数。如果你不知道这一点,你可以无论如何将这样的函数设为成员函数,并为 .thisthis == NULL
2赞 Retired Ninja 2/21/2023
@Someprogrammerdude 作为一个继承了几个 >100k LOC 项目的人,我可以说有一个梦想,你可以解决所有问题,而现实有时却做不到。看到更多这样的情况让我很难过,但知道别人和我一起受苦也有点安慰。;)
1赞 Peter Cordes 2/21/2023
TL:DR:由于没有虚拟成员,AFAIK不只是工作的唯一原因是因为ISO C++这么说。(这是一个有效的设计选择,程序员应该注意;我只是说我可以看到它是如何发生的,考虑到 C++ 标准的实际编写方式,这并不是一个好主意。

答:

3赞 user17732522 2/21/2023 #1

旗帜是 。不过,它特定于针对 null 的指针的此类检查。它不适用于所有同义比较。-fno-delete-null-pointer-checksthis

评论

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 添加了它