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。
静态分析将此代码标记为 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。