2012-06-11 2 views
9

MISRA 14.5 говорит, что инструкция continue не должна использоваться. Может ли кто-нибудь объяснить причину? Спасибо.Почему «continue» считается нарушением C в MISRA C: 2004?

+6

Вы спросили их * по их причине? –

+5

Как и все «всегда» и «никогда», они, вероятно, не заслуживают особого внимания. –

ответ

16

Это из-за ancient debate about goto, безусловного разветвления и кода спагетти, который продолжается уже 40 лет. goto, continue, break и несколько сообщений return считаются более или менее одинаковыми.

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

Поскольку MISRA-C нацелен на критические системы, MISRA-C: 2004 имеет подход к запрету как можно большего числа этих безусловных функций ветвления. Поэтому goto, continue и несколько возвратов были запрещены. break разрешен только в том случае, если в одном цикле был один разрыв.

Однако, в «MISRA-C: 2011» проекта, который в настоящее время находится в стадии оценки, комитет рассмотрел, чтобы все эти функции еще раз, с ограничением, что Гото должно быть разрешено только прыгать вниз и никогда вверх. Обоснование от комитета говорит, что теперь есть инструменты (например, статические анализаторы), достаточно умные, чтобы выявить плохой поток программ, поэтому ключевые слова могут быть разрешены.

Дискуссия Гото еще идет сильный ...

5

Программирование на C заставляет заведомо трудно отслеживать несколько ветвей выполнения. Если вы где-то выделяете ресурсы, вы должны выпускать их в другом месте, не локально. Если ваши ветви кода, вы, как правило, должны иметь отдельную логику освобождения для каждой ветки или способ выйти из области.

Оператор continue добавляет еще один способ выхода из области цикла for и, таким образом, делает такую ​​петлю сложнее рассуждать и понимать все возможные способы, с помощью которых управление может протекать через нее, что, в свою очередь, затрудняет чтобы убедиться, что ваш код ведет себя правильно при любых обстоятельствах.

Это только предположение с моей стороны, но я полагаю, что попытка ограничить сложность, исходящую из этого дополнительного поведения ветвления, является движущей причиной правила, которое вы упомянули.

+5

IMO, если продолжить, сделать петлю трудно понять, тогда код цикла слишком длинный .... –

+0

@MitchWheat: Да. Вы должны лоббировать MISRA, чтобы добавить правило «без длинных циклов»! (Но лично, на C++, я считаю, что очень удобно говорить, чтобы иметь возможность пропускать строки комментариев при синтаксическом анализе ввода с помощью простого 'continue'. С другой стороны, C++ - гораздо более подходящий язык для идиомы« раннего выхода ».) –

+3

Бессмысленно: по опыту стандарты кодирования, такие как их, часто затуманиваются для самого низкого общего знаменателя. Я использую продолжение в C/C++/C#. Это совершенно хорошая конструкция. –

1

Как и со всеми правилами MISRA, если вы можете оправдать его, вы можете отклониться от правила (раздел 4.3.2 MISRA-C: 2004)

Точка, лежащая за MISRA (и другими аналогичными рекомендациями), заключается в том, чтобы уловить то, что обычно вызывает проблемы ... да, continue может использоваться должным образом, но данные свидетельствуют о том, что это была общая причина проблемы.

Таким образом, MISRA создала правило, предотвращающее его использование (ab), и сообщество по пересмотру одобрило это правило. И мнения сообщества пользователей в целом поддерживают правило.

Но я повторяю, если вы действительно хотите использовать его, и вы можете оправдать его в своей иерархии, отклонитесь.

Смежные вопросы