static_cast 用于空指针时,这里的成语是什么?

What is the idiom here when static_cast is used on null pointer?

静态分析将此代码标记为 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,但在技术上仍然没有标准保证结果地址是预期的地址。

Is there any difference between what's shown and the less eclectic direct cast:

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

是的,有区别。在整数表达式中,只有值为 0 的编译时常量纯右值可转换为指针类型。 0 以外的值和 p_row_fields->offsets.back() 等左值不能 static-casted 指向指针。

因此,引用的演员表是 ill-formed。