Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rule 13.6 - VLA, 'volatile' and Rule Exception
A qualifier in the declaration of an array applies to the element type, C11 6.7.3/9:
Quote:If the specification of an array type includes any type qualifiers, the element type is so-
qualified, not the array type.

uint32_t f1 (int32_t x) {

      volatile int32_t a1[x];
               int32_t a2[x];

      return sizeof (a1) + sizeof (a2);

The Exception to this rule includes:
Quote:... is an lvalue with a volatile qualified type that is not a variable-length array...

Given that the qualifier applies to the element type and not the array type, "not a variable-length array" is always true for an lvalue with volatile type. Is it the intention for 'sizeof(a1)' to be non compliant and for 'sizeof(a2)' to be compliant?

The Exception could be seen to add to the set of non-compliant cases even though nothing is written explicitly in the Amplification or Rationale.


The MISRA-C working group agrees that the wording of the exception could be improved. The aim of the exception was to permit expressions with a volatile type, but not if the expression also contains a VLA declaration.

The exception should be interpreted as follows. sizeof(V) is permitted where V is an expression which:
1. Yields an lvalue with a volatile qualified type; and
2. Does not include a declaration of a variable-length array.

In conclusion, both a1 and a2 are compliant with this rule as the type being accessed is an "array type" not a volatile type.
Posted by and on behalf of the MISRA C Working Group

Forum Jump:

Users browsing this thread: 1 Guest(s)