C and C++


LANG.STRUCT.INIT.CYCLE : Initialization Cycle

Summary

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

Properties

Class Name Initialization Cycle
Significance reliability
Mnemonic LANG.STRUCT.INIT.CYCLE
Categories
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.
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Initialization Cycle"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

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;
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.