diff options
author | Bernhard Schommer <bschommer@users.noreply.github.com> | 2018-08-20 10:42:22 +0200 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2018-08-20 10:42:21 +0200 |
commit | e9b5632617b1477603883aab543994e2a1c464ce (patch) | |
tree | d2f67322c1ff09ed2a6c6c3aa64e8b40421ade33 /cparser/Cutil.ml | |
parent | 6fc89e5c8c4a8f98ef0a4a03c00994bbfb146431 (diff) | |
download | compcert-e9b5632617b1477603883aab543994e2a1c464ce.tar.gz compcert-e9b5632617b1477603883aab543994e2a1c464ce.zip |
Additional checks for flex arrays in structs (#93)
* Error for structs with only flex array member
Flexible array members are only allowed if another member exists.
Bug 23324
* Added checks for nesting of structs with flex array members
Warn if a struct with a flex array member is used as array element
or member of another struct. Such usage is dubious.
Bug 23324
Don't warn if the struct-with-flex-array is a member of an union.
Diffstat (limited to 'cparser/Cutil.ml')
-rw-r--r-- | cparser/Cutil.ml | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/cparser/Cutil.ml b/cparser/Cutil.ml index 3e2dff36..dcafbea4 100644 --- a/cparser/Cutil.ml +++ b/cparser/Cutil.ml @@ -1048,6 +1048,17 @@ let is_bitfield env e = fld.fld_bitfield <> None | _ -> false +let contains_flex_array_mem env ty = + match unroll env ty with + | TStruct (id,_) -> + let ci = Env.find_struct env id in + let rec check_mem = function + | [] -> false + | [ { fld_typ = TArray(ty_elt, None, _) } ] -> true + | _::rem -> check_mem rem in + check_mem ci.ci_members + | _ -> false + (* Assignment compatibility check over attributes. Standard attributes ("const", "volatile", "restrict") can safely be added (to the rhs type to get the lhs type) but must not be dropped. |