MISRA 13.5 вопрос о некомпилированном примере - PullRequest
0 голосов
/ 09 января 2019

Попытка понять несоответствующий пример Правила 13.5.

Правило 13.5 MISRA-2012 гласит: «Правый операнд логического оператора && или || не должен содержать постоянных побочных эффектов« При обосновании »... побочные эффекты могут возникать или не возникать, которые могут противоречить ожидания программиста. " Я понимаю и полностью согласен с этим. Однако последний пример несоответствующего кода:

/* Non-compliant if fp points to a function with persistent side effects */ 

( fp != NULL ) && ( *fp ) ( 0 );

Эта конструкция кажется совершенно безопасной в том смысле, что условие и решение о вызове функции напрямую связаны, где намерение состоит в том, чтобы не разыменовывать указатель NULL. Я понимаю, что утверждение if было бы более понятным, но было бы интересно, если у кого-то есть дальнейшее понимание.

1 Ответ

0 голосов
/ 09 января 2019

Эта конструкция кажется совершенно безопасной в том смысле, что условие и решение о вызове функции напрямую связаны, где намерение состоит в том, чтобы не разыменовывать указатель NULL. Я понимаю, что утверждение if было бы более понятным, но было бы интересно, если у кого-то есть дальнейшее понимание.

MISRA пытается определить правила, которые можно интерпретировать, не угадывая намерения программиста. Так что да, представленная вами конструкция хороша, если намеренно избегать вызова функции в случае, когда указатель равен NULL, но машина, выполняющая MISRA-анализ этого кода, не обязательно распознает эту вероятность. Правило в первую очередь направлено на условные операторы, в которых два операнда && или || не связаны напрямую. Отказ от описанного вами случая является побочным ущербом.

Конечно, вы можете заменить ваш случай на

if (fp != NULL) {
    (*fp)(0);
}

. Лично я нахожу оператор if более понятным, чем исходное выражение выражения. Это не такой явный вызов, когда выражение, такое как ваше оригинальное, появляется в условии оператора if, while или for, но все они могут быть реструктурированы в соответствии с MISRA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...