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

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

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

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

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

    extern void foo (char c, const k);

    Вместо этого использование:

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.1 (Polyspace Code Prover Access).

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

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

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

    Вместо этого использование:

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.2 (Polyspace Code Prover Access).

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

    Чтобы использовать объект в нескольких исходных файлах, объявите его как 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 (Polyspace Code Prover Access), MISRA C:2012 Rule 8.4 (Polyspace Code Prover Access), MISRA C:2012 Rule 8.5 (Polyspace Code Prover Access) или MISRA C:2012 Rule 8.6 (Polyspace Code Prover Access).

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

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

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.7 (Polyspace Code Prover Access) и MISRA C:2012 Rule 8.8 (Polyspace Code Prover Access).

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

    Постарайтесь не объявлять объект вне функции.

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

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

    Вместо этого использование:

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.7 (Polyspace Code Prover Access) и MISRA C:2012 Rule 8.9 (Polyspace Code Prover Access).

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

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

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.10 (Polyspace Code Prover Access).

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

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

    extern int32_t array[];

    Вместо этого использование:

    #define MAXSIZE 10 
    extern int32_t array[MAXSIZE];

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.11 (Polyspace Code Prover Access).

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

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

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

    Вместо этого использование:

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

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.12 (Polyspace Code Prover Access).

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

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

    char last_char(const char * const ptr){
    }

    Тем путем вы не нарушаете MISRA C:2012 Rule 8.13 (Polyspace Code Prover Access).