メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2012 Rule 22.1

All resources obtained dynamically by means of Standard Library functions shall be explicitly released

説明

ルール定義

All resources obtained dynamically by means of Standard Library functions shall be explicitly released 1 .

根拠

リソースは、いったんそれを使用したらシステムに返すべきものです。例には、動的に割り当てられたメモリとファイル記述子が含まれています。

リソースをできるだけ早く、明示的に解放しないと、リソースが使い果たされることでエラーが発生する可能性があります。

Polyspace 実装

チェッカーは以下の関数の使用に対してフラグを設定します。

  • メモリが解放されていない場合のメモリ割り当て関数 (mallocaligned_alloc など)。

  • ファイルが閉じられていない場合のファイルを開く関数 (fopen など)。

このルールは Bug Finder 解析でのみチェックできます。

トラブルシューティング

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

すべて展開する

#include<stdlib.h>

void performOperation(int);

int func1(int num)
{
    int* arr1 = (int*) malloc(num * sizeof(int));

    return 0; /* Non-compliant - memory allocated to arr1 is not released */
}

int func2(int num)
{
    int* arr2 = (int*) malloc(num * sizeof(int));

    free(arr2);
    return 0; /* Compliant - memory allocated to arr2 is released */
}

この例では、関数 malloc を使用して動的に割り当てられたメモリが、スコープの終了前に関数 free を使用して解放されない場合、ルールに違反しています。

#include <stdio.h>
void func1( void ) {
    FILE *fp1;
    fp1 = fopen ( "data1.txt", "w" );
    fprintf ( fp1, "*" );

    fp1 = fopen ( "data2.txt", "w" );              /* Non-compliant */
    fprintf ( fp1, "!" );
    fclose ( fp1 );
}

void func2( void ) {
    FILE *fp2;
    fp2 = fopen ( "data1.txt", "w" );
    fprintf ( fp2, "*" );
    fclose(fp2);

    fp2 = fopen ( "data2.txt", "w" );              /* Compliant */
    fprintf ( fp2, "!" );
    fclose ( fp2 );
}

この例では、ファイル ポインター fp1 がファイル data1.txt を指しています。fp1 は、data1.txt のファイル ストリームから明示的に分離される前に、別のファイル data2.txt へのアクセスに使用されています。したがって、ルール 22.1 に違反します。

func2 にルールの違反はありません。ファイル data1.txt は閉じられており、ファイル ポインター fp2 は再使用される前に明示的に data1.txt から分離されているためです。

チェック情報

グループ: Resources
カテゴリ: 必要
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.