Предположения о логических переменных

Логические переменные заданы через _Bool ключевое слово в C (или bool макрос задан в stdbool.h) и bool ключевое слово на C++. Стандарт C (C99, Раздел 6.3.1.2) утверждает это, когда скалярное значение преобразовано в _Bool, результат 0, если значение равно 0; в противном случае результат равняется 1.

Предположения о логических переменных с неизвестными значениями

Code Prover придерживается технических требований стандарта C относительно Логических переменных. Например, анализ принимает, что, следуя за явными записями к Логической переменной из неизвестных источников, переменная может иметь значение 0 или 1.

Например, в этом примере, определении getFlag() неизвестно. После явного присвоения на переменную flag от getFlag() функция, переменная принята, чтобы иметь значение 0 или 1.

_Bool getFlag();
void main() {
    _Bool flag = getFlag(); //flag is 0 or 1
    //...
}

Случаи, где логические переменные могут иметь значения кроме 0 или 1

В некоторых случаях Code Prover не принимает значение 0 или 1 для Логической переменной. Вместо этого анализ принимает, что переменная может иметь полный спектр значений, позволенных базовым типом (в большинстве случаев, unsigned char).

Например:

  • Если Логической переменной является volatile, это может быть изменено, например, с помощью периферийных устройств с отображенной памятью. Code Prover не принимает значение 0 или 1 для volatile Логические переменные.

    _Bool func() {
        volatile _Bool flag; 
        //...
        return flag; //flag is in 0 .. 255
    }
  • Если Логическая переменная является частью объединения, это может быть изменено, например, путем изменения других членов объединения. Code Prover не принимает значение 0 или 1 для булевых членов объединения.

    typedef union U {
        int x;
        _Bool flag;
    } U;
    
    _Bool func() {
       U u;
       u.x = 11;
       return u.flag; //u.flag is in 0 .. 255
    }