Избегайте нарушений правил C:2012 MISRA 8.x

MISRA C®Правила 8.1-8.14 2012 года обеспечивают соблюдение надлежащей практики кодирования, связанной с декларациями и определениями. Если вы следуете этим практикам, у вас меньше шансов иметь конфликтующие объявления или непреднамеренно изменить переменные.

Если вы не соблюдаете эти методы во время кодирования, ваш код может потребовать серьезных изменений позже, чтобы соответствовать MISRA C. У вас может быть слишком много нарушений MISRA C. Иногда, исправляя нарушение, вы можете нарушить другое правило. Вместо этого имейте эти правила в виду при кодировании. Используйте проверку C:2012 MISRA, чтобы определить любые проблемы, которые вы могли пропустить.

  • Явным образом задайте все типы данных в объявлениях.

    Избегайте неявных типов данных, таких как это объявление k:

    extern void foo (char c, const k);

    Вместо этого используйте:

    extern void foo (char c, const int k);

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.1.

  • При объявлении функций задайте имена и типы данных для всех параметров.

    Избегайте объявлений без таких имен параметров, как эти объявления:

    extern int func(int);
    extern int func2();

    Вместо этого используйте:

    extern int func(int arg);
    extern int func2(void);

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.2.

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

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

    /* header.h */
    extern int var;
    /* file1.c */
    #include "header.h"
    /* Some usage of var */
    /* file2.c */
    #include "header.h"
    int var=1;

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

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.3, MISRA C:2012 Rule 8.4, MISRA C:2012 Rule 8.5, или MISRA C:2012 Rule 8.6.

  • Если вы хотите использовать объект или функцию только в одном файле, объявите и задайте объект или функцию с static спецификатор.

    Убедитесь, что вы используете static спецификатор во всех объявлениях и определении. Например, эта функция func предназначено для использования только в текущем файле:

    static int func(void);  
    static int func(void){    
    }

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.7 и MISRA C:2012 Rule 8.8.

  • Если вы хотите использовать объект только в одной функции, объявите объект в теле функции.

    Избегайте объявления объекта вне функции.

    Например, если вы используете var в func только, объявите его вне тела func:

    int var;
    void func(void) {
       var=1;
    }

    Вместо этого используйте:

    void func(void) {
       int var; 
       var=1;
    }

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.7 и MISRA C:2012 Rule 8.9.

  • Если вы хотите ввести функцию в строку, объявите и задайте функцию с static спецификатор.

    Каждый раз, когда вы добавляете inline к определению функции добавьте static также:

    static inline double func(int val);
    static inline double func(int val) { 
    }

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.10.

  • При объявлении массивов явным образом задайте их размер.

    Избегайте неявных спецификаций размера, таких как это:

    extern int32_t array[];

    Вместо этого используйте:

    #define MAXSIZE 10 
    extern int32_t array[MAXSIZE];

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.11.

  • При объявлении перечислений старайтесь избегать смешивания неявных и явных спецификаций.

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

    enum color {red = 2, blue, green = 3, yellow};

    Вместо этого используйте:

    enum color {red = 2, blue, green, yellow};

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.12.

  • При объявлении указателей указывайте на const-qualified type, если вы не хотите использовать указатель для изменения объекта.

    Указание на const-qualified type по умолчанию, если только вы не хотите использовать указатель для изменения остроконечного объекта. Например, в этом примере ptr не используется для изменения заостренного объекта:

    char last_char(const char * const ptr){
    }

    Таким образом, вы не нарушаете MISRA C:2012 Rule 8.13.