...
This noncompliant code example declares the variable y
as a static int. The value of test( x)
is assigned to y
within the test(int x)
function. However, when test(int x)
is called with an input that results in reaching the initialization of y
more than once, such as the value 12, undefined behavior occurs. Note that this code does not present an infinite recursion and still causes the undefined behavior mentioned.
Code Block |
---|
|
int test (int x) {
x--;
if (x < 0 || x > 10) {
return 0;
}
else {
static int y = test(x); //<--undefined behavior occurs here
return y;
}
}
|
...
Wiki Markup |
---|
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;
}
}
|
...