MISRA C:2012 Rule 14.4

Выражение управления оператора if и выражение управления оператора цикла должны иметь по существу булев тип

Описание

Управляйте определением

Выражение управления оператора if и выражение управления оператора цикла должны иметь по существу булев тип

Объяснение

Строгий контроль типов требует выражения управления на if оператор или оператор цикла, чтобы иметь по существу булев тип.

Реализация Polyspace

Polyspace® не отмечает целочисленные константы, например, if(2).

Анализ распознает булевы типы, bool или _Bool (заданный в stdbool.h)

Можно также задать типы, которые являются чрезвычайно булевым использованием опции Effective boolean types (-boolean-types).

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <stdbool.h>
#include <stdlib.h>

#define TRUE = 1

typedef _Bool bool_t;
extern bool_t flag;

void foo(void){
    int *p = 1;
    int *q = 0;
    int i = 0;
    while(p){}           /* Non-compliant - p is a pointer */

    while(q != NULL){}   /* Compliant */

    while(TRUE){}        /* Compliant */

    while(flag){}        /* Compliant */

    if(i){}              /* Non-compliant - int32_t is not boolean */

    if(i != 0){}         /* Compliant */

    for(int i=-10; i;i++){}   /* Non-compliant - int32_t is not boolean */

    for(int i=0; i<10;i++){}  /* Compliant */
}

Этот пример показывает различные выражения управления в while, if, и for операторы.

Несовместимые операторы (первый while, if, и for примеры), используйте одну нелогическую переменную. Если вы используете одну переменную в качестве оператора управления, это должна быть по существу булевская переменная (линии 17 и 19). Булевы выражения также совместимы с MISRA®.

Проверяйте информацию

Группа: управляйте выражениями оператора
Категория: необходимый
Категория AGC: консультация