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