Эта конструкция кажется совершенно безопасной в том смысле, что условие и решение о вызове функции напрямую связаны, где намерение состоит в том, чтобы не разыменовывать указатель NULL. Я понимаю, что утверждение if было бы более понятным, но было бы интересно, если у кого-то есть дальнейшее понимание.
MISRA пытается определить правила, которые можно интерпретировать, не угадывая намерения программиста. Так что да, представленная вами конструкция хороша, если намеренно избегать вызова функции в случае, когда указатель равен NULL, но машина, выполняющая MISRA-анализ этого кода, не обязательно распознает эту вероятность. Правило в первую очередь направлено на условные операторы, в которых два операнда &&
или ||
не связаны напрямую. Отказ от описанного вами случая является побочным ущербом.
Конечно, вы можете заменить ваш случай на
if (fp != NULL) {
(*fp)(0);
}
. Лично я нахожу оператор if
более понятным, чем исходное выражение выражения. Это не такой явный вызов, когда выражение, такое как ваше оригинальное, появляется в условии оператора if
, while
или for
, но все они могут быть реструктурированы в соответствии с MISRA.