MISRA Discussion Forums

Full Version: Rule 18.8 and clarification of "use" of VLA types
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
What exactly is meant by the "use" of "variable-length array types"? The examples suggest that the mere declaration of an object of variable length array type violates this rule which makes sense if the declaration is thought of as "using" the VLA type.

The example below declares a pointer to a VLA type and then dereferences the pointer:

typedef unsigned uint32_t;
typedef int int32_t;

void foo(uint32_t sz, int32_t (*ary)[sz], int32_t val) {
    (*ary)[0] = val;

Is the declaration of the pointer parameter ary a violation of this rule? Is the statement that dereferences ary a violation of this rule?
Rule 18.8 applies to uses of VLA types. The intention of the MISRA-C working group is that "uses" include the places where the type is "used".
  • Declaration of objects;
    typedef int32_t myVLA [x];
void foo(uint32_t sz,
         int32_t (*ary)[sz],   /* not compliant */
         int32_t val)
    (*ary)[0] = val;  /* not applicable to this rule */