Предупреждение о разыменовании nullptr в C ++ - PullRequest
2 голосов
/ 27 января 2020
if (nullptr!=timing_info)
{
   timing_info->h = start_time;
}

Я получаю следующее предупреждение

autosar_cpp14 a5-1-1 violation
Using literal "NULL" other than type initialization, where symbolic names shall be used instead.

Правило автосар a5-1-1 гласит:

Правило A5-1-1 (требуется, реализация частично автоматизировано) Литеральные значения не должны использоваться отдельно от инициализации типа, в противном случае вместо символов должны использоваться имена c.

Я никогда не думал, что "nullptr" является буквальным значением. Если это буквальное значение, то как лучше всего обработать это предупреждение.

1 Ответ

1 голос
/ 28 января 2020

Как вы уже цитировали, Rule A5-1-1 говорит

Правило A5-1-1 (требуется, реализация, частично автоматизировано). Литеральные значения не должны использоваться отдельно от инициализации типа, в противном случае символ c имена должны использоваться вместо.

(источник)

Идея этого правила заключается в том, что вы не должны использовать magi c константы , т.е. не пишите что-то вроде

// 100 is a magic constant. It's not clear what the next line means without comments.
if (list.size() > 100) {
  std::cout << "error!";
} else {
  std::cout << "everything ok!";
}

, а пишите

static constexpr auto maximum_allowed_size = 100;
// The next line speaks for itself: "if list is bigger than allowed ..."
if (list.size() > maximum_allowed_size) {
  std::cout << "error!";
} else {
  std::cout << "everything ok!";
}

Эта дополнительная константа в большинстве случаев повышает читабельность. Поскольку nullptr является литералом , и вы используете этот литерал nullptr для чего-то другого, кроме "инициализации типа", ваш код нарушает это правило A5-1-1.

Я не Не знаю, намеренно ли autosar препятствует использованию литерала nullptr, лично я не вижу причины, по которой это нужно делать. Возможно, это было отслежено (должно быть исключением).

Вы можете перефразировать ваш код, чтобы отключить проверку:

if (timing_info)  // implicitly convert pointer to bool

, поскольку этот вариант, очевидно, делает проверку также несчастной, вот другой вариант:

if (!!timing_info)  // convert pointer to bool using double negation

Вы также можете использовать приведение, но я бы этого не делал. Честно говоря, мне больше всего нравится оригинальный вариант (if (nullptr != timing_info)).

...