MISRA Discussion Forums

Full Version: Rule 8.8
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
1. extern int s=10;
2. static int s;
3.
4. void foo()
5. {
6. /* Do Something*/
7. }


Is line 1 non compliant for Rule 8.8 in the above example. I'm confused since line 1 gives a definition and not just declaration.
Here I'm not able to make out whether the var 's' have external or internal linkage.

My compiler binds 's' var with extern linkage if a definition is given with extern.(is value is also assigned like the above case).
Code:
1. extern int s=10;
2. static int s;
In the first line "s" is declared with external linkage, whereas in the second line "s" is declared with internal linkage. This is undefined behaviour [ C90: Undef 8, C99: Undef 7 ] and is a violation of rule 1.3

However, if the first two lines are switched
Code:
1. static int s;
2. extern int s=10;
In this case "s" is declared with internal linkage in the first line. In the second line the declaration of "s" is not of external linkage, but instead takes the same linkage as the prior declaration which in this case is internal linkage. [See C99: Section 6.2.2 para 4 ]
Both declarations therefore have internal linkage. This is well-defined in C, but violates rule 8.8. Note: rule 8.8 applies to both definitions and declarations as stated in the Amplification.