exponenta event banner

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 не вызывается.

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

ВыборСпецификация
Настройка многозадачности вручную
Точки входа

task1

task2

Детали критического разделаЗапуск подпрограммыЗавершение процедуры
mutex_lockmutex_unlock

Дополнительные сведения о параметрах см. в разделе:

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

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