メインコンテンツ

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

MISRA C++:2008 Rule 7-5-1

A function shall not return a reference or a pointer to an automatic variable (including parameters), defined within the function.

説明

ルール定義

A function shall not return a reference or a pointer to an automatic variable (including parameters), defined within the function. 1

根拠

関数のローカル オブジェクトは、関数呼び出しの最後に破棄されます。このようなオブジェクトのアドレスをポインターを介して返すと、破棄されたオブジェクトにアクセスする可能性があります。次に例を示します。

int* foo(int a){
	int b = a^2;
	return &b;
}
関数 foo() は、b へのポインターを返します。変数 b が関数呼び出しの最後でスコープから外れ、foo() から返されるポインターが破棄されたオブジェクトを指します。このポインターにアクセスすると、未定義の動作につながります。

Polyspace 実装

関数呼び出しの最後でスコープから外れる変数への参照またはポインターを関数が返す場合に、Polyspace® は違反を報告します。

トラブルシューティング

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

すべて展開する

int gVal;
//...

int* foo(void){
	int val;
	//...
	return &val;//Noncompliant
}

この例では、関数 foo()val のアドレスを返します。このローカル変数は、関数呼び出しの最後でスコープから外れます。foo() から返されるポインターにアクセスすると、未定義の動作が発生します。Polyspace が違反を報告します。

チェック情報

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

バージョン履歴

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.