From 93493dc2715ef257700d6844a42f4d7688cd4f79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Thu, 1 Sep 2022 09:28:57 +0200
Subject: [PATCH] [Eva] Fixes a crash on recursive functions with a
 specification but no assigns.

---
 src/plugins/eva/engine/recursion.ml | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/plugins/eva/engine/recursion.ml b/src/plugins/eva/engine/recursion.ml
index 4668713a370..88365a5169f 100644
--- a/src/plugins/eva/engine/recursion.ml
+++ b/src/plugins/eva/engine/recursion.ml
@@ -44,6 +44,11 @@ let mark_unknown_requires kinstr kf funspec =
   in
   List.iter emit_behavior funspec.spec_behavior
 
+let need_assigns funspec =
+  match Cil.find_default_behavior funspec with
+  | None -> true
+  | Some bhv -> bhv.b_assigns = WritesAny
+
 let get_spec kinstr kf =
   let funspec = Annotations.funspec ~populate:false kf in
   if List.for_all (fun b -> b.b_assigns = WritesAny) funspec.spec_behavior
@@ -75,6 +80,15 @@ let get_spec kinstr kf =
         (if depth > 0 then Format.asprintf " of depth %i" depth else "")
         Kernel_function.pretty kf
     in
+    let funspec =
+      if need_assigns funspec
+      then
+        begin
+          ignore (!Annotations.populate_spec_ref kf funspec);
+          Annotations.funspec ~populate:false kf
+        end
+      else funspec
+    in
     mark_unknown_requires kinstr kf funspec;
     funspec
 
-- 
GitLab