From 1b8c864fc7c2f1b3eece5135330904cc867298b9 Mon Sep 17 00:00:00 2001
From: Thibault Martin <thi.martin.pro@pm.me>
Date: Mon, 24 Jun 2024 23:04:58 +0200
Subject: [PATCH] [kernel] Handle noreturn attr in Interpreted_automata

---
 .../analysis/interpreted_automata.ml            | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/kernel_services/analysis/interpreted_automata.ml b/src/kernel_services/analysis/interpreted_automata.ml
index 29f82f78abe..6e6d3de14c2 100644
--- a/src/kernel_services/analysis/interpreted_automata.ml
+++ b/src/kernel_services/analysis/interpreted_automata.ml
@@ -245,6 +245,13 @@ let last_loc block =
   try f (List.rev block.bstmts)
   with Not_found -> unknown_loc
 
+let has_noreturn_attr = function
+  | Call (_, {enode = Lval (Var vf, NoOffset)}, _, _) ->
+    Cil.hasAttribute "noreturn" vf.vattr
+  | Call (_, f, _, _) ->
+    Cil.typeHasAttribute "noreturn" (Cil.typeOf f)
+  | _ -> false
+
 module LabelMap = struct
   include Cil_datatype.Logic_label.Map
   let add_builtin name = add (BuiltinLabel name)
@@ -375,6 +382,7 @@ let build_automaton ~annotations kf =
   and return_point = add_vertex () in
   let start_code = if annotations then add_vertex () else entry_point in
   let end_code = if annotations then add_vertex () else return_point in
+  let exit_point = add_vertex () in
 
   (* AST traversal *)
   let rec do_block control kinstr labels block =
@@ -431,8 +439,13 @@ let build_automaton ~annotations kf =
     (* Handle statement *)
     let dest = match stmt.skind with
       | Cil_types.Instr instr ->
-        add_edge control.src control.dest kinstr (Instr (instr, stmt)) loc;
-        control.dest
+        let dest =
+          if has_noreturn_attr instr
+          then exit_point
+          else control.dest
+        in
+        add_edge control.src dest kinstr (Instr (instr, stmt)) loc;
+        dest
 
       | Cil_types.Return (opt_exp, _) ->
         let exited_blocks = Kernel_function.find_all_enclosing_blocks stmt in
-- 
GitLab