メインコンテンツ

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

CERT C: Rule DCL36-C

競合するリンクの分類をもつ識別子を宣言しない

説明

ルール定義

競合するリンクの分類をもつ識別子を宣言しないようにします。1

Polyspace 実装

ルール チェッカーは、"オブジェクト宣言内の static と extern の使用の不一致" をチェックします。

すべて展開する

問題

この問題は、内部リンクのあるオブジェクトや関数のすべての宣言で、static ストレージ クラス指定子の使用に一貫性がない場合に発生します。

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

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

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

リスク

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

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

例 - 変数の宣言の間におけるリンクの競合
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(void);  /* Compliant - declaration: internal linkage */
extern int ggg(void){  /* Non-compliant */
  return 1;
}

この例は 2 つの内部リンク違反を示しています。feeggg は内部リンクを含むため、MISRA™ に準拠するには static クラス指定子を使用しなければなりません。

チェック情報

グループ: Rule 02.宣言と初期化 (DCL)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.