Ваш код имеет следующие нарушения MISRA- C: 2012:
Правило 8.2 Функции должны быть в формате прототипа с именованными параметрами.
Правило 8.4 Совместимое объявление должно быть видимым, когда определен объект или функция с внешней связью ".
Правило 17.3 Функция не должна объявляться неявно
Я ожидаю, что совместимый инструмент выдаст хотя бы одну из вышеуказанных ошибок. Кроме того, совместимый компилятор C99 или новее не будет компилировать код с неявными функциями / неявным int.
Ни одна из этих проблем не имеет ни малейшего отношения к логическим значениям. В частности, MISRA- C не имеет правила "значение управляющего выражения не получено из явного операция ". Соответствующим правилом MISRA- C является
Правило 14.4 Управляющее выражение оператора if
/ - / должно иметь по существу логический тип .
В МИ SRA- C: 2004 это правило называется 13.2 и тогда было просто рекомендательным. Это было в значительной степени идентичное правило.
Что отличается в MISRA- C: 2012 в том, что они явно упоминают, что инструмент должен иметь некоторые средства для настройки того, какой тип должен восприниматься как "по сути булевский" (называемый «эффективно Boolean» в 2004 г.), если вы не используете тип bool C99.
Если ваш инструмент не знает, какой тип считать по существу логическим, он будет обрабатывать ваш C90 как домашний bool
как int
. И тогда он будет думать, что оператор if
использует int
, что было бы нарушением правила.
Кроме того, функции C90, которые не имеют видимого предварительного объявления функции, неявно предполагают, что функция возвращает int
. Но из-за 3 упомянутых выше правил, средство проверки MISRA- C никогда не должно пропускать такой код.
Решение для исправления указанной ошибки c:
- Спросите своего поставщика инструмента, как настроить инструмент так, чтобы он знал, какой тип следует рассматривать как «по сути логический».
- Либо исправьте код на
if(fun()==true)
, но вам действительно не нужно делать это только для соответствия требованиям MISRA.
Решение для получения MISRA- C: 2004 / MISRA- C: 2012 совместимый код:
bool fun1 (void); /* you must declare the function before using it and it must use void */
...
if(fun1())
{
/*statement1*/ /* Note that you can't use // comments in C90 or MISRA-C:2004 */
}
else
{
/*statement2*/
}
...
bool fun1 (void) /* must use void */
{
/* return is not a controlling expression, no need for compound statements.
No need to cast, the result of && is essentially boolean.
MISRA-C:2004 has no requirement to cast to underlying type if using booleans.
*/
return Global_variable1 && Global_Variable2;
}
Обратите внимание, что использование глобальных переменных может привести к возникновению проблем с другими правилами MISRA- C, а также с сотрудники, которые должны поддерживать ваш код.