C and C++


LANG.STRUCT.INIT.CYCLE : Initialization Cycle

要旨

A function is re-entered during initialization of one of its local static variables.

プロパティ

クラス名 Initialization Cycle
日本語クラス名 Initialization Cycle
クラス分類 信頼性 (reliability)
ニーモニック LANG.STRUCT.INIT.CYCLE
カテゴリー
CWE CWE:1419 Incorrect Initialization of Resource
CERT-CPP CERT-CPP:DCL56-CPP Avoid cycles during initialization of static objects
POW10 POW10:1 Restrict to simple control flow constructs.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Initialization Cycle"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

int recursive_init(int i){
  static int x = (i>0) ? (i + recursive_init(i-1)) : i;            // 'Initialization Cycle' warning issued here
  return x;
}

static int z = recursive_init(5);                                        // ok: z is not local to any function called during initialization of z 
                                                                         // In particular, it is not local to recursive_init().

int recursive_via_nonstatic(int i){                                      
  int x = (i>0) ? (i + recursive_via_nonstatic(i-1)) : i;                // ok: x is not local static 
  static int y = x;                                                      // ok: recursive_via_nonstatic() not called during this initialization 
  return y;
}

int recursive_elsewhere(int i){
  int x = (i>0) ? (i + recursive_elsewhere(i-1)) : i;                    // ok: x is not local static 
  static int y = 5;                                                      // ok: recursive_via_nonstatic() not called during this initialization 
  return x+y;
}

int indirect_recursive_init2(int i);

int indirect_recursive_init1(int i){
  static int x = (i>0) ? (i + indirect_recursive_init2(i-1)) : i;  // 'Initialization Cycle' warning issued here
  return x;
}

int indirect_recursive_init2(int i){
  return (i>0) ? (i + indirect_recursive_init1(i-1)) : i;
}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。