メインコンテンツ

MISRA C:2012 Dir 4.12

Dynamic memory allocation shall not be used

説明

ルール定義

Dynamic memory allocation shall not be used 1 .

根拠

標準ライブラリまたはサードパーティ ライブラリによって提供される動的メモリ割り当ておよび割り当て解除のルーチンを使用すると、未定義の動作が発生する可能性があります。次に例を示します。

  • free を使用して、malloccallocrealloc で割り当てていないメモリの割り当てを解除する。

  • 解放されたメモリの場所を指すポインターを使用する。

  • 内部に値を格納していない割り当て済みメモリにアクセスする。

サードパーティ ライブラリを使用した動的メモリ割り当ておよび割り当て解除のルーチンは、未定義の動作に類する挙動を引き起こす可能性があります。

動的メモリ割り当ておよび割り当て解除のルーチンを使用する場合は、プログラムの動作が確実に予測可能であるようにします。たとえば、メモリ不足による割り当てエラーを安全に処理できるようにする必要があります。

トラブルシューティング

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

すべて展開する

#include <stdlib.h>

static int foo(void);

typedef struct struct_1 {
    int a;
    char c;
} S_1;

static int foo(void) {

    S_1 * ad_1;
    int  * ad_2;
    int  * ad_3;

    ad_1 = (S_1*)calloc(100U, sizeof(S_1));        /* Non-compliant */
    ad_2 = malloc(100U * sizeof(int));             /* Non-compliant */
    ad_3 = realloc(ad_3, 60U * sizeof(long));      /* Non-compliant */

    free(ad_1);                                    /* Non-compliant */
    free(ad_2);                                    /* Non-compliant */
    free(ad_3);                                    /* Non-compliant */

    return 1;
}

この例では、関数 malloccallocrealloc および free が使用される場合、ルールに違反します。

チェック情報

グループ: Code design
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2019b で導入


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.