【发布时间】:2017-12-19 14:48:44
【问题描述】:
我在我的项目中使用 Renesas V850 系列微控制器。 我的产品使用与主程序部分分开的非易失性内存块(NVRam 块)位置。在运行期间,会监控这些 NVRam 块以验证它们没有损坏。这个检查是用类似于下面给出的代码完成的:
逻辑 1
if((NULL != pBlock_One_Pointer) && (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET)))
{
.....Do some corrective action....
}
此代码的问题是,如果指针“pBlock_One_Pointer”不知何故被值“NULL”损坏,则 Block_ID 检查(“if”语句的第二部分未完成)。
避免这种情况的一种方法是删除“if”条件的第一部分,它检查 Block_ID 而不管指针是否为“NULL”,如下所示
逻辑 2
if (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET))
但是如果“pBlock_One_Pointer”指向NULL,会不会引发异常?
所以基本上我有两个问题:
- 是否有可能由于运行时的某些损坏而导致指针变为 NULL 指针?
- 如果是这样,Logic 2 会帮助我克服它吗?
【问题讨论】:
-
您注意到格式问题了吗?编辑问题时,有一个方便的“预览”部分。
-
"pBlock_One_Pointer" 不知何故被值 "NULL" 破坏,因此 "Do some Corrective action"` 的
if()也应该接受NULL。示例if((NULL == pBlock_One_Pointer) || ... -
Re 1,如果您的代码包含导致其的错误,它可能只会错误地变为 NULL - 但是可能有 40 亿个其他值可能同样不正确,更有可能且未检查为了。真正的解决方案不是编写损坏数据的代码,那么您就无需检查是否损坏。想一想——你写了坏软件,所以你要写更多软件来检查坏软件的效果——这张图有什么问题!?
标签: c pointers embedded non-volatile