Что представляет собой целое переполнение?
Это часто задаваемые вопросы ответ был написан k4thryn:
Целое переполнения или целое упаковке, представляет собой потенциальную проблему в программу, исходя из того, что ценности, которые могут быть проведены в числовых данных ограничивается данным типом размер в байтах. ANSI C использует следующие минимальные размеры:
| Тип данных | Размер (байт) |
|---|---|
| символ | 1 |
| короткий | 2 |
| INT | 2 |
| длинный | 4 |
На практике, многие составители использования 4-байтовые Int. Следует также отметить, что фактические диапазоны для типов данных зависит от того, или нет они подписали. Например, подписанного 2-байтовые короткий период может быть -32767 и 32767, в то время как беззнаковое короткое может быть от 0 до 65535. Смотрите ваш [включая] / limits.h файл для конкретных номеров для компилятора.
Почему это должно заботить Вас? При попытке поставить значение в тип данных, которые слишком малы, чтобы провести его, высокого порядка бит упала, и только с низким бит хранится. Другими словами, это что-арифметических модулей производится по стоимости, прежде чем поместить его на хранение, убедитесь что он подходит в данных. Принимая наши неподписанными короткий пример:
| Ограничение: | 65535 или 1111 1111 1111 1111 |
| Слишком большой: | 65536 или 1 0000 0000 0000 0000 |
| Что хранится в: | 0 или 0000 0000 0000 0000 |
Как это делает очевидным, что результат, так как высокого порядка (или левой большинство) Немного о том, что стоимость слишком велика упала. Или вы могли бы сказать, что то, что хранится является результатом
= хранить ценности% (предел + 1) или 65536% (65535 + 1) = 0
В подписали данных, результат немного отличается, и результаты в некоторых, казалось бы, странное поведение:
| Позитивные ограничения: | 32767 или 0111 1111 1111 1111 |
| Слишком большой: | 32768 или 1000 0000 0000 0000 |
| Что хранится в: | -32768 |
Почему это? Это потому, что "2 в комплимент", которая заключается в том, как отрицательные числа представляются в двоичном виде. Чтобы сделать длинный рассказ словами, в первой половине этого диапазона (от 0 до 0111 1111 1111 1111) используется для положительных чисел в порядке наибольшей мере. во второй половине диапазона затем используется для отрицательных чисел в порядке наибольшей мере. таким негативным диапазон подписанного 2 байта -32768 является коротким путем -1, в этом порядке.
Вы по-прежнему просят, почему этот вопрос, не так ли? Пусть память выделяется основывается на неподписанный целочисленного типа данных значения. Если это имеет значение для оборачивания вокруг, может быть, слишком мало памяти, будут доступны. Или, если сравнить это время между подписанного целочисленное значение и некоторые другие номера, если предположить, что должен быть меньше последнего, если это имеет значение облета в отрицательной, то сравнение будет проходить. Но вещи, будем вести себя, как программист, предназначенных? Наверное, нет.
Дополнительные источники информации по Целое переполнений
Несмотря на то, что выходит за рамки данной статьи, Есть другие ресурсы, которые направляются на более подробно о целочисленного переполнения ошибок, их профилактике, а также их эксплуатации. Именно Есть две очень интересные статьи в Phrack # 60 (по одному на Одед Horovitz, и один blexim) на уязвимость целочисленного переполнения. Целая упаковка рассматривается также в "профессиональный аудит исходного кода" Презентация от 2002 США Черного Hat Брифинги (Dowd, и ALS).
Инструмент для эксперимента с целыми переполнений
Программа int_wrap.c позволяет играть вокруг этого поведения, указав в командной строке ли тип данных (короткие), должны быть подписаны или беззнаковое, и значение, которое вы хотите использовать.
Примечание: Perl, как представляется, имеют 250-значное число предел, и умирает с ошибкой "Число слишком долго" (версия 5.8.0, испытания). Тем не менее, количество значащих цифр гораздо меньше, чем это.
|
Уязвимость управления для чайников
Последние сообщения блога
- SourceForge против Freshmeat






