Операция может превысить точность логического операнда или привести к произвольному значению
Этот дефект возникает, когда вы используете логический операнд в арифметической, реляционной или побитовой операции и:
Логический операнд имеет представление 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