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

栏目: C · 发布时间: 5年前

内容简介:对NULL进行基于文本的搜索.然后在警告模式下运行编译器并在纸上打印出所有警告(如果您仍然使用此类技术).现在对于每个null,它是一个有问题的null还是一个好的?如果有问题,请将其重命名为XNULL.

我有一个非常古老的(和巨大的)Win32项目,通过转换指针取消引用指针,使用NULL指针进行大量检查.像这样:

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

是的,我知道这段代码很愚蠢,需要重构.但由于代码量很大,这是不可能的.现在我需要在Xcode的MacOS Sierra下编译这个项目,这会导致很大的问题…事实证明,在发布模式下(使用代码优化),条件以不正确的行为执行(因为解除引用NULL而被称为未定义的行为指针).

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

UPDATE.检查问题的真实工作示例.

//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进行基于文本的搜索.

然后在警告模式下运行编译器并在纸上打印出所有警告(如果您仍然使用此类技术).

现在对于每个null,它是一个有问题的null还是一个好的?如果有问题,请将其重命名为XNULL.

现在很可能C安检在一个小型系统上失败了,比如安装了640k,因为640k对任何人来说都足够了,但对于你的现有系统来说却不行.因此,只要重新标记就将它们剥离出来.如果不是这样的话.使XNULL成为具有C眼中有效地址的“虚拟对象”.

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

翻译自:https://stackoverflow.com/questions/40927937/force-allow-dereference-of-null-pointer


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据挖掘十大算法

数据挖掘十大算法

(美)吴信东(Xindong Wu)、(美),库玛尔 ,(Vipin Kumar) / 李文波、吴素研 / 清华大学出版社 / 2013-5 / 39.00元

《世界著名计算机教材精选:数据挖掘十大算法》详细介绍了在实际中用途最广、影响最大的十种数据挖掘算法,这十种算法是数据挖掘领域的顶级专家进行投票筛选的,覆盖了分类、聚类、统计学习、关联分析和链接分析等重要的数据挖掘研究和发展主题。《世界著名计算机教材精选:数据挖掘十大算法》对每一种算法都进行了多个角度的深入剖析,包括算法历史、算法过程、算法特性、软件实现、前沿发展等,此外,在每章最后还给出了丰富的习......一起来看看 《数据挖掘十大算法》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具