Операция с использованием целочисленного размера вместо точности может вызвать неопределенное поведение
Этот дефект возникает, когда целочисленное выражение использует целочисленный размер в операции, которая превышает целочисленную точность. В некоторых архитектурах размер целого числа в памяти может включать биты со знаком и заполнением. На этих архитектурах целочисленный размер больше точности, которая является просто количеством бит, которые представляют значение целого числа.
Использование размера целого числа в операции с целочисленной точностью может привести к целочисленному переполнению, переносу или неожиданным результатам. Для образца беззнаковое целое число может храниться в памяти в 64 битах, но использует только 48 битов, чтобы представлять его значение. Операция с 56 битами левого сдвига для этого целого числа является неопределенным поведением.
Предположение, что размер целого числа равен его точности, также может привести к проблемам переносимости программы между различными архитектурами.
Не используйте размер целого числа вместо его точности. Чтобы определить целочисленную точность, реализуйте стандартную программу точных расчетов или используйте функцию builtin, такую как __builtin_popcount()
.
Группа: Численный |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: INT_PRECISION_EXCEEDED |
Влияние: Низкое |
ИДЕНТИФИКАТОР CWE : 190 |
Bitwise operation on negative value
| Find defects (-checkers)
| Integer conversion overflow
| Integer overflow
| MISRA C:2012 Rule 10.1
| MISRA C:2012 Rule 10.2
| Possible invalid operation on boolean operand
| Shift of a negative value
| Shift operation overflow
| Unsigned integer conversion overflow
| Unsigned integer overflow