1) Как принудительно включить проверку границ в управляемом и неуправляемом коде?
2) Как отловить такие ошибки?
Например для неуправляемого кода в том же дельфи есть опция Range Check Errors, для отлова таких ошибок.
Что в этом плане нам может предложить шарп?
Ответ
Range Check Errors в дельфи - это две раздельных фичи в C#/.NET
Первая - это проверка на arithmetic overflow / underflow. Включается в свойствах проекта, в Build / Advanced.
Эта проверка действует только в пределах checked-регионов. Т.е. она
- будет работать по умолчанию,
- не будет работать внутри региона unchecked { код }
- будет работать внутри региона checked { код } вложенонго в unchecked
Указатели и fixed-size буфферы можно использовать только внутри unchecked-регионов, так что в принципе можно сказать что проверка работает только для управляемого кода.
Кроме того, опция arithmetic overflow / underflow - это аттрибут сборки. Т.е. включить ли проверку для кода внутри конкретной DLL определяется на этапе ее компиляции. Выставление это опции заставляет компилятор C# заменять команды IL для работы с числами - add, mul - на их аналоги, проверяющие overflow - add.ovf, mul.ovf
Если сборка уже готова и вы ее просто используете - то изменить настройку для кода внутри ее не получится.
Вторая - это проверка на выход за границы массива, и для управляемого кода ее отключить нельзя.
В неуправляемом коде ее наоборот, нельзя включить. Просто потому, что в терминах неуправляемого кода массивов как таковых нет. Есть указатели. Есть функции работы с памятью. А массивов как цельных объектов - куска памяти + длины - нет.
В дельфи Range Check Errors работает только с внутренними паскальными массивами - которые на самом деле вполне управляемые - среда выполнения знает об их длине.
Комментариев нет:
Отправить комментарий