Как разрешить правила 13.2 и 13.3 MISRA C: 2012 для кода C? - PullRequest
0 голосов
/ 09 января 2019

У меня есть исходный код на C, и я делаю его совместимым с MISRA. Я получил следующие ошибки, связанные с MISRA 2012 Правило 13.3 и 13.2:

  1. операция увеличения / уменьшения в сочетании с другой операцией с побочными эффектами [Правило 13.3 MISRA 2012, рекомендация] buf [count ++] = U1RXREG;

  2. у обеих сторон есть побочные эффекты [MISRA 2012, правило 1.3, обязательно], [MISRA 2012, правило 13.2, обязательно] buf [count] = U1RXREG;

Исходный код задачи 1:

 void UART_call(void)
 {
    if(count < BUF_SIZE)
    {
        buf[count++] = U1RXREG;
        Flag = 1;
    }
    else
    {
        count = 0;
        Flag = 0;
    }
}

После устранения ошибки 13.3 из кода проблемы 1 я получаю ошибки MISRA 1.3 и 13.2. Исходный код для проблемы 2:

void UART_call(void)
 {
    if(count < BUF_SIZE)
    {
        buf[count] = U1RXREG;
        count = count + 1U;
        Flag = 1;
    }
    else
    {
        count = 0;
        Flag = 0;
    }
}

1 Ответ

0 голосов
/ 09 января 2019
  1. операция увеличения / уменьшения в сочетании с другой операцией с побочными эффектами [MISRA 2012, правило 13.3, рекомендация] buf [count ++] = U1RXREG;

Это, как вы, наверное, заметили, решается перемещением увеличения из выражения присваивания:

buf[count] = U1RXREG;
count++;

Основанием для этого является предотвращение написания ошибок, таких как buf[count++] = count;

  1. у обеих сторон есть побочные эффекты [MISRA 2012, правило 1.3, обязательно], [MISRA 2012, правило 13.2, обязательно] buf [count] = U1RXREG;

Я бы сказал, что это ложный позитив. Линия buf[count] = U1RXREG; безвредна.

Причина предупреждения заключается в том, что U1RXREG, очевидно, является регистром rx-регистра аппаратного обеспечения UART, и MISRA-C не любит смешивать энергозависимый доступ с другими вещами в одном и том же выражении, особенно не с другим ". «побочный эффект», в данном случае ++ отсчета вместе с присвоением buf. Это общий источник ложных срабатываний статических анализаторов, хотя иногда они находят реальные ошибки, связанные с этим, как в случае &&, о котором вы спрашивали о вчера .

Предполагая 32-разрядные регистры, педантичный способ исправить это - использовать временную переменную:

uint32_t rxreg = U1RXREG
buf[count] = rxreg;

Что касается машинного кода и поведения программы, то это эквивалентно исходному коду.

...