メインコンテンツ

MISRA C:2023 Rule 8.8

The static storage class specifier shall be used in all declarations of objects and functions that have internal linkage

R2024a 以降

説明

ルール定義

The static storage class specifier shall be used in all declarations of objects and functions that have internal linkage 1 .

根拠

内部リンクをもつオブジェクトのすべての宣言で常に static 指定子を使用しているわけではない場合、外部リンクと内部リンクをもつ同じオブジェクトを宣言することになる場合があります。

この場合、そのリンクは可視化されているそれ以前の指定に従います (C99 規格、節 6.2.2)。たとえば、以前の指定で内部リンクを示している場合、以後の指定で外部リンクを示していても、オブジェクトには内部リンクが含まれます。以後の指定のみである場合は、それ以外の形になると想定されます。

Polyspace 実装

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

  • 同じオブジェクトが異なるストレージ指定子で複数回宣言されている。

  • 同じ関数が異なるストレージ指定子で宣言および定義されている。

トラブルシューティング

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

すべて展開する

static int foo = 0;
extern int foo;         /* Non-compliant */

extern int hhh;
static int hhh;         /* Non-compliant */

この例では、最初の行で内部リンクを含む foo が定義されています。例では static キーワードが使用されているため、最初の行は準拠しています。2 行目の宣言では static が使用されていないため、宣言は準拠していません。比較すると、3 行目は extern キーワードを使用して hhh を宣言し外部リンクを生成しています。4 行目は内部リンクを含む hhh を宣言していますが、この宣言は hhh の最初の宣言と競合します。

修正 — staticextern の整合性のある使用

1 つの修正方法として、staticextern を整合性をもつように使用します。

static int foo = 0;
static int foo;

extern int hhh;
extern int hhh;
static int fee(void);  /* Compliant - declaration: internal linkage */
int fee(void){         /* Non-compliant */
  return 1;
}

static int ggg(int);  /* Compliant - declaration: internal linkage */
extern int ggg(int x){  /* Non-compliant */
  return 1 + x;
}

この例は 2 つの内部リンク違反を示しています。feeggg は内部リンクを含むため、MISRA™ に準拠するには定義で 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.