Skip to content
  • Nick Mathewson's avatar
    Use autoconf's FLEXIBLE_ARRAY_MEMBER for unspecified-length arrays · d4165ef8
    Nick Mathewson authored
    C99 allows a syntax for structures whose last element is of
    unspecified length:
       struct s {
         int elt1;
         ...
         char last_element[];
       };
    
    Recent (last-5-years) autoconf versions provide an
    AC_C_FLEXIBLE_ARRAY_MEMBER test that defines FLEXIBLE_ARRAY_MEMBER
    to either no tokens (if you have c99 flexible array support) or to 1
    (if you don't).  At that point you just use offsetof
    [STRUCT_OFFSET() for us] to see where last_element begins, and
    allocate your structures like:
    
       struct s {
         int elt1;
         ...
         char last_element[FLEXIBLE_ARRAY_MEMBER];
       };
    
       tor_malloc(STRUCT_OFFSET(struct s, last_element) +
                                       n_elements*sizeof(char));
    
    The advantages are:
    
       1) It's easier to see which structures and elements are of
          unspecified length.
       2) The compiler and related checking tools can also see which
          structures and elements are of unspecified length, in case they
          wants to try weird bounds-checking tricks or something.
       3) The compiler can warn us if we do something dumb, like try
          to stack-allocate a flexible-length structure.
    d4165ef8