Переполнение целых чисел со знаком
Целочисленное переполнение происходит, когда операция на целочисленных переменных может привести к значениям, которые не могут быть представлены типом данных результата. Тип данных переменной определяет количество байтов, выделенных для переменного устройства хранения данных, и ограничивает область значений позволенных значений.
Точное выделение ресурсов хранения для различных целочисленных типов зависит от вашего процессора. Смотрите Target processor type (-target)
.
Целочисленное переполнение на целых числах со знаком приводит к неопределенному поведению.
Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменные в переполняющемся расчете получают свои текущие значения. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Можно зафиксировать дефект:
Используя больший тип данных для результата операции так, чтобы все значения могли быть размещены.
Проверка значения, которые приводят к переполнению и выполнению соответствующей обработки ошибок.
Чтобы избежать переполнения в целом, попробуйте один из этих методов:
Сохраните значения целочисленной переменной ограниченными в половине области значений целых чисел со знаком.
В операциях, которые могут переполниться, проверяйте на условия, которые могут привести к переполнению, и реализация повторяются или поведение насыщения в зависимости от того, как результат операции используется. Результат затем становится предсказуемым и может безопасно использоваться в последующих расчетах.
Смотрите примеры мер ниже.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.
#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;
Чтобы определить размеры фундаментальных типов, Средство поиска Ошибки использует вашу спецификацию в 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 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.