Что не так в следующем c коде? MISRA предупреждение о качестве - PullRequest
1 голос
/ 28 февраля 2020

Я получаю предупреждение MISRA QA C для следующего фрагмента кода. То есть «Значение выражения управления не является производным от явной логической операции».

Понятно, что без присвоения возвращаемого значения переменной оценка была сделана. Какова точная причина этого предупреждения о качестве?

file. c

if(fun1())
{    
//statement1    
}    
else    
{    
//statement2
}


bool fun1()
{    
  return (bool) (Global_variable1 && Global_Variable2)    
}

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

Ваш код имеет следующие нарушения 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, а также с сотрудники, которые должны поддерживать ваш код.

2 голосов
/ 28 февраля 2020

Вызов fun1() не является явным логическим выражением. Явная форма будет fun1() == true или fun1() != 0. Да, это кажется ненужным, но это то, на что жалуется предупреждение.

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