Операция может превысить точность логического операнда или привести к произвольному значению
Этот дефект возникает, когда вы используете логический операнд в арифметической, реляционной или побитовой операции и:
Логический операнд имеет представление trap. Размер логического типа в памяти составляет по крайней мере один адресуемый модуль (размер char). Логический тип требует только одного бита, чтобы представлять значение true (1) или false (0). Представление логического операнда в памяти содержит биты заполнения. Представление памяти может привести к значениям, которые не true или false, представление ловушки.
Результат операции может превысить точность логического операнда.
Для примера, в этом фрагменте кода:
bool_v >> 2 |
Если значение bool_v является true (1) или false (0), битовый сдвиг превышает однобитовую точность bool_v и всегда приводит к 0.
Если bool_v имеет представление trap, результатом операции является произвольное значение.
Возможная недопустимая операция с логическим операндом не вызывает дефекта, когда:
Операция не приводит к переполнению точности. Для образца, побитовых & или | операции с 0x01 или 0x00.
Логический операнд не может иметь представление trap. Для образца - постоянное выражение, которое приводит к 0 или 1, или сравнение, рассчитанное как true или false.
Арифметические, реляционные или побитовые операции над булевым операндом могут превысить точность операнда и вызвать неожиданные результаты при использовании в качестве логического значения. Операции над логическими операндами с представлениями trap могут вернуть произвольные значения.
Избегайте выполнения операций с логическими операндами, отличными от этих операций:
Операция назначения (=).
Операции по обеспечению равенства (== или !=).
Логические операции (&&, ||, или !).
| Группа: Численный |
| Язык: C | C++ |
| По умолчанию: Off |
Синтаксис командной строки
: INVALID_OPERATION_ON_BOOLEAN |
| Влияние: Низкое |
| ИДЕНТИФИКАТОР CWE : 190 |
Bitwise and arithmetic operation on the same data | Bitwise operation on negative value | Find defects (-checkers) | Integer conversion overflow | Integer overflow | Integer precision exceeded | MISRA C++:2008 Rule 4-5-2 | MISRA C:2004 Rule 12.6 | MISRA C:2012 Rule 10.1 | MISRA C:2012 Rule 12.2 | Shift of a negative value | Shift operation overflow | Unsigned integer conversion overflow | Unsigned integer overflow