From 20e6773d376b57d7c7f0ad893cdc5f8925442a78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Tue, 2 May 2023 14:07:28 +0200
Subject: [PATCH] [Eva] Octagons: do not infer relations or intervals on global
 initializations.

Fixes performance issues: the initialization of large arrays or structures
can lead to a very large number of relations or intervals.

Also, do not infer intervals on volatile lvalues.
---
 src/plugins/eva/domains/octagons.ml | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/plugins/eva/domains/octagons.ml b/src/plugins/eva/domains/octagons.ml
index 250832bcdcd..f547c7da3ce 100644
--- a/src/plugins/eva/domains/octagons.ml
+++ b/src/plugins/eva/domains/octagons.ml
@@ -1627,7 +1627,6 @@ module Domain = struct
     in
     eval_exp, eval_deps
 
-
   (* Domain functions *)
 
   let extract_expr ~oracle _context state expr =
@@ -1708,7 +1707,8 @@ module Domain = struct
     then state
     else
       match expr.enode with
-      | Lval lval when Cil.(isIntegralType (typeOfLval lval)) ->
+      | Lval lval when Cil.(isIntegralType (typeOfLval lval))
+                    && not (Eval_typ.lval_contains_volatile lval) ->
         let var = Variable.make_lval lval in
         let deps = Deps.add var (eval_deps var) state.deps in
         let intervals = Intervals.add var ival state.intervals in
@@ -1788,9 +1788,11 @@ module Domain = struct
     in
     state >>-: check "precise assign"
 
-  let assign _kinstr left_value expr assigned valuation state =
+  let assign kinstr left_value expr assigned valuation state =
     update valuation state >>- fun state ->
-    if Cil.isIntegralOrPointerType left_value.ltyp
+    if kinstr <> Kglobal
+    && Cil.isIntegralOrPointerType left_value.ltyp
+    && not (Eval_typ.lval_contains_volatile left_value.lval)
     then assign_variable left_value.lval expr assigned valuation state
     else
       let written_loc = Precise_locs.imprecise_location left_value.lloc in
-- 
GitLab