首页 > 解决方案 > 在空指针上使用 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())

标签: c++nullpointer-arithmeticstatic-cast

解决方案


空指针常量转换为任何指针类型,产生该指针类型的空指针值。因此,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 的编译时常量纯右值可转换为指针类型。0 以外的值和左值(如p_row_fields->offsets.back()不能静态转换为指针)。

因此,引用的演员表格式不正确。


推荐阅读