Код должен быть написан так, чтобы он обладал определенными желаемыми свойствами (критериями качества). Практически всегда желательны некоторые критерии качества, такие как правильность, удобочитаемость, ремонтопригодность (даже здесь есть исключения, например, если вы пишете код для запутанного конкурса c или закулисного конкурса c). Другие критерии качества актуальны только для определенных проектов или организаций, например переносимость на 16-битные машины.
Хорошо сформулированное правило кодирования обычно поддерживает один или несколько критериев качества. Однако он может конфликтовать с другими. Существует большое количество установленных правил кодирования, которые поддерживают обычно желаемые критерии качества, но не оказывают существенного отрицательного влияния на другие. Многие из них были определены довольно давно (Kernighan and Plauger: Elements of Programming Style, 1974, и да, у меня есть его копия :-). Иногда выявляются дополнительные хорошие правила.
Если только в очень редких случаях (например, преднамеренное запутывание) код не должен следовать этим «установленным хорошим правилам», независимо от того, являются ли они частью MISRA-XXXX или нет. И, если будет найдено новое хорошее правило, убедитесь, что люди начинают ему следовать. Вы можете даже решить применить это новое хорошее правило к уже существующему коду, но это скорее решение руководства из-за связанного с ним риска.
Просто не имеет смысла не следовать хорошему правилу только потому, что оно не является частью MISRA-XXXX. Точно так же нет смысла следовать плохому правилу только потому, что оно является частью MISRA-XXXX. (В MISRA-C-2004 сказано, что они удалили 16 правил из MISRA-1998, потому что «они не имели смысла» — надеюсь, некоторые разработчики заметили и не применили их. И, как упоминает Лундин, в MISRA-2012 снова некоторые «странные правила» были удалены).
Однако имейте в виду, что почти для каждого правила его необдуманное применение может в определенных ситуациях даже ухудшить те критерии качества, которые оно обычно поддерживает.
В дополнение к этим общеприменимым правилам существуют правила, которые применимы только в том случае, если для вашего кода существуют определенные критерии качества. Что усложняет ситуацию, так это то, что в большинстве проектов для разных частей кода разные критерии качества имеют разное значение.
- Для подпрограммы обслуживания прерываний производительность более критична, чем для большинства других частей программного обеспечения. Таким образом, компромиссы относительно. будут установлены другие критерии качества.
- Некоторые части программного обеспечения предназначены для переноса между средами, но часто за счет введения адаптеров/оболочек, которые затем специфичны для определенной среды. Таким образом, сам адаптер даже не предназначен для переноски.
Следовательно, за исключением вышеупомянутых «установленных хороших правил», фиксированный набор правил кодирования не может хорошо работать для всех частей типичного программного обеспечения. Итак, для каждой части программного обеспечения сначала определите, какие критерии качества относятся к этой части. Затем примените те шаблоны, принципы и правила, которые действительно должным образом поддерживают эти конкретные критерии качества.
Но как насчет МИСРА? Правила MISRA предназначены для поддержки таких критериев качества, как корректность посредством анализируемости (например, запрет на рекурсию и управление динамической памятью), переносимость (например, изоляция ассемблерного кода). То есть для программных частей, где эти специфические критерии качества не актуальны, соответствующие правила MISRA не приносят никакой пользы. К сожалению, в MISRA нет понятия архитектуры программного обеспечения, где разные части имеют разные критерии качества.
Хотя многие правила улучшились по сравнению с выпусками MISRA, все еще есть много правил, которые являются более строгими, чем необходимо (например, «никаких /* в // комментариях и наоборот» — почему?) и правила, которые пытаются избежать (маловероятных) ошибок способами которые, скорее всего, создадут проблемы, а не решат их (например, «запрет повторного использования любого имени, даже в разных локальных областях»). Вот мой совет для вас: если вы а) действительно хотите, чтобы ваша проверка правил нашла все ошибки и б) не возражаете против получения абсурдного количества предупреждений с высоким коэффициентом ложных срабатываний, это одно правило/проверка сделает все за вас. вы: "предупреждение: обнаружена строка кода: ‹строка кода>".
Наконец, MISRA разработана в предположении, что язык C (в частности, его арифметика) слишком сложен для понимания. MISRA разрабатывает свою собственную арифметику поверх C, полагая, что разработчики вместо этого должны изучить арифметику MISRA, а затем могут уйти, не понимая арифметику C. По-видимому, это не удалось, так как модель МИСРА-2004 («базовый тип») была заменена другой («основной тип») в МИСРА-2012. Таким образом, если ваша команда хорошо понимает C и использует хороший инструмент статического анализа (или даже несколько), способный выявить проблемные сценарии с помощью арифметики C, подход MISRA, скорее всего, не для вас.
TL;DR: следуйте стандартным рекомендациям, применяйте установленные хорошие правила. Определите конкретные критерии качества для различных частей вашей архитектуры. Для каждой части применяйте шаблоны, принципы и правила, подходящие для этой части. Изучите правила, прежде чем применять их. Не применяйте глупые правила. Используйте хороший статический анализ кода. Убедитесь, что ваша команда понимает C.
person
Dirk Herrmann
schedule
27.07.2017