From 9c42846dfc438b036de8dd516a54afd8ec914fa5 Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Wed, 24 Jan 2024 17:36:38 +0100 Subject: [PATCH] [kernel] better localisation for error msgs on array indices --- src/kernel_internals/typing/cabs2cil.ml | 15 +++++++++++---- .../oracle/very_large_integers.13.res.oracle | 2 +- .../oracle/very_large_integers.14.res.oracle | 6 +++--- .../oracle/very_large_integers.15.res.oracle | 2 +- .../oracle/very_large_integers.16.res.oracle | 2 +- .../oracle/very_large_integers.2.res.oracle | 2 +- .../oracle/very_large_integers.3.res.oracle | 2 +- .../oracle/very_large_integers.5.res.oracle | 2 +- 8 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml index c440701e41c..d98f976c738 100644 --- a/src/kernel_internals/typing/cabs2cil.ml +++ b/src/kernel_internals/typing/cabs2cil.ml @@ -128,10 +128,11 @@ let typeForInsertedVar: (Cil_types.typ -> Cil_types.typ) ref = ref (fun t -> t) let cabs_exp loc node = { expr_loc = loc; expr_node = node } let abort_context msg = - let pos = fst (Cil.CurrentLoc.get ()) in + let (p1,p2) = Cil.CurrentLoc.get() in let append fmt = Format.pp_print_newline fmt (); - Errorloc.pp_context_from_file fmt pos + Errorloc.pp_context_from_file + ~start_line:p1.pos_lnum ~start_char:(p1.pos_cnum -p1.pos_bol) fmt p2 in Kernel.abort ~current:true ~append msg @@ -2942,7 +2943,10 @@ let rec setOneInit this o preinit = let idx, (* Index in the current comp *) restoff (* Rest offset *) = match o with - | Index({enode = Const(CInt64(i,_,_))}, off) -> to_integer i, off + | NoOffset -> assert false + | Index({enode = Const(CInt64(i,_,_));eloc}, off) -> + CurrentLoc.set eloc; + to_integer i, off | Field (f, off) -> (* Find the index of the field *) let rec loop (idx: int) = function @@ -2958,7 +2962,9 @@ let rec setOneInit this o preinit = | _ :: restf -> loop (idx + 1) restf in loop 0 (Option.value ~default:[] f.fcomp.cfields), off - | _ -> abort_context "setOneInit: non-constant index" + | Index({ eloc },_) -> + CurrentLoc.set eloc; + abort_context "setOneInit: non-constant index" in let pMaxIdx, pArray = match this with @@ -8337,6 +8343,7 @@ and doInit local_env asconst add_implicit_ensures preinit so acc initl = end | Cabs.ATINDEX_INIT(idx, whatnext) -> begin + CurrentLoc.set idx.expr_loc; match unrollType so.soTyp with | TArray (bt, leno, _) -> let ilen = integerArrayLength leno in diff --git a/tests/syntax/oracle/very_large_integers.13.res.oracle b/tests/syntax/oracle/very_large_integers.13.res.oracle index baa5289f557..e74ad25634d 100644 --- a/tests/syntax/oracle/very_large_integers.13.res.oracle +++ b/tests/syntax/oracle/very_large_integers.13.res.oracle @@ -9,7 +9,7 @@ 100 #ifdef ARRAY_INIT1 101 // Previously caused Invalid_argument(Array.make) 102 int a1[] = {[72057594037927936] = 0}; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ 103 #endif 104 [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.14.res.oracle b/tests/syntax/oracle/very_large_integers.14.res.oracle index bfd5d8b7eb5..3ded691db12 100644 --- a/tests/syntax/oracle/very_large_integers.14.res.oracle +++ b/tests/syntax/oracle/very_large_integers.14.res.oracle @@ -5,12 +5,12 @@ ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] very_large_integers.c:106: User Error: Array length is too large. -[kernel] very_large_integers.c:113: User Error: +[kernel] very_large_integers.c:114: User Error: array length too large: 7205759403792794 - 111 }; 112 // Previously caused Out of memory 113 struct st s = { - ^^^^^^^^^^^^^^^ 114 {{[7205759403792793 ... 7205759403792793] = 0}} + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 115 }; + 116 #endif [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.15.res.oracle b/tests/syntax/oracle/very_large_integers.15.res.oracle index c8f36fffabb..b39f7c8df96 100644 --- a/tests/syntax/oracle/very_large_integers.15.res.oracle +++ b/tests/syntax/oracle/very_large_integers.15.res.oracle @@ -9,7 +9,7 @@ 117 118 #ifdef ARRAY_INIT3 119 int ai3[] = {0xdead, [72057594037927936] = 0xbeef}; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ 120 #endif 121 #ifdef ARRAY_INIT4 [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.16.res.oracle b/tests/syntax/oracle/very_large_integers.16.res.oracle index 773cecaac1f..eb45cfee5db 100644 --- a/tests/syntax/oracle/very_large_integers.16.res.oracle +++ b/tests/syntax/oracle/very_large_integers.16.res.oracle @@ -9,7 +9,7 @@ 121 #ifdef ARRAY_INIT4 122 // Previously caused Out of memory 123 int ai4[] = {1, [7205759403792793] = 11}; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ 124 #endif 125 [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.2.res.oracle b/tests/syntax/oracle/very_large_integers.2.res.oracle index 999706dea41..8fd8c4b251b 100644 --- a/tests/syntax/oracle/very_large_integers.2.res.oracle +++ b/tests/syntax/oracle/very_large_integers.2.res.oracle @@ -6,7 +6,7 @@ 47 void case_range() { 48 switch (nondetul) 49 case 0 ... 9999999999999999999U:; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 50 case 0 ... 199999999999999999U:; 51 } [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.3.res.oracle b/tests/syntax/oracle/very_large_integers.3.res.oracle index 7c9ba7c178f..f36fb4343d8 100644 --- a/tests/syntax/oracle/very_large_integers.3.res.oracle +++ b/tests/syntax/oracle/very_large_integers.3.res.oracle @@ -4,7 +4,7 @@ 55 void case_range2() { 56 switch (nondet) 57 case 0 ... 10000000U:; - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ 58 } 59 #endif [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.5.res.oracle b/tests/syntax/oracle/very_large_integers.5.res.oracle index 2dd40615234..0e84fc8e48c 100644 --- a/tests/syntax/oracle/very_large_integers.5.res.oracle +++ b/tests/syntax/oracle/very_large_integers.5.res.oracle @@ -4,7 +4,7 @@ 64 65 #ifdef INIT_DESIGNATOR2 66 int arr3[1] = { [9999999999999999999U] = 42 }; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^ 67 #endif 68 [kernel] Frama-C aborted: invalid user input. -- GitLab