メインコンテンツ

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

MISRA C:2023 Rule 8.4

A compatible declaration shall be visible when an object or function with external linkage is defined

R2024a 以降

説明

ルール定義

A compatible declaration shall be visible when an object or function with external linkage is defined 1 .

根拠

オブジェクトまたは関数が定義されているときに宣言が可視である場合、コンパイラで宣言と定義に互換性があることをチェックできます。

MISRA C:2012 Rule 8.5のこのルールは、ヘッダー ファイル内でオブジェクト (または関数) を宣言し、そのオブジェクト (または関数) を定義または使用するソース ファイル内にそのヘッダー ファイルをインクルードする手法を強制します。

Polyspace 実装

ルール チェッカーでは以下の状況を検出します。

  • 事前の宣言なしでオブジェクトまたは関数が定義されている。

  • オブジェクトまたは関数の宣言と定義の間にデータ型の不一致がある。このような不一致もコンパイル エラーの原因となります。

現在、チェッカーは、仮定義 (指定子 extern を使用せずに宣言され、明示的に定義されていない変数) にフラグを設定します。ルール違反を避けるには、変数 static (1 つのファイルでのみ定義) を宣言するか、変数 extern を宣言して、その宣言の後に定義を続けます。

トラブルシューティング

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

すべて展開する

ヘッダー ファイル:


/* file.h */
extern int var2; 
void func2(void);

ソース ファイル:


/* file.c */
#include "file.h"

int var1 = 0;    /* Non compliant */
int var2 = 0;    /* Compliant */

void func1(void) {   /* Non compliant */
}

void func2(void) {   /* Compliant */
}

この例では、定義の前に宣言がないため、var1 および func1 の定義が準拠していません。


        void func(int param1, int param2);

void func(int param1, unsigned int param2) { /* Non compliant */
}

この例では、func の定義にその宣言とは異なるパラメーター タイプがあります。この宣言の不一致はコンパイル エラーの原因となります。Polyspace® はこの不一致に対してフラグを設定します。

チェック情報

グループ: 宣言と定義
カテゴリ: 必要
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.