问题描述
静态分析将该代码标记为nullPointerarithmetic:
static_cast<BYTE*>(NULL) + p_row_fields->offsets.back(),// field offset
其中NULL定义为#define NULL 0
并通过typedef将偏移量解析为std::vector<int>
我的问题是-这个成语的目的是什么?
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()
之类的左值静态转换为指针。
因此,引用的演员表格式错误。