Arithmetic overflows in C#/C/C++
Иногда самая банальная вещь может быть невероятно полезной. К примеру, как бы Вы решили проблему переполнения в результате арифметических операций, скажем, на
языке C/C++? Уверен, пришлось бы анализировать операнды перед операций в поиске возможного переполнения, что есть не очень тривиальная задача. Еще один недостаток
такого решения - производительность, анализ будет дороже самой операции. Конечно, можно использовать ассемблерные вставки типа _asm jo OverflowedLabel
после каждой операции, но это скорее маразм. Я хочу заметить, что язык ассемблера позволяет постфактум проверять флаг переполнения последней арифметической операции.
Язык C#, IL код и CLR позволяют легко выявлять переполнения с помощью т.н. checked
секций кода. Одноименное ключевое слово языка C# определяет блок
кода в котором переполнения приводят к исключению OverflowException
. Реализация проста до безобразия - JIT вставляет операцию jo SomeAddr
после каждой операции внутри блока checked
, а по адресу SomeAddr
находится одна единственная инструкция - call clr!JIT_Overflow
.
Интересно, а многие разработчики вообще следят за такими вещами? Обрабатываете ли вы возможные переполнения? Приходит ли вообще на ум, что это может быть проблемой?
0 коммент.:
Отправить комментарий