c++ - 在空指针上使用 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())
解决方案
空指针常量转换为任何指针类型,产生该指针类型的空指针值。因此,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()
不能静态转换为指针)。
因此,引用的演员表格式不正确。
推荐阅读
- r - 如何使用 get_elev_point 同时访问多个高程点
- mongodb - 具有重复键错误的 mongorestore 非常慢
- python - Django Whitenoise 导致收集静态错误
- asp.net-core - “dotnet new angular”应用程序中的脚手架身份出现错误
- android - 在 API 30 中为 resolveActivity 写入清单的意图操作
- react-native - 如何在本机反应中使用嵌套导航堆栈
- kubernetes - 如何使用 index.html 中的自定义文本在 nginx 上创建部署?
- json - 我如何能够比较两组 JSON 数据并检查一组是否在另一组中
- javascript - Async/Await:推理与实现
- javascript - 如何在javascript中将特定格式的日期转换为yyyy-mm-dd格式