Разыменование пустого указателя во встроенном

В своем проекте я использую микроконтроллер серии 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 (2-я часть инструкции "if" не выполнена).

Один из способов избежать этой ситуации - удалить первую часть условия "если", где он проверяет Block_ID независимо от указателя, равным "NULL" или нет, как указано ниже.

Логика 2

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

Но если "pBlock_One_Pointer" указывает на NULL, это вызовет исключение?

Так что в основном у меня есть 2 вопроса:

  1. Есть ли вероятность того, что указатель станет указателем NULL из-за некоторого повреждения во время выполнения?
  2. Если да, поможет ли мне Logic 2 преодолеть это?

2 ответа

Но если "pBlock_One_Pointer" указывает на NULL, это вызовет исключение?

Это вызывает неопределенное поведение.

Согласно 6.5.3.2 Операторы адреса и косвенности стандарта C:

Одинарный * Оператор обозначает косвенность. Если операнд указывает на функцию, результатом является обозначение функции; если он указывает на объект, результатом является lvalue, обозначающее объект.
Если операнд имеет тип "указатель на тип ", результат имеет тип " тип ". Если неверное значение было присвоено указателю, поведение унарного * Оператор не определен.

Так:

Есть ли вероятность того, что указатель станет указателем NULL из-за некоторого повреждения во время выполнения?

Да. Возможно.

Если да, поможет ли мне Logic 2 преодолеть это?

Нет. Как это могло? Расположение памяти, которую вы хотите проверить на наличие повреждений, потеряно.

Есть ли вероятность того, что указатель станет указателем NULL из-за некоторого повреждения во время выполнения?

Да, есть несколько вещей, которые могут вызвать это. Проблемы с программным обеспечением, такие как ошибки указателя, сбойный код, переполнение стека и т. Д. И, кроме того, сбой оборудования памяти из-за сохранения данных, EMI (в настоящее время менее вероятно) или окружающего излучения / космических лучей.

Если да, поможет ли мне Logic 2 преодолеть это?

Нет. Есть способы обнаружить поврежденную оперативную память, чаще всего контрольные суммы CRC.

Чтобы обнаружить неисправное оборудование памяти, существуют другие способы, такие как "шаблоны ходьбы", когда вы циклически изменяете ячейки, записывая в них 1 и 0 через регулярные интервалы. Однако в современных встраиваемых системах используется память со встроенным ECC, поэтому программному обеспечению не нужно беспокоиться о целостности аппаратной части памяти.

Другие вопросы по тегам