在null指针上使用static_cast时,这里的惯用法是什么?

问题描述

静态分析将该代码标记为nullPointerarithmetic:

static_cast<BYTE*>(NULL) + p_row_fields->offsets.back(),// field offset

其中NULL定义为#define NULL 0 并通过typedef将偏移量解析为std::vector<int>

有问题的行作为BYTE *参数传递给方法调用

我的问题是-这个成语的目的是什么?

显示内容与折衷程度较低的直接演员表之间是否有任何区别:

static_cast<BYTE*>(p_row_fields->offsets.back())

解决方法

空指针常量将转换为任何指针类型,从而导致该指针类型的空指针值。因此,static_cast<BYTE*>(NULL)产生类型为BYTE*的空指针。这种转换也隐式起作用。

严格来说,标准没有定义指针运算在null上的行为,因为(或假设)在null地址上没有数组。

就假定编译器允许的实际行为而言,人们可能希望它的行为与:

reinterpret_cast<Byte*>(
    static_cast<std::intptr_t>(
        p_row_fields->offsets.back()
    )
)

虽然这不是UB,但从技术上讲,仍然没有标准的保证来保证结果的地址是预期的。

显示的内容与折衷程度较低的直接演员表之间是否有任何区别:

static_cast<BYTE*>(p_row_fields->offsets.back())

是的,有区别。在整数表达式中,只有值为0的编译时常数prvalue才能转换为指针类型。不能将0以外的值和p_row_fields->offsets.back()之类的左值静态转换为指针。

因此,引用的演员表格式错误。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...