メインコンテンツ

MISRA C++:2008 Rule 5-2-12

An identifier with array type passed as a function argument shall not decay to a pointer.

説明

ルール定義

An identifier with array type passed as a function argument shall not decay to a pointer. 1

根拠

配列をポインターとして関数に渡すと、その配列のサイズ情報が失われます。配列のサイズ情報が失われると、混乱や予期せぬ動作につながる可能性があります。

配列をポインターとして関数に渡すことは避けてください。配列を関数に渡すには、配列をクラス オブジェクトにカプセル化し、そのオブジェクトを関数に渡します。C++11 以降、標準テンプレート ライブラリでは、配列を関数に渡すために使用できる複数のコンテナー クラスを実装しています。C++20 には、サイズ情報を維持するクラス std::span があります。

Polyspace 実装

関数インターフェイスで配列を使用すると、Polyspace® が違反を報告します。

トラブルシューティング

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

すべて展開する

void f1( int p[ 10 ] ); // Noncompliant

void f2( int ( &p )[ 10 ] );// Compliant 
void foo ()
{
int a[ 10 ];
f1( a );

f2( a ); 
}

この例では、f1() のインターフェイスで配列を使用しています。配列 a[10] をポインターとして f1() に渡すと、配列 a のサイズ情報が失われます。Polyspace は、この f1() の宣言にフラグを設定します。f2() の場合のように次元の情報を維持したまま配列を関数に渡す場合、Polyspace は違反を報告しません。

チェック情報

グループ: Expressions
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.