【发布时间】:2020-10-16 17:34:44
【问题描述】:
静态分析将此代码标记为 nullPointerArithmetic:
static_cast<BYTE*>(NULL) + p_row_fields->offsets.back(), // field offset
其中 NULL 定义为 #define NULL 0
而offsets通过typedef解析为std::vector<int>
有问题的行作为 BYTE* 参数传递给方法调用。
我的问题是 - 这个成语的目的是什么?
所展示的和不那么折衷的直接演员有什么区别:
static_cast<BYTE*>(p_row_fields->offsets.back())
【问题讨论】:
-
没有看到相邻的代码,没有真正的方法来解释作者的意图。不能到达边界的指针的 IIRC 算术要么是未定义的行为,要么是未指定的,因此这种空指针算术无论如何都是无效的。旁注:您不能将
static_cast和int指向指针类型——这需要reinterpret_cast。您只能将static_castnullptr或文字0指向指针。 -
原始表达式(将整数添加到 nullptr)是未定义行为,除非整数为 0。
-
@1201ProgramAlarm 好的,我误解了;所以这不仅仅是误报,而是真正未定义 - 你能提供更具体的参考吗?
-
这可能是
offsetof的用户编写实现。如果是这样,这个问题说明了为什么offsetof在标准库中。
标签: c++ null pointer-arithmetic static-cast