MISRA C:2012 Dir 4.13

Функции, которые спроектированы, чтобы обеспечить операции на ресурсе, должны быть вызваны в соответствующей последовательности

Описание

Направляющее определение

Функции, которые спроектированы, чтобы обеспечить операции на ресурсе, должны быть вызваны в соответствующей последовательности.

Объяснение

Вы обычно используете функции, работающие с ресурсом следующим образом:

  1. Вы выделяете ресурс.

    Например, вы открываете файл или критический раздел.

  2. Вы используете ресурс.

    Например, вы читаете из файла или выполняете операции в критическом разделе.

  3. Вы освобождаете ресурс.

    Например, вы закрываете файл или критический раздел.

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

Реализация Polyspace

Polyspace® Bug Finder™ обнаруживает нарушение этого правила, если вы задаете многозадачные опции, и ваш код содержит один из этих дефектов:

  • Missing lock: Задача вызывает разблокировать функцию прежде, чем вызвать соответствующую функцию блокировки.

  • Missing unlock: Задача вызывает функцию блокировки, но заканчивается без вызова соответствия, разблокировали функцию.

  • Double lock: Задача вызывает функцию блокировки дважды без промежуточного вызова разблокировать функции.

  • Double unlock: Задача вызывает разблокировать функцию дважды без промежуточного вызова функции блокировки.

Для получения дополнительной информации о многозадачных опциях смотрите Многозадачность.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

typedef signed int int32_t;
typedef signed short int16_t;

typedef struct tag_mutex_t {
    int32_t value;
} mutex_t;


extern mutex_t mutex_lock   ( void );
extern void  mutex_unlock (  mutex_t m );

extern int16_t x;
void func(void);

void task1(void) {
     func();
}

void task2(void) {
     func();
}

void func ( void ) {
    mutex_t m = mutex_lock ( );  /* Non-compliant */

    if ( x > 0 )  {
        mutex_unlock ( m );
    }  else  {
        /* Mutex not unlocked on this path */
    }
}

В этом примере правило нарушено когда:

  • Вы указываете что функции mutex_lock и mutex_unlock соединяются.

    mutex_lock начинает критический раздел и mutex_unlock концы это.

  • Функциональный mutex_lock называется. Однако, если x <= 0, функциональный mutex_unlock не называется.

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

ОпцияСпецификация
Configure multitasking manually
Entry points

task1

task2

Critical section detailsStarting routineEnding routine
mutex_lockmutex_unlock

Для получения дополнительной информации об опциях см.:

Проверяйте информацию

Группа: проект Кода
Категория: консультация
Категория AGC: консультация
Введенный в R2015b