From 1430a80456f40922a4efc2af71b5863662a6e456 Mon Sep 17 00:00:00 2001 From: Jan Rochel <jan.rochel@cea.fr> Date: Fri, 1 Mar 2024 17:12:08 +0100 Subject: [PATCH] [alias] add pathological example tests/known_bugs/union_readback.c The use of unions may lead to a crash in certain circumstances --- src/plugins/alias/src/abstract_state.ml | 3 +++ .../alias/tests/known_bugs/union_readback.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/plugins/alias/tests/known_bugs/union_readback.c diff --git a/src/plugins/alias/src/abstract_state.ml b/src/plugins/alias/src/abstract_state.ml index 25308698c08..811472106b7 100644 --- a/src/plugins/alias/src/abstract_state.ml +++ b/src/plugins/alias/src/abstract_state.ml @@ -173,6 +173,9 @@ module Readout = struct let modify_lval lv = match E.label e with | Field f -> let lhost, o = lv in lhost, Field (f, o) | Pointer -> + (* TODO: This Cil.typeOfLval may crash with a fatal kernel + error for certain reconstructed lvals involving a union + type. See tests/known_bugs/union_readback.c *) let ty = Cil.typeOfLval lv in if Cil.isArrayType ty then let lhost, o = lv in lhost, Index (Simplified.nul_exp, o) diff --git a/src/plugins/alias/tests/known_bugs/union_readback.c b/src/plugins/alias/tests/known_bugs/union_readback.c new file mode 100644 index 00000000000..893f065aa76 --- /dev/null +++ b/src/plugins/alias/tests/known_bugs/union_readback.c @@ -0,0 +1,19 @@ +// REPRODUCE: frama-c -alias -alias-verbose 2 union_readback.c +// BEHAVIOUR: fatal kernel error [kernel] test.c:10: Failure: +// typeOffset: Field r on a non-compound type 'char const **' +// EXPECTED: no error +// EXPLANATION: +// This happens during the readback phase while reconstructing lvals. +// The call [Cil.typeOfLval lv] on the reconstructed lval [lv] fails. +// FIX: take into account typing information during reconstruction. + +typedef struct s { + union { + const char **v; + } r; +} s; + +void f(const char** o) { + s flag; + flag.r.v = o; +} -- GitLab