Переполнение подписанных целых чисел
Переполнение подписанных целых чисел. [1 ]
Эта проверка проверяет наличие следующих проблем:
Переполнение целого числа.
Переполнение целочисленной константы.
Переполнение целого числа происходит, когда операция с целочисленными переменными может привести к значениям, которые не могут быть представлены типом данных результата. Тип данных переменной определяет количество байтов, выделенных для хранения переменной, и ограничивает диапазон допустимых значений.
Точное распределение ресурсов хранения для различных целочисленных типов зависит от процессора. Посмотрите Target processor type (-target).
Переполнение целочисленных чисел со знаком приводит к неопределенному поведению.
Исправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Этот список событий используется для определения того, как переменные в вычислениях переполнения получают свои текущие значения. Исправление может быть реализовано для любого события в последовательности. Если сведения о результатах не отображают историю событий, можно выполнить обратную трассировку, щелкнув правой кнопкой мыши параметры в исходном коде и просмотреть предыдущие связанные события. См. также раздел Интерпретация результатов поиска ошибок в интерфейсе пользователя Polyspace Desktop.
Устранить дефект можно путем:
Использование большего типа данных для результата операции для согласования всех значений.
Проверка значений, которые приводят к переполнению, и выполнение соответствующей обработки ошибок.
Чтобы избежать переполнения в целом, попробуйте один из следующих методов:
Храните целочисленные значения переменных в пределах половины диапазона целых чисел со знаком.
В операциях, которые могут переполняться, проверьте условия, которые могут привести к переполнению, и реализуйте поведение обхода или насыщения в зависимости от того, как используется результат операции. Затем результат становится предсказуемым и может быть безопасно использован в последующих вычислениях.
См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
#include <limits.h>
int plusplus(void) {
int var = INT_MAX;
var++;
return var;
}В третьем операторе этой функции переменная var увеличивают на единицу. Но ценность var является максимальным целым значением, поэтому int не может представлять единицу плюс максимальное целое значение.
Одной из возможных корректировок является изменение типов данных. Сохранить результат операции в большем типе данных (Обратите внимание, что на 32-разрядном компьютере, int и long имеет одинаковый размер). В этом примере, на 32-разрядной машине, возвращая long long вместо int, ошибка переполнения исправлена.
#include <limits.h>
long long plusplus(void) {
long long lvar = INT_MAX;
lvar++;
return lvar;
}Переполнение целочисленной константы происходит при назначении константы времени компиляции целочисленной переменной со знаком, тип данных которой не может соответствовать значению. Один n-разрядное целое число со знаком содержит значения в диапазоне [-2.n-1, 2n-1-1]
Например, c является 8-битной подписью char переменная, которая не может содержать значение 255.
signed char c = 255;
Чтобы определить размеры фундаментальных типов, Bug Finder использует вашу спецификацию для Target processor type (-target).
Поведение по умолчанию для постоянных переполнений может варьироваться между компиляторами и платформами. Сохранение постоянных переполнений может снизить переносимость кода.
Даже если компиляторы обтекают переполненные константы предупреждением, поведение обтекания может быть непреднамеренным и привести к неожиданным результатам.
Проверьте, соответствует ли постоянное значение предполагаемому значению. Если значение является правильным, используйте другой, возможно более широкий тип данных для переменной.
#define MAX_UNSIGNED_CHAR 255 #define MAX_SIGNED_CHAR 127 void main() { char c1 = MAX_UNSIGNED_CHAR; char c2 = MAX_SIGNED_CHAR+1; }
В этом примере дефект появляется на макросах, поскольку по крайней мере одно использование макроса вызывает переполнение. Для воспроизведения этих дефектов используйте опцию анализа Target processor type (-target) где char подписан по умолчанию.
Одной из возможных корректировок является использование другого типа данных для переменных, перетекающих.
#define MAX_UNSIGNED_CHAR 255
#define MAX_SIGNED_CHAR 127
void main() {
unsigned char c1 = MAX_UNSIGNED_CHAR;
unsigned char c2 = MAX_SIGNED_CHAR+1;
}| Разрешимость: неразрешимая |
[1] Выдержки из стандарта «ISO/IEC TS 17961 Technical Specification - 2013-11-15» воспроизводятся с согласия AFNOR. Нормативную ценность имеет только оригинальный и полный текст стандарта, опубликованный изданиями AFNOR - доступный через веб-сайт www.boutique.afnor.org.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.