3.1.3. Переполнение при арифметических операциях
3.1.3. Переполнение при арифметических операциях
Переполнением принято называть ситуацию, когда при операциях над переменной результат выходит за пределы ее диапазона. Рассмотрим следующий пример (листинг 3.4, проект Overflow1 на компакт-диске).
Листинг 3.4. Переполнение при вычитании
procedure TForm1.Button1Click(Sender: TObject);
var X: Byte;
begin
X:= 0;
X:= X — 1;
Label1.Caption:= IntToStr(X)
end;
Переменная X получит значение 255, поскольку при вычитании получается -1, что в беззнаковом формате соответствует 255. В принципе, этот пример практически эквивалентен примеру Assignment1, за исключением того, что значение -1 появляется в результате арифметических операций.
Немного изменим этот пример — заменим оператор вычитания функцией Dec (листинг 3.5, пример Overflow2 на компакт-диске).
Листинг 3.5. Переполнение при декременте
{$R+}
procedure TForm1.Button1Click(Sender: TObject);
var X: Byte;
begin
X:= 0;
Dec(X);
Label1.Caption:= IntToStr(X);
end;
Результат получается тот же (X получает значение 255), но обратите внимание: несмотря на то, что опция Range checking включена, исключение не возникает. Этим пример Overflow2 отличается от Overflow1 — там исключение возникнет. Связано это с тем, что переполнение при использовании Dec и подобных ей функций контролируется другой опцией — Overflow checking (в коде программы включается директивой {$Q+} или {$OVERFLOWCHECKS ON}). Эта опция по умолчанию тоже отключена и ее также рекомендуется включать при отладке. При ее включении в данном примере возникнет исключение EIntOverflow.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Переполнение переменной jiffies
Переполнение переменной jiffies Переменная jiffies, так же как и любое целое число языка программирования С, после достижения максимально возможного значения переполняется. Для 32-разрядного беззнакового целого числа максимальное значение равно 2??- 1. Поэтому перед тем как
Переполнение адреса
Переполнение адреса Так как мы решили не использовать на System/38 48-разрядный адрес повторно до следующей перезагрузки, встал вопрос о том, что однажды все доступные адреса могут быть исчерпаны. В поисках ответа на него, мы провели некоторые интересные подсчеты. В
14.2. Переполнение буфера
14.2. Переполнение буфера Это одна из самых популярных и в то же время наиболее сложная в использовании уязвимость. Для начала определимся, почему программисты допускают такие ошибки, при которых возможно выполнить переполнение буфера?В таких языках, как С++, для работы с
19.7.5. Подстановка команд и арифметических выражений
19.7.5. Подстановка команд и арифметических выражений В гл. 13 (п. 13.5) мы уже сталкивались с подстановкой команд. Тогда переменной DT присваивался результат выполнения команды date:DT=`date`Как я уже писал, при подстановке команд нужно использовать обратные одинарные кавычки (они
Переполнение буфера
Переполнение буфера Некоторые вирусы и атаки достигают цели без участия пользователя. Несмотря на усилия, интенсивность удаленных атак не снижается, а отражать их становится все труднее. Как это получается? Ведь чтобы программа, пусть и зловредная, что-то сделала, она
27. Отдавайте предпочтение каноническим формам арифметических операторов и операторов присваивания
27. Отдавайте предпочтение каноническим формам арифметических операторов и операторов присваивания РезюмеЕсли можно записать а+b, то необходимо, чтобы можно было записать и a+=b. При определении бинарных арифметических операторов одновременно предоставляйте и их
Переполнение и потеря значимости при обработке чисел с плавающей точкой
Переполнение и потеря значимости при обработке чисел с плавающей точкой Что произойдет, если значение переменной типа float выйдет за установленные границы? Например, предположим, что вы умножаете 10е38 на 100 (переполнение) или делите 10е - 37 на 1000 (потеря значимости).
10.6.1. Переполнение буфера
10.6.1. Переполнение буфера Почти псе основные Internet-демоны, включая демоны таких программ, как sendmail, finger, talk и др., подвержены атакам типа переполнение буфера. О них следует обязательно помнить при написании программ, которые должны выполняться с правами пользователя root, а
Поведение типов с фиксированной точкой в операциях
Поведение типов с фиксированной точкой в операциях ДелениеПри выполнении деления типов с фиксированной точкой диалекты 1 и 3 ведут себя по-разному.В диалекте 3, когда оба операнда являются типами с фиксированной точкой, Firebird суммирует масштабы обоих операндов для
1.14 Еще об операциях
1.14 Еще об операциях Другое направление развития – снабдить вектора операциями:class Vec : public vector (* public: Vec(int s) : (s) (**) Vec(Vec amp;); ~Vec() (**) void operator=(Vec amp;); void operator*=(Vec amp;); void operator*=(int); //... *);Обратите внимание на способ определения конструктора производного класса, Vec::Vec(), когда он
Глава 8 Переполнение буфера
Глава 8 Переполнение буфера В этой главе обсуждаются следующие темы: • Стек • Стековый фрейм функции • Основы переполнения буфера • Пример программы, уязвимой к переполнению буфера • Современные способы переполнения буфера • Новаторские принципы построения