Форум программистов, компьютерный форум, киберфорум
Наши страницы
Rius
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Go to MISRA C

Запись от Rius размещена 03.06.2019 в 11:03
Обновил(-а) Rius 03.06.2019 в 14:51

Для справки.
Что по этому оператору сказано в стандарте MISRA C (версии 2012), применяемом, чтобы самолёты не падали в автомобильной, аэрокосмической, медицинской отраслях.

Правило 15.1 Оператор goto не должен использоваться.

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

В некоторых случаях полный запрет goto требует введения флагов для корректировки потока выполнения и, возможно, эти флаги могут сами по себе быть менее прозрачными, чем goto, который они заменяют.
Поэтому, если не следовать этому правилу, ограниченное использование goto позволяется там, где соблюдаются правила 15.2 и 15.3.

Правило 15.2 Оператор goto должен переходить только к метке, объявленной позже в той же функции.

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

Запрет на использование goto для переходов назад гарантирует, что итерация можно возникнуть только если применён оператор итерации, предоставленный используемым языком (программирования), помогая минимализировать визуальную сложность кода.

Правило 15.3 Любая метка, на которую ссылается оператор goto, должна быть определена в том же блоке, или в любом блоке, окружающем оператор goto. (Т.е. наружу).

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

Предотвращение переходов между блоками, или во вложенные блоки, помогает минимализировать визуальную сложность кода.

Правило 15.4 Для прерывания любого итерационного выражения должно использоваться не более одного break или goto.

Обоснование
Ограничение числа выходов из цикла помогает минимализировать визуальную сложность кода. Использование одного break или goto позволяет создать единый вторичный путь выхода, когда требуется раннее прерывание цикла.


P.S. Если Вы не знаете, что данный стандарт призван избежать ошибок в safety-critical системах, от которых зависят жизни людей, просьба его не комментировать а-ля "а давайте ещё удалим jump из ассемблера".
Размещено в Без категории
Просмотров 176 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для bedvit
    Ну началось, прямо эпидемия... 3 тема по goto...
    Выше по ссылке "Текст стандарта MISRA C доступен только за плату".
    Ради истины, на любые расходы.
    Вызывает уважение.
    Запись от bedvit размещена 03.06.2019 в 11:17 bedvit вне форума
  2. Старый комментарий
    Аватар для Usaga
    Просто человек решил разбавить волну маразма накрывшую блоги)
    Запись от Usaga размещена 03.06.2019 в 11:27 Usaga вне форума
  3. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Просто человек решил разбавить волну маразма накрывшую блоги)
    Да там ваще отшибленный случай. Ссылается на книгу K&R, при этом в книге ясно сказано
    Цитата:
    C provides the infinitely-abusable goto statement, and labels to branch to. Formally, the goto is never necessary, and in practice it is almost always easy to write code without it. We have not used goto in this book. Nevertheless, there are a few situations where gotos may find a place. The most common is to abandon processing in some deeply nested structure, such as breaking out of two or more loops at once. The break statement cannot be used directly since it only exits from the innermost loop
    ...
    With a few exceptions like those cited here, code that relies on qoto statements is generally harder to understand and to maintain than code without gotos. Although we are not dogmatic about the matter, it does seem that goto statements should be used rarely, if at all.
    То есть даже тогда использование goto было не очень хорошей идеей.
    О, ужас, даже если с goto кажется проще ,а без него медленнее.
    Запись от Croessmah размещена 03.06.2019 в 12:59 Croessmah на форуме
  4. Старый комментарий
    Аватар для Curry
    Cтандарт MISRA C, это полумера. Сам С опасен. В ответственном embedded должны бы применяться MISRA Ada или MISRA Rust, но даже компиляторы c этих языков под мало какие контроллеры есть. А под что есть, под то нет библиотек, средств автоматизации разработки, в первую очередь от разработчиков железа. Под 8мибитки даже С++ почти не используются, а в нём хотя бы более строгий контроль преобразования типов.

    Насчёт goto всё правда.
    Чаще всего, если понадобилось выходить сразу из нескольких циклов, то это жирный намёк на то что функция разрослась и это место нужно вынести в отдельную функцию, а выход выполнять по return. И другие случаи применения goto часто исключаются определением новых функций. В случае нехватки стека (в embedded это часто критично) компилятор может заинлайнить такие вспомогательные функции, зато код останется читаемым.
    Запись от Curry размещена 05.06.2019 в 12:01 Curry вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru