From b666f1a05393f83a61db4e575d784bd3859b55a4 Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Mon, 25 Sep 2023 17:02:42 +0200 Subject: [PATCH] [kernel] fix missing function designator conversions to function ptr. ... but do not convert too many either. --- src/kernel_internals/typing/cabs2cil.ml | 5 +++-- tests/syntax/nullptr_fct.c | 4 ++++ tests/syntax/oracle/nullptr_fct.res.oracle | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml index 5d267f9428f..01377897fd6 100644 --- a/src/kernel_internals/typing/cabs2cil.ml +++ b/src/kernel_internals/typing/cabs2cil.ml @@ -5328,7 +5328,6 @@ and doExp local_env match e.enode, unrollType t with | (Lval(lv) | CastE(_, {enode = Lval lv})), TArray(tbase, _, a) -> mkStartOfAndMark loc lv, TPtr(tbase, a) - | Lval(Mem _, _), TFun _ -> e, t (* Do not turn pointer function types *) | (Lval(lv) | CastE(_, {enode = Lval lv})), TFun _ -> mkAddrOfAndMark loc lv, TPtr(t, []) | _, (TArray _ | TFun _) -> @@ -6016,7 +6015,9 @@ and doExp local_env if asconst = CConst then Kernel.warning ~current:true "ASSIGN in constant"; let se0 = unspecified_chunk empty in - let (r1,se1, e1', lvt) = doExp local_env CNoConst e (AExp None) in + let (r1,se1, e1', lvt) = + doExp local_env CNoConst e AExpLeaveArrayFun + in let lv = match e1'.enode with | Lval x when Cil.is_modifiable_lval x -> x diff --git a/tests/syntax/nullptr_fct.c b/tests/syntax/nullptr_fct.c index ca81cf98af7..8c61df5c2ec 100644 --- a/tests/syntax/nullptr_fct.c +++ b/tests/syntax/nullptr_fct.c @@ -4,4 +4,8 @@ void wrap (fun f) { if (f != (void*)0) f(); if (f != 0) f(); if (f != (int*)0) f(); + /* must also work when there's an implicit conversion from function + designator to function type... + */ + if (*f != 0) (*f)(); } diff --git a/tests/syntax/oracle/nullptr_fct.res.oracle b/tests/syntax/oracle/nullptr_fct.res.oracle index 4df294ff63d..c2c534d51fa 100644 --- a/tests/syntax/oracle/nullptr_fct.res.oracle +++ b/tests/syntax/oracle/nullptr_fct.res.oracle @@ -5,6 +5,7 @@ void wrap(void (*f)(void)) if (f != (void (*)(void))0) (*f)(); if (f != (void (*)(void))0) (*f)(); if (f != (void (*)(void))0) (*f)(); + if (f != (void (*)(void))0) (*f)(); return; } -- GitLab