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®.

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

Группа: Выражения оператора управления
Категория: Требуемая
Категория СМЖЛ: Консультационная