Hello, Dimmy Timchenko! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Tue, 11 Oct 2005 17:32:41
+0400:
DT>>> Ты считаешь, что лучше пусть происходят _непредусмотренные_ DT>>> ни программистом, ни компилятором последствия?
DO>> Да. Программист на то и программист, чтобы предусматривать DO>> проверки там, где они нужны.
DT> Hе все такие умные, да и забыть что-то можно.
Забыть всегда можно. Можно и диапазон забыть указать или указать неправильно.
DT> А дырки должны быть все заткнуты. Особенно во встроенных приложениях.
Почему особенно?
DT>>> Hапример, знаменитое сишное переполнение массива и запись DT>>> данных поверх кода, применяемые в пресловутых "эксплойтах", DT>>> против которых микрософт выпускает заплатки раз в неделю?
DO>> Так как обычно переполняется не статический массив, а DO>> динамически выделенный буфер, все эти встроенные проверки все DO>> равно не работают.
DT> Вряд ли. Область динамической памяти, размещённая вперемешку DT> с кодом?
Видимо перемешанная с кодом область статической памяти или стека представляется тебе более естественным решением...
DT> Кстати, сегмент кода следовало бы защищать от записи...
Это вопрос организации ОС, а не языка программирования.
DT> Да и динамические объекты имеют определённый размер и их DT> переполнение можно проверять.
Можно. Причем в любом языке. Только это время...
DO>> Учитывая, что все популярные ОС написаны на C[++], а не на DO>> Аде и выполняются на имеющихся процессорах, а не на DO>> гипотетических, сравнить подходы по результату не DO>> представляется возможным.
DT> Hу, другой отмазки в данном случае и не может быть. :)
Причем не в пользу Ады...
DO>>>> Два, допустим вышла переменная за свои границы, что делать?
DT>>> В стандарте описано. Генерится, насколько я помню, DT>>> исключение.
DO>> И что дальше с ним делать?
DT> Обрабатывать, вестимо. По ситуации.
То есть вместо С++ класса, где все это в одном месте описано, получается рыхлый код, где программист должен думать об обработке этих исключительных ситуаций при каждом действии. Потому как полагаться на стандартный - получить бессмысленную для embedded остановку программы.
DT>>> Hо в нормально написанной программе такого выхода быть не DT>>> должно, это ситуация аварийная.
DO>> Если не должно, зачем проверки?
DT> Дома тоже не должны гореть, а мосты разваливаться. Часто DT> программист говорит "этой ошибки/ситуации не может быть" в DT> случаях, когда она просто маловероятна.
В детерминированной системе можно отличить невозможную (при исправном железе) ситуацию от маловероятной.
DT>>> Которая, конечно, тоже должна быть предусмотрена.
DO>> Или не должна, потому как в embedded весьма нередок случай, DO>> когда результат обработанной и необработанной ошибки в DO>> программе совершенно одинаков и пользы от этих исключений - DO>> 0.
DT> Программа не должна вести себя непредсказуемым, не DT> предусмотренным программистом (или, на худой конец, DT> компилятором) образом.
Семь бед - один ресет. В случае embedded - watchdog. Я не вижу на твоем примере чем задание типа с диапазоном и обработкой исключений лучше задания класса, в котором описаны допустимые действия и операторы. Или чем оно лучше простой переменной и ручной проверки ее значений там и тогда, где и когда это существенно. Кроме того, что в последнем случае оверхед минимален.
dima
formatting link