MISRA 14.5 говорит, что инструкция continue не должна использоваться. Может ли кто-нибудь объяснить причину? Спасибо.Почему «continue» считается нарушением C в MISRA C: 2004?
ответ
Это из-за ancient debate about goto
, безусловного разветвления и кода спагетти, который продолжается уже 40 лет. goto
, continue
, break
и несколько сообщений return
считаются более или менее одинаковыми.
Консенсус сообщества программистов в мире примерно что-то вроде: мы признаем, что вы можете использовать эти функции языка без написания кода спагетти, если знаете, что делаете. Но мы все еще отговариваем их, потому что есть большой шанс, что кто-то, кто не знает, что они делают, собирается использовать функции, если они доступны, а затем создает спагетти. И мы также отговариваем их, потому что они являются излишними функциями: вы, очевидно, можете писать программы, не используя их.
Поскольку MISRA-C нацелен на критические системы, MISRA-C: 2004 имеет подход к запрету как можно большего числа этих безусловных функций ветвления. Поэтому goto
, continue
и несколько возвратов были запрещены. break
разрешен только в том случае, если в одном цикле был один разрыв.
Однако, в «MISRA-C: 2011» проекта, который в настоящее время находится в стадии оценки, комитет рассмотрел, чтобы все эти функции еще раз, с ограничением, что Гото должно быть разрешено только прыгать вниз и никогда вверх. Обоснование от комитета говорит, что теперь есть инструменты (например, статические анализаторы), достаточно умные, чтобы выявить плохой поток программ, поэтому ключевые слова могут быть разрешены.
Дискуссия Гото еще идет сильный ...
Программирование на C заставляет заведомо трудно отслеживать несколько ветвей выполнения. Если вы где-то выделяете ресурсы, вы должны выпускать их в другом месте, не локально. Если ваши ветви кода, вы, как правило, должны иметь отдельную логику освобождения для каждой ветки или способ выйти из области.
Оператор continue
добавляет еще один способ выхода из области цикла for
и, таким образом, делает такую петлю сложнее рассуждать и понимать все возможные способы, с помощью которых управление может протекать через нее, что, в свою очередь, затрудняет чтобы убедиться, что ваш код ведет себя правильно при любых обстоятельствах.
Это только предположение с моей стороны, но я полагаю, что попытка ограничить сложность, исходящую из этого дополнительного поведения ветвления, является движущей причиной правила, которое вы упомянули.
IMO, если продолжить, сделать петлю трудно понять, тогда код цикла слишком длинный .... –
@MitchWheat: Да. Вы должны лоббировать MISRA, чтобы добавить правило «без длинных циклов»! (Но лично, на C++, я считаю, что очень удобно говорить, чтобы иметь возможность пропускать строки комментариев при синтаксическом анализе ввода с помощью простого 'continue'. С другой стороны, C++ - гораздо более подходящий язык для идиомы« раннего выхода ».) –
Бессмысленно: по опыту стандарты кодирования, такие как их, часто затуманиваются для самого низкого общего знаменателя. Я использую продолжение в C/C++/C#. Это совершенно хорошая конструкция. –
Как и со всеми правилами MISRA, если вы можете оправдать его, вы можете отклониться от правила (раздел 4.3.2 MISRA-C: 2004)
Точка, лежащая за MISRA (и другими аналогичными рекомендациями), заключается в том, чтобы уловить то, что обычно вызывает проблемы ... да, continue
может использоваться должным образом, но данные свидетельствуют о том, что это была общая причина проблемы.
Таким образом, MISRA создала правило, предотвращающее его использование (ab), и сообщество по пересмотру одобрило это правило. И мнения сообщества пользователей в целом поддерживают правило.
Но я повторяю, если вы действительно хотите использовать его, и вы можете оправдать его в своей иерархии, отклонитесь.
- 1. Почему MISRA-C: 2004 выдает ошибку здесь?
- 2. MISRA C 2004 10,1, знаковость Printf "% х"
- 3. Выбор Руководства: MISRA 1998 или MISRA 2004 или MISRA 2012?
- 4. MISRA 2004: 10.1/R warning
- 5. MISRA инкрементации в C
- 6. Почему этот код считается нарушением Закона Деметры?
- 7. Что именно считается «нарушением сборки»?
- 8. C++/C# callback continue
- 9. C++ Continue Statement Confusion
- 10. MISRA C++ 2008 странное предупреждение
- 11. C/C++ 'continue' Эквивалент в VB6
- 12. C# Ошибка с 'continue'
- 13. Вопросы, охватываемые правилом 3.1 of misra c 2004 «Заданное поведение при реализации, зарегистрированное»
- 14. Кто-нибудь создал C-файл для проверки инструментов проверки кода для MISRA-2004?
- 15. Почему `switch` считается циклической структурой для целей` continue`?
- 16. Почему «строка» считается «константой» на языке C?
- 17. Код C еще считается C++?
- 18. Почему поведение C++ underflow/overflow считается неопределенным?
- 19. Почему Objective-C считается простой langauge?
- 20. Включает ли FxCop в C# крышку MISRA?
- 21. MISRA-C ошибка инициализации структура массива
- 22. Почему этот код не соответствует MISRA-C 2012 Правило 11.3
- 23. Препроцессор C __TIMESTAMP__ в ISO 8601: 2004
- 24. C# try catch continue execute
- 25. В C++ 11, ... считается оператором?
- 26. Почему мой инструмент выбросил ошибку MISRA здесь?
- 27. Подавление сообщения MISRA/QA-C с Doxygen
- 28. Правило Misra C 10.1 - ложное предупреждение?
- 29. MISRA 2008 C++ предупреждение для GetLine
- 30. Шаблон статической функции и MISRA C++
Вы спросили их * по их причине? –
Как и все «всегда» и «никогда», они, вероятно, не заслуживают особого внимания. –