 
                            If a function is reentered during the initialization of a static object inside that function, the behavior of the program is undefined. Please note that this problem is not the same as infinite recursion. For this problem to occur, a function need only recur once.
Wiki Markup 
The zero-initialization of all local objects with static storage duration or thread storage duration is performed before any other initialization takes place. Constant initialization of a local entity with static storage duration, if applicable, is performed before its block is first entered. An implementation is permitted to perform early initialization of other local objects with static or thread storage duration under the same conditions that an implementation is permitted to statically initialize an object with static or thread storage duration in namespace scope. Otherwise such an object is initialized the first time control passes through its declaration; such an object is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration. If control enters the declaration concurrently while the object is being initialized, the concurrent execution shall wait for completion of the initialization. If control re-enters the declaration recursively while the object is being initialized, the behavior is undefined.
...
| Code Block | 
|---|
| terminate called after throwing an instance of '__gnu_cxx::recursive_init' what(): N9__gnu_cxx14recursive_initE Aborted (core dumped) | 
Compliant Solution
...
In   this   compliant   solution,  {{y}}  is   declared   before   being   assigned   a   value.   According   to  \ [[ISO/IEC   14882-2003|AA. Bibliography#ISO/IEC 14882-2003]\]   Section   6.7.4,   the   initialization   of  {{y}}  will   have   been   completed   at   the   end   of   the   declaration   and   before   the   assignment   of   a   value,   consequently   removing   the   possibility   of   undefined   behavior.
| Code Block | ||||
|---|---|---|---|---|
| 
 | ||||
| 
int test (int x) {
  x--;
  if (x < 0 || x > 10) {
    return 0;
  }
  else {
    static int y;
    y = test(x);  
    return y;
  }
}
 | 
...
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level | 
|---|---|---|---|---|---|
| DCL38-CPP | low | unlikely | medium | P2 | L3 | 
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Bibliography
Wiki Markup 
...
DCL37-CPP. Overloaded postfix operators should return const 02. Declarations and Initialization (DCL) 03. Expressions (EXP)