OberonCore
https://forum.oberoncore.ru/

В 102-й раз о грамотном программировании
https://forum.oberoncore.ru/viewtopic.php?f=82&t=6603
Страница 1 из 1

Автор:  Info21 [ Четверг, 23 Апрель, 2020 20:32 ]
Заголовок сообщения:  В 102-й раз о грамотном программировании

Статический анализ (то, что минимально грамотный программер на автомате делает, работая на Обероне/КП) нашел ошибку в OpenSSL -- high severity risk.

https://www.theregister.co.uk/2020/04/2 ... erability/

Как обычно у носителей манипулятивно-комбинаторного интеллектуса, задача решается меганашлёпкой -- статическим анализатором в GCC 10.

Автор:  Comdiv [ Пятница, 24 Апрель, 2020 00:16 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Info21 писал(а):
то, что минимально грамотный программер на автомате делает, работая на Обероне/КП

Можете прояснить мысль?
Исправление выглядит так:
Код:
-        if (sig_nid == sigalg->sigandhash)
+        if (sigalg != NULL && sig_nid == sigalg->sigandhash)
Что спасает от такой ошибки минимально грамотного писателя на Обероне?

Автор:  Info21 [ Пятница, 24 Апрель, 2020 13:17 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Дополнительный мозговой ресурс, освободившийся по причине читабельности текста.

Привыкнуть можно к чему угодно, но ресурс привычка будет съедать, и обнаружится это только вот в такой ситуёвине.

Автор:  Comdiv [ Суббота, 25 Апрель, 2020 12:39 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Не вижу повода для такого оптимизма. В программах на Обероне, написанных грамотными программистами не бывает разыменований NIL? Как показывает опыт, даже в менее неоднозначных случаях, грамотные программисты на автомате допускают ошибки.

Статический анализатор всем полезен, так как позволяет проверять более глубоко, чем это может себе позволить оперативный транслятор. В случае более ошибкоустойчивого языка анализатор освобождается от сложных проверок, которые легко режутся на уровне дизайна языка, и может опираться на большее количество гарантий, но потребность в нём нисколько не надумана. Та проверка, которую анализатор смог сделать для кода OpenSSL, была бы полезна и для Оберона. Не согласны?

На уровне языка такие ошибки тоже режутся. У носителей манипулятивно-комбинаторного интеллектуса, не связанных с потребностью поддерживать совместимость полувекового наследия, популярны вариации Option type. Такая вещь, введённая ad hoc, усложняет язык и транслятор, но повышает ошибкоустойчивость. Ошибкоустойчивые конструкции, которые не усложняют язык и транслятор, почти исчерпаны самим Обероном, поэтому я не вижу иного выхода кроме усложнения языка, если хочется больше автоматического контроля.

Автор:  Валерий Лаптев [ Суббота, 25 Апрель, 2020 13:18 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Насчет ошибок у грамотных программеров.
В далеком примерно 1984 году работали мы с Авророй - писали ось бортовую.
На ассемблере. К тому времени у меня было уже около 15 лет стажа самой разнообразной работы,
в том числе на ассемблере и даже в кодах.
Сидим как-то вечером вдвоем с другом-начальником в подвале Авроры, пишем проги.
Написал я функцию в 22 команды. Запускаю - не работает!
22 команды - ошибаться просто негде! При почти 15 лет стажа.
Лев - говорю - что за фигня?!
Он - ищи 2 ошибки.
Я - почему?
он - 10% кода всегда ошибочные...
И ведь через полчаса после тщательной ручной прокрутки покомандно я нашел 2 ошибки...

Еще могу сказать: всегда ошибался в repeat-until на паскале.
Поэтому на С++ в do-while не ошибаюсь никогда - там как в while - do :)

Ошибки - это индивидуально

Автор:  Info21 [ Суббота, 25 Апрель, 2020 13:19 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Согласен, но не вижу противоречия сказанному мною.

Прозрачность и "защитность" Оберона позволяет программисту перевести фокус своего умственного процесса с дежукинга на доказательность, и разница получается качественная.

***

Кстати, не хватает слова для ключевого понятия, вышеобозначенного в кавычках.
Робастность?
Надо бы что-то, что входит в мозг как шило в пенопласт.

Автор:  Валерий Лаптев [ Суббота, 25 Апрель, 2020 13:21 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Не, робастность - иностранный термин. Или научный.
Надо попроще.
Безглючность
:)

Автор:  Info21 [ Суббота, 25 Апрель, 2020 23:33 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Безглючность -- это свойство самого компилятора.

Здесь речь о свойстве языка+компилятора защищать программера от опечаток и проч., освобождая мозг для содержательных размышлений.

Кстати, обучая на Обероне, можно в гораздо большей степени сосредоточиться на содержательных ошибках (вроде непроверки неинициализованности), потому что толща тривиальных радикально прорежена.

Автор:  Иван Денисов [ Воскресенье, 26 Апрель, 2020 06:27 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Если я правильно понимаю, то в Блэкбоксе такая ошибка привела к аварийной остановке при первом обращении к неразмещенному указателю и выявили бы её давным давно.

Автор:  Валерий Лаптев [ Воскресенье, 26 Апрель, 2020 08:19 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

О способности языков+компиляторов защищать от тривиальных ошибок - читал уже давно. Поднимался вопрос, да.
Но терминов придумано не было.
Обращалось внимание, что язык должен быть боле дружественным к программисту и не позволять ему совершать дурацкие ошибки. Собственно RUST возник как некоторый ответ на эту проблему.
Английский термин есть какой-нибудь?

Автор:  Comdiv [ Воскресенье, 26 Апрель, 2020 12:28 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Иван Денисов писал(а):
Если я правильно понимаю, то в Блэкбоксе такая ошибка привела к аварийной остановке при первом обращении к неразмещенному указателю и выявили бы её давным давно.
Нет. В С разыменование NULL, обычно, тоже приводит к аварийной остановке. И, естественно, что этого недостаточно для выявления такой ошибки, так как для её проявления нужно выполнить ряд условий, которые сами по себе встречаются очень редко.

Автор:  Иван Денисов [ Воскресенье, 26 Апрель, 2020 20:08 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Спасибо за разъяснение. Наверное, я понял посыл Фёдора Васильевича.
Если в голове остаётся место для анализатора, то и ошибки такого рода реже появляются.
У меня нет статистики и забавных примеров, а вот у ФВ есть много в запасе.
Однако загрузка головы связана не только со сложностью инструментов и языков.
Еще много других факторов.

Автор:  adimetrius [ Воскресенье, 26 Апрель, 2020 22:23 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Валерий Лаптев писал(а):
О способности языков+компиляторов защищать от тривиальных ошибок - читал уже давно. Поднимался вопрос, да.
Но терминов придумано не было.

А строгий? Rigorous? Вирт использует это слово по отношению к своим языкам, в частности в его гугл-лекции неоднократно.

Автор:  adimetrius [ Воскресенье, 26 Апрель, 2020 22:37 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Согласен с Ф.В. про то, что язык позволяет, а компилятор обеспечивает возможность думать о программе, а не о проверках.

На мой взгляд, это в гораздо большей степени полезно не при написании нового кода, а при рефакторинге старого. А рефакторить приходится примерно всегда - чужой код и свой код, написанный 3 месяца назад. Преподавая же программирование, обычно фокусируются как раз на новом коде; поэтому ценность строгости учащимся труднее осознать.

Автор:  Иван Денисов [ Вторник, 28 Апрель, 2020 21:08 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Еще в Блэкбоксе есть анализатор, который подобные баги ищет.

Вложения:
test_analyser.png
test_analyser.png [ 28.61 КБ | Просмотров: 28097 ]

Автор:  Владимир Паронджанов [ Среда, 29 Апрель, 2020 20:06 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Валерий Лаптев писал(а):
Но терминов придумано не было.
Обращалось внимание, что язык должен быть боле дружественным к программисту и не позволять ему совершать дурацкие ошибки. Собственно RUST возник как некоторый ответ на эту проблему.
Английский термин есть какой-нибудь?

На мой взгляд, можно использовать термин "ergonomic language" или "ergonomical language", что означает people-friendly.
Кроме того, это значит "удовлетворяющий требованиям когнитивной эргономики".

Автор:  PSV100 [ Четверг, 21 Май, 2020 19:16 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

На форуме относительно недавно упоминали новый компилятор от Huawei. Результаты его статического анализа позволяют выдвинуть претензии к особенностям языка, способствующим появлению ошибок. Напр.:
https://habr.com/ru/company/pvs-studio/blog/478284/
Код:
enum Opcode : uint8 {
  kOpUndef,
  ....
  OP_intrinsiccall,
  OP_intrinsiccallassigned,
  ....
  kOpLast,
};

bool MIRParser::ParseStmtIntrinsiccall(StmtNodePtr &stmt, bool isAssigned) {
  ....
  if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
    intrnCallNode->SetIntrinsic(GetIntrinsicID(lexer.GetTokenKind()));
  } else {
    intrnCallNode->SetIntrinsic(static_cast<MIRIntrinsicID>(....));
  }
  ....
}

Оператор '==' имеет более высокий приоритет, чем тернарный оператор (?:). Следовательно, условное выражение выше:

if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
  ....
}

эквивалентно следующему:

if ((o == !isAssigned) ? OP_intrinsiccall : OP_intrinsiccallassigned) {
  ....
}

Перечисления OP_intrinsiccall и OP_intrinsiccallassigned имеют ненулевые значения, в итоге условие всегда детерминировано как положительное, else-часть содержит недостижимый код.


С другой стороны, отсутствие в Паскаль/Оберон "если как выражение" это не только "защита", но и игнорирование удобств для пользователя (конечно же, не на каждый чих нужен immediate if). В Ada, например, "встроенный if" (и "встроенный for") аля:
Код:
G : constant Matrix :=
    (for I in 1 .. 4 =>
       (for J in 1 .. 4 =>
          (if I = J then 1.0 else 0.0)));

Автор:  PSV100 [ Четверг, 21 Май, 2020 19:26 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

Валерий Лаптев писал(а):
Не, робастность - иностранный термин. Или научный.
Надо попроще.
:)

Среди языков, авторы которого награждают своё творение титулом "робастный", вспоминается Zig, как раз "иностранный" (альтернатива C/C++/Rust и пр.):
https://ziglang.org/documentation/master/
Цитата:
Zig is a general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.

* Robust - behavior is correct even for edge cases such as out of memory.
...

Как правило, вариативные результаты запаковываются в опциональные типы (указатели также по сути есть вариативный тип), для чего имеется соответствующая система типизации и вспомогательные облегчающие средства для "доставания" значений из упаковки, явного указания компилятору "уверенности" разработчика (мол "здесь всё в порядке и лишние проверки ненужны") и пр. Иными словами, язык максимально "нагибает" в compiletime и старается как можно меньше допускать ситуаций с "паникой/"исключением". Аварийный останов, по сути-то, есть крах системы, что не вяжется с робастностью. В Оберонах проще язык, но защита больше основана на авостах.

Автор:  Александр Ильин [ Суббота, 23 Май, 2020 15:07 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

За что люблю этот форум, так это за то, что тут можно увидеть ссылки на интересные языки программирования. То V промелькнул, теперь Zig.

Правда, V под Виндой у меня так ни разу и не запустлся, сколько разных версий я ни пробовал.

Автор:  Info21 [ Суббота, 23 Май, 2020 16:03 ]
Заголовок сообщения:  Re: В 102-й раз о грамотном программировании

А чего там интересного?
Один раз пролистать какого-нибудь Баррона -- и на всю жизнь оскомина.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/