diff options
author | Bernhard Schommer <bschommer@users.noreply.github.com> | 2020-07-21 19:47:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-21 19:47:42 +0200 |
commit | 907a9042ffb8d21fece6fc8e663ce23d32aa8fa1 (patch) | |
tree | 612085a27a13608213f8478908cddcabdcd90b7a /cparser | |
parent | b23f94bd3a81dd585901d203f8939f494495674f (diff) | |
download | compcert-kvx-907a9042ffb8d21fece6fc8e663ce23d32aa8fa1.tar.gz compcert-kvx-907a9042ffb8d21fece6fc8e663ce23d32aa8fa1.zip |
More checks for __builtin_va_start (#250)
We check that this builtin function is only called from within a variadic
function and has the correct number of arguments.
Diffstat (limited to 'cparser')
-rw-r--r-- | cparser/Elab.ml | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml index ab91ada2..940c6f14 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -1808,14 +1808,18 @@ let elab_expr ctx loc env a = (preprocessing) --> __builtin_va_arg(ap, ty) (elaboration) --> __builtin_va_arg(ap, sizeof(ty)) *) - | CALL((VARIABLE "__builtin_va_start" as a1), [a2; a3]) -> + | CALL((VARIABLE "__builtin_va_start" as a1), args) -> if not ctx.ctx_vararg then error "'va_start' used in function with fixed args"; - let b1,env = elab env a1 in - let b2,env = elab env a2 in - let _b3,env = elab env a3 in - { edesc = ECall(b1, [b2]); - etyp = TVoid [] },env + let b1, env = elab env a1 in + begin match args with + | [a2; a3] -> + let b2,env = elab env a2 in + let _b3,env = elab env a3 in + { edesc = ECall(b1, [b2]); + etyp = TVoid [] },env + | _ -> fatal_error "'__builtin_va_start' expects 2 arguments" + end | BUILTIN_VA_ARG (a2, a3) -> let ident = |