MISRA 2012 Правило 14.2 - PullRequest
       25

MISRA 2012 Правило 14.2

0 голосов
/ 05 июня 2018

У меня есть вопрос, связанный с правилом 14.2 MISRA 2012 года «Цикл for должен быть правильно сформирован»

Рассмотрим пример кода:

int foo (int *ptr)
{
    (*ptr)--;
     return *ptr;
}

void main()
{
    int a =20;
    int i;
    for (i=0; i< foo(&a) ; i++)
    {
         /*
         <loop body>
         */       
    }
}

Здесь для строки for (i=0; i< foo(&a) ; i++) IЯ получаю нарушение MISRA, 14.2.Вопрос в том, когда мы модифицируем переменную (a), присутствующую в условии цикла (i

Это просто пример для 14.2. Пожалуйста, не сосредотачивайтесь на бесконечности цикла в приведенном выше примере кода.


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

Пример: -

 bool_t flag = false;
    for ( int16_t i = 0; ( i < 5 ) && !flag; i++ )
    {
    if ( C )
    {
    flag = true; /* Compliant - allows early termination
    * of loop */
    }
    i = i + 3; /* Non-compliant - altering the loop
    * counter */
    }

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Обоснование правила 14.2 показывает, что это правило предназначено для ограничения циклов for, прекращения «умного» использования и, следовательно, облегчения анализа и анализа кода ...

У меня есть простое правило:

  • Если у вас есть заранее определенное количество итераций, используйте for loop
  • Если у вас нет предварительно определенного количества итераций, используйте while ... do loop

Предполагая, что foo(&a) is не возвращает константу, было бы лучше использовать while ... do loop:

int a = 20;
int i = 0;

while ( i < foo(&a) )
{
  // Loop body
  ...
  ++i;
}

Примечание: см. Профиль для отказа от ответственности.

0 голосов
/ 05 июня 2018

Ваш пример кода нарушает указанное в кавычках правило (первый маркер), потому что
имеет побочные эффекты (или компилятор не может сказать, из-за вызова функции с прототипом, который позволил бы такие побочные эффекты - и, возможно, имеетхотя бы один).

Ваш пример может нарушать цитируемое правило (третий маркер), если (побочные) эффекты условия продолжения цикла (i< foo(&a)) считаются (вашим конкретным анализатором MISRA) как часть"тела петли".(Я бы не стал, но ваш инструмент мог бы.)

Таким образом, показанный вами код нарушает правило от одного до двух раз.

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