メインコンテンツ

MISRA C:2012 Dir 4.13

Functions which are designed to provide operations on a resource should be called in an appropriate sequence

説明

このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされますPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

命令の定義

Functions which are designed to provide operations on a resource should be called in an appropriate sequence 1 .

根拠

通常、リソース上で動作する関数は、次の方法で使用されます。

  1. リソースを割り当てます。

    たとえば、ファイルやクリティカル セクションを開きます。

  2. リソースを使用します。

    たとえば、ファイルから読み取るかクリティカル セクションで操作を実行します。

  3. リソースの割り当てを解除します。

    たとえば、ファイルやクリティカル セクションを閉じます。

関数が予想どおりに動作するよう、手順を順番に実行します。たとえば、リソース割り当て関数をある特定の実行パスで呼び出す場合、そのパスでは割り当て解除関数を呼び出さなければなりません。

Polyspace 実装

Polyspace Bug Finder™ では、マルチタスキング オプションが指定され、かつコードに次の欠陥のいずれかが含まれている場合、このルールへの違反が検出されます。

マルチタスキング オプションについての詳細は、マルチタスキングを参照してください。

チェッカーの拡張

Polyspace ではサポートされていないマルチスレッド関数を使用する場合があります。その場合、マルチスレッド関数の各関数を、それぞれに対応する既知の POSIX® 関数にマッピングすることで、このチェッカーを拡張します。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する


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_lockmutex_unlock とが組み合わせで指定されている。

    クリティカル セクションは mutex_lock で開始され、mutex_unlock によって終了します。

  • 関数 mutex_lock が呼び出される。しかし、x <= 0 の場合、関数 mutex_unlock が呼び出されない。

このルール違反の検出を有効にするには、以下の解析オプションを指定しなければなりません。

オプション仕様
マルチタスクを手動で構成
エントリ ポイント

task1

task2

クリティカル セクション詳細開始ルーチン終了ルーチン
mutex_lockmutex_unlock

オプションについての詳細は、以下を参照してください。

チェック情報

グループ: Code design
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2015b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.