...
This noncompliant code example is compliant conforms with the C11 standard; however, it fails to comply conform with C99. On a platform that complies with C99 but not C11If compiled with a C99 conforming implementation, this code demonstrates undefined behavior because the sequence point preceding the call to printf() comes between the call and the access by printf() of the string in the returned object:
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdio.h>
struct X { char a[8]; };
struct X salutation() {
struct X result = { "Hello" };
return result;
}
struct X addressee() {
struct X result = { "world" };
return result;
}
int main(void) {
printf("%s, %s!\n", salutation().a, addressee().a);
return 0;
}
|
Compliant Solution
...
This compliant solution stores the structures returned by the call to addressee() before calling the printf() function: Consequently this program complies conforms with both C99 and C11.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdio.h>
struct X { char a[8]; };
struct X salutation() {
struct X result = { "Hello" };
return result;
}
struct X addressee(void) {
struct X result = { "world" };
return result;
}
int main(void) {
struct X my_salutation = salutation();
struct X my_addressee = addressee();
printf("%s, %s!\n", my_salutation.a, my_addressee.a);
return 0;
}
|
Noncompliant Code Example
...
The following noncompliant code example attempts to retrieve an array and increment the array's first value. The array is part of a struct that is returned by a function call. Consequently the array has temporary lifetime, and modifying the array results in undefined behavior.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <stdio.h>
struct X { int a[6]; };
struct X addressee(void) {
struct X result = { { 1, 2, 3, 4, 5, 6 } };
return result;
}
int main(void) {
printf("%x", ++(addressee().a[0]));
return 0;
}
|
Compliant Solution
...
This compliant solution stores the structure returned by the call to addressee() as my_x before calling the printf() function. When the array is modified, its lifetime is no longer temporary, but matches the lifetime of the block in main().
...