Операция с помощью целочисленного размера вместо точности может вызвать неопределенное поведение
Этот дефект происходит, когда целое выражение использует целочисленный размер в операции, которая превышает целочисленную точность. На некоторых архитектурах размер целого числа в памяти может включать дополнительные биты и знак. На этих архитектурах целочисленный размер больше, чем точность, которая является только количеством битов, которые представляют значение целого числа.
Используя размер целого числа в операции на целочисленной точности может привести к целочисленному переполнению, повториться, или неожиданные результаты. Например, беззнаковое целое может храниться в памяти в 64 битах, но использует только 48 битов, чтобы представлять его значение. Операция сдвига влево на 56 битов на этом целом числе является неопределенным поведением.
Предположение, что размер целого числа равен своей точности, может также привести к проблемам мобильности программы между различными архитектурами.
Не используйте размер целого числа вместо его точности. Чтобы определить целочисленную точность, реализуйте стандартную программу расчета точности или используйте встроенную функцию, такую как __builtin_popcount()
.
Группа: числовой |
Язык: C | C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
INT_PRECISION_EXCEEDED |
Удар: низко |
ID 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