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

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

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

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