#c_sharp
1) Как принудительно включить проверку границ в управляемом и неуправляемом коде? 2) Как отловить такие ошибки? Например для неуправляемого кода в том же дельфи есть опция Range Check Errors, для отлова таких ошибок. Что в этом плане нам может предложить шарп?
Ответы
Ответ 1
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 работает только с внутренними паскальными массивами - которые на самом деле вполне управляемые - среда выполнения знает об их длине.
Комментариев нет:
Отправить комментарий