在嵌入式中取消引用NULL指针

问题描述 投票:2回答:2

我在我的项目中使用瑞萨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”语句的第2部分未完成)。

避免这种情况的一种方法是删除它检查Block_ID的“if”条件的第一部分,而不管指针是否为“NULL”,如下所示

逻辑2

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

但是如果“pBlock_One_Pointer”指向NULL,它会导致异常吗?

所以基本上我有两个问题:

  1. 由于运行期间的某些损坏,指针是否有可能成为NULL指针?
  2. 如果是这样,Logic 2会帮助我克服它吗?
c pointers embedded non-volatile
2个回答
2
投票

但是如果“pBlock_One_Pointer”指向NULL,它会导致异常吗?

它会导致未定义的行为。

每6.5.3.2 the C standard的地址和间接运算符:

一元*算子表示间接。如果操作数指向函数,则结果是函数指示符;如果它指向一个对象,则结果是指定该对象的左值。 如果操作数的类型为''指向类型'',则结果的类型为''type''。如果为指针指定了无效值,则unary *运算符的行为未定义。

所以:

由于运行期间的某些损坏,指针是否有可能成为NULL指针?

是。这是可能的。

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

不,怎么回事?您要检查损坏的内存的位置将丢失。


-1
投票

由于运行期间的某些损坏,指针是否有可能成为NULL指针?

是的,有几件事可能导致这种情况。软件问题,如指针错误,失控代码,堆栈溢出等。此外,由于数据保留,EMI(现在不太可能)或环境辐射/宇宙射线导致内存硬件出现故障。

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

没有。有办法检测损坏的RAM,最常见的是CRC校验和。

要检测故障存储器硬件,还有其他方法,例如“步行模式”,您可以通过以规则的间隔向它们写入1和0来循环单元。然而,在现代嵌入式系统中,使用内置ECC的内存,因此软件无需担心内存硬件完整性。

© www.soinside.com 2019 - 2024. All rights reserved.