gpt4 book ai didi

c++ - 强制允许取消引用 NULL 指针

转载 作者:可可西里 更新时间:2023-11-01 17:59:58 29 4
gpt4 key购买 nike

我有一个非常古老(且庞大)的 Win32 项目,该项目通过将取消引用的指针强制转换为指针来使用 NULL 指针进行大量检查。像这样:

int* x = NULL; //somewhere
//... code
if (NULL == &(*(int*)x) //somewhere else
return;

是的,我知道这段代码很愚蠢,需要重构。但由于代码量巨大,这是不可能的。现在我需要在 Xcode 的 MacOS Sierra 下编译这个项目,这会导致大问题......事实证明,在 Release模式下(通过代码优化)条件以不正确的行为执行(所谓的未定义行为,因为取消引用 NULL指针)。

根据 this document for GCC有一个选项-fno-delete-null-pointer-checks,但当启用 O1、O2 或 O3 优化时,它似乎不适用于 LLVM。所以问题是:如何强制 LLVM 8.0 编译器允许此类取消引用?

更新。检查问题的实际工作示例。

//somewhere 1
class carr
{
public:
carr(int length)
{
xarr = new void*[length];

for (int i = 0; i < length; i++)
xarr[i] = NULL;
}

//some other fields and methods

void** xarr;
int& operator[](int i)
{
return *(int*)xarr[i];
}
};

//somewhere 2
carr m(5);

bool something(int i)
{
int* el = &m[i];
if (el == NULL)
return FALSE; //executes in debug mode (no optimization)

//other code
return TRUE; //executes in release mode (optimization enabled)
}

-O0-O1 处,something keeps the null check ,代码“有效”:

something(int):                          # @something(int)
pushq %rax
movl %edi, %eax
movl $m, %edi
movl %eax, %esi
callq carr::operator[](int)
movb $1, %al
popq %rcx
retq

但是在 -O2 及以上,the check is optimized out :

something(int):                          # @something(int)
movb $1, %al
retq

最佳答案

对 NULL 进行基于文本的搜索。然后以警告模式运行编译器,将所有警告打印在纸上(如果你还有这种技术的话)。现在对于每个空值,它是有问题的空值还是好的空值?如果有问题,请将其重命名为 XNULL。

现在,C++ 检查可能会在安装了 640k 的小型系统上失败,因为 640k 对任何人来说都足够了,但在具有许多 GB 的现代系统上就不行了。所以只要重新贴上标签就把它们去掉。如果不是这样的话。使 XNULL 成为 C++ 眼中具有有效地址的“虚拟对象”。

(从这个例子来看,代码看起来像是一个 Lisp 解释器。Lisp 需要一个空指针和一个虚拟指针,没有其他简单的方法来编写解释器)。

关于c++ - 强制允许取消引用 NULL 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927937/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com