C-在嵌入式中删除无效指针



我在项目中正在使用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 check(如果没有完成"语句的第二部分)。

避免这种情况的一种方法是删除检查block_id的"如果"条件的第一部分,无论指针的指针是" null",或者不如下面给出的

所示。

逻辑2

if (BLOCK_ONE_ID != *(((const tUI8*)pBlock_One_Pointer) + ID_OFFSET))

但是,如果" pblock_one_pointer"指向null,是否会导致例外?

基本上我有2个问题:

  1. 由于运行时某些损坏,指针是否有可能变为零指针?
  2. 如果是这样,逻辑2 会帮助我克服它吗?

但是,如果" pblock_one_pointer"指向null,是否会导致例外?

它会导致不确定的行为。

per 6.5.3.2 C标准的地址和间接操作员

单元*操作员表示间接。如果操作数指向 一个函数,结果是功能指定器;如果指向 一个对象,结果是指定对象的lvalue。
如果操作数具有"指向 type "的类型,则结果具有 键入" type "。如果将无效的值分配给 指针,一单元*操作员的行为是 未定义。

so:

由于运行时某些损坏,指针是否有可能变为零指针?

是。可能。

如果是这样,Logic 2将帮助我克服它?

否。怎么可能?您要检查损坏的内存位置。

由于运行时某些损坏,指针是否有可能变为零指针?

是的,有几件事可能导致这一点。软件问题,例如指针错误,失控代码,堆栈溢出等。此外,由于数据保留,EMI(如今的可能性较小)或环境辐射/宇宙射线而导致内存硬件失败。

如果是这样,Logic 2将帮助我克服它?

否。有多种方法可以检测损坏的RAM,最常见的是CRC校验和。

要检测失败的内存硬件,还有其他方法,例如"步行模式",您可以通过定期向它们编写1和0循环单元格。但是,在现代嵌入式系统中,使用内置ECC的内存,因此该软件不必费心记忆硬件完整性。

最新更新