メインコンテンツ

MISRA C:2023 Rule 8.6

An identifier with external linkage shall have exactly one external definition

R2024a 以降

説明

このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされますPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

ルール定義

An identifier with external linkage shall have exactly one external definition 1 .

根拠

複数の定義が異なるファイル内に存在する、あるいは定義が存在しない識別子を使用する場合、動作は未定義です。

定義が同一の場合でも、このルールでは異なるファイルでの複数の定義は許可されていません。

Polyspace 実装

チェッカーでは、定義が異なるファイルに出現している場合にのみ、複数の定義にフラグを設定します。

チェッカーは仮定義を定義と見なしません。たとえば、次のコードはルール違反ではありません。

int val;
int val=1;

関数がまったく定義されていなくても、外部リンクを含めて宣言されていて、ソース コード内で呼び出されている場合、チェッカーは違反を示しません。

トラブルシューティング

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

すべて展開する

1 つ目のソース ファイル:


/* file1.c */
extern int var = 1; /* Non compliant */

2 つ目のソース ファイル:


/* file2.c */
int var = 0;   
この例では、グローバル変数 var が何度も定義されています。static 修飾子で明示的に指定されない限り、これらの変数には外部リンクが含まれます。

ヘッダー ファイル:


/* file.h */
int func(int param);

1 つ目のソース ファイル:


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

int func(int param) { /* Non compliant */
    return param+1;
}

2 つ目のソース ファイル:


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

int func(int param) {  
    return param-1;
}

この例では、関数 func が何度も定義されています。static 修飾子で明示的に指定されない限り、これらの関数には外部リンクが含まれます。

チェック情報

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