Совместим ли Misra-C с X-макросами? - PullRequest
0 голосов
/ 27 сентября 2018

Можно утверждать, что во многих случаях X-макросы увеличивают безопасность, потому что, например, легче убедиться, что сгенерированные массивы имеют одинаковую длину.


Однако, Misra C (из 2004справочные) правила, как представляется, содержат множество правил препроцессора, ограничивающих использование:

Правило 19.1 (рекомендательное) # операторам включения в файл должны предшествовать только другие директивы или комментарии препроцессора.

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

Правило 19.4 (обязательно) Макросы C должны расширяться только до фигурного инициализатора, константы, строкового литерала, выражения в скобках, спецификатора типаспецификатор класса хранения или конструкция do-while-zero.

Не должно вызывать проблем, поскольку большинство X-макросов используются для генерации инициализаторов или констант массива.

Правило 19.6 (обязательно) #undef не должно использоваться.

Делает невозможным использование некоторых шаблонов X-макроса.К сожалению, это не мешает работе макросов X.

Правило 19.7 (рекомендация) Функцию следует использовать вместо макроса, подобного функции.

РекомендацияТолько правило.

Правило 19.12 (обязательно) Должно быть не более одного вхождения операторов препроцессора # или ## в одном макроопределении.

Может работатьвокруг использования вложенных макросов.

Правило 19.13 (рекомендация) Не следует использовать операторы препроцессора # и ##.

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

Правило 19.15 (обязательно) Должны быть приняты меры предосторожности для предотвращения повторного включения содержимого заголовочного файла.

В некоторых случаях проблематично, но можно обойти.


Глядя на вышесказанное, кажется, что можно использовать X-макросы с кодом Misra C, если вы осторожны.

Это мойвывод правильный или сом естьПравило я пропускаю?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

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

Глядя на вышесказанное, кажется, что можно использовать X-макросы с кодом Misra C, если вы осторожны.

Да ... вы можете поднять отклонение - это требует от васпонять последствия вашего решения о нарушении Руководства, обосновать это нарушение и получить соответствующее одобрение.

В этом случае отклониться.

0 голосов
/ 27 сентября 2018

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

Правильный способ гарантировать, что массивы имеют правильную длину и т. Д., Это использовать static_assert (или какой-то хак: ish pre-C11 механизм), который выдает ошибку во время компиляции.

Решение ваших проблем по одному:

  • операторам включения в файле должен предшествовать толькодругими директивами или комментариями препроцессора.... хлопотно, если исходная таблица находится в другом файле, который включен ...

    Это правильное правило, и нет причин отклоняться от него.Если у вас есть исходная таблица в другом файле, который вы #include, то в чем проблема?Правило не говорит о предварительно обработанном заголовочном файле.

    Основная причина правила состоит в том, чтобы запретить людям вставлять #include в середине файла где-нибудь.(Скорее всего, это вызвано некоторым оставшимся отладочным кодом.)

  • Правило 19.4 (обязательно) Макросы C должны расширяться только до фигурного инициализатора, константы, строкилитерал, выражение в скобках, спецификатор типа, спецификатор класса хранения или конструкция do-while-zero.

    Если интерпретируется как (рекурсивно) расширенный макрос, это не должно быть проблемой, поскольку макросы X должны в конечном итоге сводиться к константам, типам и т. д.Правило гласит «развернуть», поэтому я полагаю, что оно относится к полностью развернутым макросам.

    Это правило полностью исключено в MISRA-C: 2012 и заменено другими более конкретными правилами, такими как не создание макросов.с тем же именем, что и ключевое слово языка и т. д.

  • Правило 19.6 (обязательно) #undef не должен использоваться.

    Это правило былорасслаблен в MISRA-C: 2012, от обязательного до консультативного.Один действительный аргумент, выдвинутый против этого правила, действительно заключается в том, что #undef необходим для X-макросов, хотя я не могу сказать, почему это было смягчено.

    В основном существует правило для предотвращения кода типа #undef NULL или другие странные и непонятные идеи, которые могут возникнуть у некоторых людей.

  • Правило 19.7 (консультативное) Функцию следует использовать вместо функционально-подобного макроса.

    В целом, MISRA-C против использования функционально-подобных макросов, это рекомендательное правило как в MISRA-C: 2004, так и в текущей MISRA-C: 2012.И по очень веским причинам: мы все знаем, что функциональные макросы вообще являются злом, но мы также знаем, что они часто являются неизбежным злом.

  • Правило 19.12 (обязательно) Должно быть не более одного вхождения операторов препроцессора # или ## в одном макроопределении.

    Это правило было смягчено в MISRA-C: 2012 до консультативного.Может быть трудно написать некоторые макросы X без этих двух.С ними связана пара действительных опасностей, но они решаются другими правилами.Я не вижу конфликта с макросами X в MISRA-C: 2012.

  • Правило 19.15 (обязательно) Должны быть приняты меры предосторожности для предотвращения включения содержимого файла заголовкадважды.

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

Вывод:
Вы не можете использовать макросы X в предыдущем MISRA-C: 2004, но вы можете использовать их в текущем MISRA-C: 2012.Я настоятельно рекомендую обновить, поскольку MISRA-C: 2012 - это серьезное изменение к лучшему.Различные педантичные правила были отброшены, смягчены или переписаны.Сложные правила, такие как правила, касающиеся неявных продвижений по типу, были значительно улучшены.Теперь есть поддержка C99.И так далее.

Я сам использовал X-макросы с MISRA-C: 2012 и, насколько я помню, без необходимости повышать отклонения от каких-либо обязательных правил.

...