メインコンテンツ

CERT C: Rule DCL31-C

Declare identifiers before using them

説明

ルール定義

識別子を使用する前に宣言します。1

Polyspace 実装

ルール チェッカーは以下の問題をチェックします。

  • 型が明示的に指定されていない

  • 暗黙的な関数宣言

非準拠の識別子が使用されるたびにこの違反が報告されます。

すべて展開する

問題

ルール チェッカーは、関数パラメーターまたは戻り値の型が明示的に指定されていない状況にフラグを設定します。このルールのチェックを有効にするには、オプション [C 標準バージョン] (-c-version) で値 c90 を使用します。

リスク

状況によっては、C90 規格から型を省略できます。これらの場合、int 型が暗黙的に指定されます。しかし、明示的な型の省略は混乱の原因になる可能性があります。たとえば、extern void foo (char c, const k); の宣言において k の型は const int ですが const char を想定していた可能性があります。

以下において、暗黙的な型を使用する場合があります。

  • オブジェクト宣言

  • パラメーター宣言

  • メンバー宣言

  • typedef 宣言

  • 関数の戻り値の型

例 - 暗黙的な型
static foo(int a);  /* Non compliant */
static void bar(void);      /* Compliant */

この例では、foo の戻り値の型が暗黙的であるためルールに違反しています。

問題

この問題は、関数を宣言または定義する前に呼び出す場合に発生します。

リスク

暗黙的な宣言は、関数を宣言または定義する前に呼び出す場合に発生します。関数を呼び出す前に明示的に宣言すると、コンパイラにより引数と戻り値の型を宣言内のパラメーター タイプと一致させることができます。暗黙的な宣言が発生する場合、コンパイラにより引数と戻り値の型が仮定されます。たとえば、戻り値の型として int を仮定します。仮定は想定していた型と一致せず予期しない型変換を起こす可能性があります。

例 - 呼び出し前に宣言されていない関数
#include <math.h>

extern double power3 (double val, int exponent);
int getChoice(void);

double func() {
    double res;
    int ch = getChoice();
    if(ch == 0) {
        res = power(2.0, 10);    /* Non-compliant */
    }
    else if( ch==1) {
        res = power2(2.0, 10);   /* Non-compliant */
    }
    else {
        res = power3(2.0, 10);   /* Compliant */
        return res;
    }
}

double power2 (double val, int exponent) {
    return (pow(val, exponent));
}

この例では、宣言されていない関数がコード内で呼び出される場合、ルールに違反します。関数定義がコード内の後の方に存在する場合でも、ルール違反は発生します。

関数がコード内で呼び出される前に宣言される場合、ルールに違反しません。関数定義が別のファイルにありリンク段階でのみ使用できる場合、以下のいずれかの方法で関数を宣言できます。

  • 現在のファイル内で関数を extern キーワードで宣言する。

  • 関数をヘッダー ファイル内で宣言し、ヘッダー ファイルを現在のファイルにインクルードする。

チェック情報

グループ: 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.