Как сделать код C для соответствия MISRA C: 2012? - PullRequest
0 голосов
/ 08 января 2019

Я проверяю стандарт MISRA C: 2012 для своего кода MCU, используя PC-Lint. Я получил следующие ошибки. Здесь я разместил пример кода, где я получил ошибки в операторах условия.

1] целочисленный литерал без знака без суффикса 'U' [MISRA 2012, правило 7.2, обязательно] S_LCB_100,

2] побочные эффекты на правой руке логического оператора, '&&' [MISRA 2012, правило 13.5, обязательно] while ((0x00000000! = List [Loop]) && (0! = Counter))

3]: значение со знаком и значение без знака не могут использоваться вместе как операнды! = [Требуется MISRA 2012, правило 10.4] while ((0x00000000! = List [Loop]) && (0! = Counter))

4]: значение со знаком и значение без знака нельзя использовать вместе как операнды! = [MISRA 2012, правило 10.4, обязательно] while ((0x00000000! = List [Loop]) && (0! = Counter))

5] значение без знака и значение со знаком нельзя использовать вместе как операнды для == [Требуется правило 10.4 MISRA 2012] if (List [Loop] == 0x00000000)

Как мне обеспечить соответствие требованиям MISRA C: 2012?

typedef unsigned char UINT8;
typedef unsigned char BYTE;  
typedef unsigned long int UINT32; 
#define S_LCB_100 0xF0BB12DE;
#define MULTI 0x1A;
volatile static BYTE Counter = 0;
static UINT8 Loop = 0;    
static UINT32 List[]=  
{
    S_LCB_100,
    0x00000000,
};
while(( 0x00000000 != List[Loop] ) && ( 0 != Counter ))
{
 .......some code
}
if ( List[Loop] == 0x00000000 )
{
.....some code
} 

1 Ответ

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

Общие замечания:

  • Прежде чем беспокоиться о соответствии MISRA-C, получите код для компиляции на компиляторе C.
  • Затем убедитесь, что у вас есть документ MISRA-C: 2012, или вы просто не можете работать с MISRA.
  • Избавьтесь от чепухи типа "условия йоды".
  • Избавьтесь от пользовательских typedefs и используйте stdint.h. Если вы находитесь на C90, тогда typedef с именами, используемыми stdint.h.

1] целочисленный литерал без знака без суффикса 'U' [MISRA 2012, правило 7.2, обязательно] S_LCB_100,

Довольно понятно. Добавьте U или u к целочисленным константам, которые должны быть без знака. Подробности читайте в правиле 7.2.

2] побочные эффекты в правой части логического оператора, '&&' [MISRA 2012, правило 13.5, обязательно] while ((0x00000000! = List [Loop]) && (0! = Counter))

Counter квалифицирован как вольтильный, и доступ к нему является побочным эффектом. Так что он не должен существовать внутри сложных выражений в целом, и особенно не в правой части логического выражения && - это довольно сомнительный код. В этом случае вы можете просто переписать код следующим образом:

uint32_t count = (uint32_t)Counter;

while((count != 0u) && (List[Loop] != 0u))
{
  ...
  count = (uint32_t)Counter; // read volatile variable in an expression of its own
}

3] значение со знаком и значение без знака нельзя использовать вместе как операнды для! = [Требуется правило 10.4 MISRA 2012] while ((0x00000000! = List [Loop]) && (0! = Counter))

Это потому, что Counter объявлено как BYTE. Отбросьте все подобные виды домашнего приготовления и объявите вместо этого uint8_t. Затем используйте форму while, как показано выше. Используйте суффикс u. Это должно исправить 2) до 5).

...