DCL15-C. 外部結合を必要としないファイル有効範囲のオブジェクトや関数は static 宣言する
ファイル有効範囲のオブジェクトや関数がそのファイルの外から可視である必要がないのであれば、static
として宣言し隠すべきである。こうすることで、よりモジュール性の高いコードになり、グローバルな名前空間の汚染を制限することができる。
C 標準 [ISO/IEC 9899:2011] セクション 6.2.2 には、次のように記載されている。
オブジェクト又は関数に対するファイル有効範囲の識別子の宣言が記憶域クラス指定子
static
を含む場合、その識別子は、内部結合を持つ。
および
オブジェクトの識別子の宣言がファイルスコープをもち、かつ記憶域クラス指定子を持たない場合、その識別子の結合は、外部結合とする。
違反コード
以下のコードでは、helper()
関数は暗黙的に外部結合をもつと宣言されている。
enum { MAX = 100 }; int helper(int i) { /* i を使った何かしらの計算を行う */ } int main(void) { size_t i; int out[MAX]; for (i = 0; i < MAX; i++) { out[i] = helper(i); } /* ... */ }
適合コード
以下の適合コードは helper()
を内部結合をもつよう宣言しており、外部関数から使用されることを防止している。
enum {MAX = 100}; static int helper(int i) { /* i を使った何かしらの計算を行う */ } int main(void) { size_t i; int out[MAX]; for (i = 0; i < MAX; i++) { out[i] = helper(i); } /* ... */ }
リスク評価
あまりに多くのオブジェクトが外部結合をもつと、説明的な識別子を消費し尽くしてしまい、より複雑な識別子を使わなくてはならなくなったり、抽象モデルに違反したり、ライブラリと名前が衝突してしまうことになるかもしれない。翻訳単位でデータの抽象化を行っている場合、プライベート関数が抽象化の外から呼び出されてしまうかもしれない。
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
DCL15-C |
低 |
低 |
低 |
P3 |
L3 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
ECLAIR |
1.1 |
filscope |
実装済み |
LDRA tool suite |
V. 8.5.4 |
27 D |
実装済み |
PRQA QA-C | 8.1 |
1504 |
実装済み |
Splint |
V. 3.1.1 |
|
|
関連するガイドライン
CERT C++ Secure Coding Standard | DCL15-CPP. Declare file-scope objects or functions that do not need external linkage in an unnamed namespace |
参考資料
ISO/IEC 9899:2011 | Section 6.2.2, "Linkages of Identifiers" |
翻訳元
これは以下のページを翻訳したものです。
DCL15-C. Declare file-scope objects or functions that do not need external linkage as static (revision 46)