Правило 14.4 MISRA C:2012

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

Описание

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

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

Объяснение

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

Реализация Polyspace

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

Если ваша настройка включает опцию -boolean-types, количество предупреждений может увеличиться или уменьшиться.

Обменивайтесь сообщениями в отчете

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

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

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

Примеры

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

#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: консультация
Язык: C90, C99