メインコンテンツ

AUTOSAR C++14 Rule A18-5-1

Functions malloc, calloc, realloc and free shall not be used

説明

ルール定義

関数 malloc、calloc、realloc、free を使用してはなりません。

根拠

malloccallocreallocfree を使用した C スタイル メモリの割り当ておよび割り当て解除はタイプ セーフではなく、オブジェクトを作成/削除するためにクラスのコンストラクター/デストラクターを呼び出すことはありません。

たとえば、malloc はメモリをオブジェクトに割り当て、割り当てられた void* 型のメモリを指すポインターを返します。その後、プログラムは、返されたポインターを意図したオブジェクト型と一致しない可能性のある別の型に暗黙的にキャストする場合があります。

このような割り当て関数および割り当て解除関数の使用は、次の場合に未定義の動作を引き起こす可能性があります。

  • free を使用して、演算子 new で割り当てられたメモリの割り当てを解除する。

  • 演算子 delete を使用して、malloccallocrealloc で割り当てられたメモリの割り当てを解除する。

オーバーロードされた演算子 new および delete を使用して動的にメモリを割り当てたり割り当て解除したりした場合、または mallocfree の実装をカスタマイズした場合はルール違反とはなりません。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdint>
#include <cstdlib>

void func()
{

    std::int32_t* p1 = static_cast<std::int32_t*>(malloc(sizeof(std::int32_t))); // Non-compliant
    *p1 = 0;

    free(p1); // Non-compliant

    std::int32_t* p2 = new std::int32_t(0); // Compliant

    delete p2; // Compliant
}

この例では、malloc を使用したポインター p1 へのメモリ割り当て、および free を使用したメモリ割り当て解除は非準拠となります。このような演算はタイプ セーフではありません。代わりに、演算子 new および delete を使用してメモリの割り当てと割り当て解除を行います。

チェック情報

グループ: 18 言語サポート ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2019b で導入