メインコンテンツ

MISRA C:2023 Rule 18.9

An object with temporary lifetime shall not undergo array-to-pointer conversion

R2024a 以降

説明

ルール定義

An object with temporary lifetime shall not undergo array-to-pointer conversion 1 .

根拠

配列が一時オブジェクトのメンバーである場合、その一時オブジェクトに対し、配列からポインターへの変換が適用される可能性があります。たとえば、以下の構造体 my_struct には配列が含まれています。次のようにすることで、一時的な有効期間をもつメンバー bytes を指すポインターを作成できます。

typedef struct my_struct {
	char bytes[10];
} MS;

MS get_my_struct();
p = get_my_struct().bytes;
get_my_struct().bytes を呼び出すと、一時的な構造体が作成されます。一時的な構造体の bytes 配列に含まれる最初の要素のアドレスは p に格納されます。p が指しているオブジェクトの有効期間は、このステートメントの直後に終了します。このポインターを使用して配列を変更するか、配列にアクセスすると、未定義の動作につながる可能性があります。

一時配列の有効期間は、次の時点で終了します。

  • C11 規格で定義されているように、一時配列を生成する完全な式が終了したとき。

  • C90 および C99 規格で定義されているように、次のシーケンス ポイントの後。シーケンス ポイントとは、プログラムの実行において、すべての前の評価が完了し、以降の評価がまだ開始されていない時点のことです。

未定義の動作を回避するには、配列を含む一時オブジェクトを名前付きオブジェクトに格納します。

Polyspace 実装

このルール チェッカーは、以下の条件が満たされた場合に違反を報告します。

  • コードで、配列を含む一時オブジェクト (構造体、共用体など) が作成される。

  • コードで、一時配列の読み取りまたは変更が試行される。

トラブルシューティング

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

すべて展開する

この例では、関数 getStruct()array_wrapper 構造体を返します。関数 foo()getStruct() を呼び出すと、配列を含む一時的な構造体が作成されます。この一時配列の読み取りまたは書き込みは、このルールに違反します。

 #include <stdint.h>


typedef struct array_wrapper {
    int a[10];
} AW;

AW getStruct();

void access_array(int *p);

void foo() {
    int* p;
    p = getStruct().a + 1;                 // Noncompliant
    *(&(getStruct().a[1])) = 1;            // Noncompliant
    *(getStruct().a + 1) = 1;              // Noncompliant
    access_array(getStruct().a + 1);       // Noncompliant
}

チェック情報

グループ: ポインターと配列
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2024a で導入


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.