diff --git a/src/kernel_services/abstract_interp/int_set.ml b/src/kernel_services/abstract_interp/int_set.ml index d4c45b4012f5f8d689e146ac34dcea3339bf10b4..47c3b99595189fb6c8d3d028ffa649fba37b71c6 100644 --- a/src/kernel_services/abstract_interp/int_set.ml +++ b/src/kernel_services/abstract_interp/int_set.ml @@ -111,12 +111,52 @@ let compare s1 s2 = let equal e1 e2 = compare e1 e2 = 0 +(* Used to print a compact representation of large integer sets. *) +type set_or_itv = + | Set of Int.t array + | Itv of Int.t * Int.t + +(* Converts a set into an ordered list of sets and intervals, fusing adjacent + integers into intervals. *) +let fuse_intervals s = + (* Add interval [b..e[ to the list [acc]. The interval can be a singleton. *) + let add_itv acc (b, e) = + let nb = Int.to_int_exn (Int.sub e b) in + (* If the interval is too small, uses a Set instead of Itv. *) + if nb > 3 + then Itv (b, Int.pred e) :: acc + else + let a = Array.init nb (fun i -> Int.add b (Int.of_int i)) in + (* If the last element of [acc] is a Set, adds [a] at its end. *) + match acc with + | Set a' :: tl -> Set (Array.append a' a) :: tl + | _ -> Set a :: acc + in + (* [start..prev[ is the current interval being built. *) + let f (acc, start, prev) curr = + if Int.equal prev curr + then (acc, start, Int.succ curr) + else (add_itv acc (start, prev), curr, Int.succ curr) + in + let list, start, curr = Array.fold_left f ([], s.(0), s.(0)) s in + List.rev (add_itv list (start, curr)) + +let pretty_array = + Pretty_utils.pp_iter ~pre:"@[<hov 1>{" ~suf:"}@]" ~sep:";@ " + Array.iter Int.pretty + +let pretty_set_or_itv fmt = function + | Set a -> pretty_array fmt a + | Itv (b, e) -> Format.fprintf fmt "[%a..%a]" Int.pretty b Int.pretty e + let pretty fmt s = - Pretty_utils.pp_iter - ~pre:"@[<hov 1>{" - ~suf:"}@]" - ~sep:";@ " - Array.iter Int.pretty fmt s + if Array.length s < 10 + then pretty_array fmt s + else + let union = Unicode.union_string () in + let sep = Scanf.format_from_string ("@ " ^ union ^ " ") "" in + Pretty_utils.pp_iter ~pre:"@[<hov 1>" ~suf:"@]" ~sep + List.iter pretty_set_or_itv fmt (fuse_intervals s) include Datatype.Make_with_collections (struct diff --git a/src/plugins/aorai/tests/ya/oracle/serial.res.oracle b/src/plugins/aorai/tests/ya/oracle/serial.res.oracle index f6cbbacc42cbecac9183de261ba17490eddb4cf3..fb69185c9377884bf38986c27bf55948689bb215 100644 --- a/src/plugins/aorai/tests/ya/oracle/serial.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/serial.res.oracle @@ -38,36 +38,9 @@ [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function input_data_post_func: - aorai_x1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_x2 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_y1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} + aorai_x1 ∈ [0..127] + aorai_x2 ∈ [0..127] + aorai_y1 ∈ [0..127] aorai_y2 ∈ [0..2147483647] aorai_CurOperation ∈ {2} aorai_CurOpStatus ∈ {1} @@ -82,36 +55,9 @@ aorai_StatesHistory_2 ∈ {14; 15; 16; 17; 18} [eva:final-states] Values at end of function input_data: Frama_C_entropy_source ∈ [--..--] - aorai_x1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_x2 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_y1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} + aorai_x1 ∈ [0..127] + aorai_x2 ∈ [0..127] + aorai_y1 ∈ [0..127] aorai_y2 ∈ [0..2147483647] aorai_CurOperation ∈ {2} aorai_CurOpStatus ∈ {1} @@ -121,7 +67,7 @@ [eva:final-states] Values at end of function input_status_post_func: aorai_CurOperation ∈ {1} aorai_CurOpStatus ∈ {1} - aorai_CurStates ∈ {8; 9; 10; 11; 12; 13; 19; 20; 21; 22; 23} + aorai_CurStates ∈ [8..13] ∪ [19..23] aorai_StatesHistory_1 ∈ {14; 15; 16; 17; 18} aorai_StatesHistory_2 ∈ {0; 19; 20; 21; 22; 23} [eva:final-states] Values at end of function input_status_pre_func: @@ -129,12 +75,12 @@ aorai_CurOpStatus ∈ {0} aorai_CurStates ∈ {14; 15; 16; 17; 18} aorai_StatesHistory_1 ∈ {0; 19; 20; 21; 22; 23} - aorai_StatesHistory_2 ∈ {1; 2; 3; 4; 5; 6; 14; 15; 16; 17; 18; 19} + aorai_StatesHistory_2 ∈ [1..6] ∪ [14..19] [eva:final-states] Values at end of function input_status: Frama_C_entropy_source ∈ [--..--] aorai_CurOperation ∈ {1} aorai_CurOpStatus ∈ {1} - aorai_CurStates ∈ {8; 9; 10; 11; 12; 13; 19; 20; 21; 22; 23} + aorai_CurStates ∈ [8..13] ∪ [19..23] aorai_StatesHistory_1 ∈ {14; 15; 16; 17; 18} aorai_StatesHistory_2 ∈ {0; 19; 20; 21; 22; 23} [eva:final-states] Values at end of function output_post_func: @@ -157,122 +103,33 @@ aorai_StatesHistory_2 ∈ {0} [eva:final-states] Values at end of function read: Frama_C_entropy_source ∈ [--..--] - s ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; - 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; - 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; - 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; - 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; - 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; - 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; - 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; - 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; - 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; - 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; - 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; - 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; - 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; - 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; - 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; - 249; 250; 251; 252; 253; 254; 255} + s ∈ [0..255] status ∈ {0; 2; 4; 6; 8; 10; 12; 14} or UNINITIALIZED __retres ∈ [-1..255] - aorai_x1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_x2 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_y1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} + aorai_x1 ∈ [0..127] + aorai_x2 ∈ [0..127] + aorai_y1 ∈ [0..127] aorai_y2 ∈ [0..2147483647] aorai_CurOperation ∈ {1; 2} aorai_CurOpStatus ∈ {1} aorai_CurStates ∈ {0; 19; 20; 21; 22; 23} - aorai_StatesHistory_1 ∈ {1; 2; 3; 4; 5; 6; 14; 15; 16; 17; 18} - aorai_StatesHistory_2 ∈ {0; 8; 9; 10; 11; 12; 13; 19; 20; 21; 22; 23} + aorai_StatesHistory_1 ∈ [1..6] ∪ [14..18] + aorai_StatesHistory_2 ∈ {0} ∪ [8..13] ∪ [19..23] [eva:final-states] Values at end of function main: Frama_C_entropy_source ∈ [--..--] - buffer[0] ∈ - {0; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; - 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; - 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; - 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; - 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; - 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; - 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; - 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; - 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; - 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255} - [1..2] ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; - 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; - 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; - 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; - 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; - 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; - 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127} + buffer[0] ∈ {0} ∪ [128..255] + [1..2] ∈ [0..127] [3..4] ∈ [0..2147483647] n ∈ {0; 1; 2; 3; 4} - aorai_x1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_x2 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} - aorai_y1 ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; - 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; - 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; - 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; - 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; - 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; - 125; 126; 127} + aorai_x1 ∈ [0..127] + aorai_x2 ∈ [0..127] + aorai_y1 ∈ [0..127] aorai_y2 ∈ [0..2147483647] aorai_CurOperation ∈ {0; 1; 2} aorai_CurOpStatus ∈ {0; 1} aorai_CurStates ∈ {0; 19; 20; 21; 22; 23} - aorai_StatesHistory_1 ∈ {1; 2; 3; 4; 5; 6; 14; 15; 16; 17; 18; 19} - aorai_StatesHistory_2 ∈ {0; 8; 9; 10; 11; 12; 13; 19; 20; 21; 22; 23} + aorai_StatesHistory_1 ∈ [1..6] ∪ [14..19] + aorai_StatesHistory_2 ∈ {0} ∪ [8..13] ∪ [19..23] [eva:summary] ====== ANALYSIS SUMMARY ====== ---------------------------------------------------------------------------- 11 functions analyzed (out of 11): 100% coverage. diff --git a/tests/value/ilevel.c b/tests/value/ilevel.c new file mode 100644 index 0000000000000000000000000000000000000000..cd68ed54ea80a0f2202a7373c2563e064534bfa7 --- /dev/null +++ b/tests/value/ilevel.c @@ -0,0 +1,48 @@ +/* run.config* + PLUGIN: @EVA_MAIN_PLUGINS@ inout,slicing + OPT: -eva @EVA_CONFIG@ -slice-return main -then-on "Slicing export" -eva -eva-ilevel 16 -eva-show-progress -then-on "default" -eva-ilevel 17 -then -eva-ilevel 48 + STDOPT: +"-eva-ilevel 400 -main large_ilevel" +*/ + +// Test in particular that ilevel is by-project, even though it is an ocaml ref + +#include "__fc_builtin.h" + +volatile int nondet; +int i, j, k, l; + +int main () { + do { i = nondet; } + while (! (0 <= i && i < 8)); + + do { j = nondet; } + while (! (0 <= j && j < 17)); + + k = j; + if (k == 16) k = 15; + + l = nondet; + if (nondet) { + //@ assert 0 <= l <= 4; + } else { + //@ assert 6 <= l <= 9; + } + Frama_C_show_each(l); // Possible problem with cache on offsetmap join + + return i+j+k+l; +} + +/* Tests printing large integer sets. */ +void large_ilevel (void) { + int i = Frama_C_interval(0, 10); + int j = nondet ? i : i - 25; + int k = Frama_C_interval(100, 200); + if (k == 128) return; + + int a[11] = {53, 17, 64, 99, 25, 12, 72, 81, 404, 303, -101}; + + int s2 = nondet ? 40 : (nondet ? 41 : 42); + int s1 = a[i]; + + int x = nondet ? (nondet ? j : k) : (nondet ? s1 : s2); +} diff --git a/tests/value/ilevel.i b/tests/value/ilevel.i deleted file mode 100644 index 30aaf6a78b8fe2795a46249604b5e0e6f7028aa7..0000000000000000000000000000000000000000 --- a/tests/value/ilevel.i +++ /dev/null @@ -1,27 +0,0 @@ -/* run.config* - PLUGIN: @EVA_MAIN_PLUGINS@ inout,slicing - OPT: -eva @EVA_CONFIG@ -slice-return main -then-on "Slicing export" -eva -eva-ilevel 16 -eva-show-progress -then-on "default" -eva-ilevel 17 -then -eva-ilevel 48 -*/ -// Test in particular that ilevel is by-project, even though it is an ocaml ref -volatile int v; -int i, j, k, l; -int main () { - do { i = v; } - while (! (0 <= i && i < 8)); - - do { j = v; } - while (! (0 <= j && j < 17)); - - k = j; - if (k == 16) k = 15; - - l = v; - if (v) { - //@ assert 0 <= l <= 4; - } else { - //@ assert 6 <= l <= 9; - } - Frama_C_show_each(l); // Possible problem with cache on offsetmap join - - return i+j+k+l; -} diff --git a/tests/value/oracle/ilevel.res.oracle b/tests/value/oracle/ilevel.0.res.oracle similarity index 68% rename from tests/value/oracle/ilevel.res.oracle rename to tests/value/oracle/ilevel.0.res.oracle index 042c98daaa39125f33b39a30cbfe8798a9b6d8b4..897c9e808ca3ad9d067d85a82e9051411385263d 100644 --- a/tests/value/oracle/ilevel.res.oracle +++ b/tests/value/oracle/ilevel.0.res.oracle @@ -1,18 +1,18 @@ -[kernel] Parsing ilevel.i (no preprocessing) +[kernel] Parsing ilevel.c (with preprocessing) [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization - v ∈ [--..--] + nondet ∈ [--..--] i ∈ {0} j ∈ {0} k ∈ {0} l ∈ {0} -[eva] ilevel.i:9: starting to merge loop iterations -[eva] ilevel.i:12: starting to merge loop iterations -[eva:alarm] ilevel.i:20: Warning: assertion got status unknown. -[eva:alarm] ilevel.i:22: Warning: assertion got status unknown. -[eva] ilevel.i:24: Frama_C_show_each: [0..9] +[eva] ilevel.c:15: starting to merge loop iterations +[eva] ilevel.c:18: starting to merge loop iterations +[eva:alarm] ilevel.c:26: Warning: assertion got status unknown. +[eva:alarm] ilevel.c:28: Warning: assertion got status unknown. +[eva] ilevel.c:30: Frama_C_show_each: [0..9] [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== @@ -43,14 +43,14 @@ [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization - v ∈ [--..--] + nondet ∈ [--..--] i ∈ {0} j ∈ {0} k ∈ {0} l ∈ {0} -[eva] ilevel.i:9: starting to merge loop iterations -[eva] ilevel.i:12: starting to merge loop iterations -[eva:alarm] ilevel.i:26: Warning: +[eva] ilevel.c:15: starting to merge loop iterations +[eva] ilevel.c:18: starting to merge loop iterations +[eva:alarm] ilevel.c:32: Warning: signed overflow. assert (int)((int)(i + j) + k) + l ≤ 2147483647; [eva] Recording results for main [eva] done for function main @@ -58,47 +58,44 @@ [eva:final-states] Values at end of function main: i ∈ {0; 1; 2; 3; 4; 5; 6; 7} j ∈ [0..16] - k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + k ∈ [0..15] l ∈ [--..--] __retres ∈ [--..--] [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization - v ∈ [--..--] + nondet ∈ [--..--] i ∈ {0} j ∈ {0} k ∈ {0} l ∈ {0} -[eva] ilevel.i:24: Frama_C_show_each: {0; 1; 2; 3; 4; 6; 7; 8; 9} +[eva] ilevel.c:30: Frama_C_show_each: {0; 1; 2; 3; 4; 6; 7; 8; 9} [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: i ∈ {0; 1; 2; 3; 4; 5; 6; 7} - j ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16} - k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + j ∈ [0..16] + k ∈ [0..15] l ∈ {0; 1; 2; 3; 4; 6; 7; 8; 9} __retres ∈ [0..47] [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization - v ∈ [--..--] + nondet ∈ [--..--] i ∈ {0} j ∈ {0} k ∈ {0} l ∈ {0} -[eva] ilevel.i:24: Frama_C_show_each: {0; 1; 2; 3; 4; 6; 7; 8; 9} +[eva] ilevel.c:30: Frama_C_show_each: {0; 1; 2; 3; 4; 6; 7; 8; 9} [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: i ∈ {0; 1; 2; 3; 4; 5; 6; 7} - j ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16} - k ∈ {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15} + j ∈ [0..16] + k ∈ [0..15] l ∈ {0; 1; 2; 3; 4; 6; 7; 8; 9} - __retres ∈ - {0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; - 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; - 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47} + __retres ∈ [0..47] diff --git a/tests/value/oracle/ilevel.1.res.oracle b/tests/value/oracle/ilevel.1.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..af0704f7b5dc3605bcf5703ca05d7133098127fb --- /dev/null +++ b/tests/value/oracle/ilevel.1.res.oracle @@ -0,0 +1,63 @@ +[kernel] Parsing ilevel.c (with preprocessing) +[eva] Analyzing a complete application starting at large_ilevel +[eva] Computing initial state +[eva] Initial state computed +[eva:initial-state] Values of globals at initialization + nondet ∈ [--..--] + i ∈ {0} + j ∈ {0} + k ∈ {0} + l ∈ {0} +[eva] computing for function Frama_C_interval <- large_ilevel. + Called from ilevel.c:37. +[eva] using specification for function Frama_C_interval +[eva] ilevel.c:37: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- large_ilevel. + Called from ilevel.c:39. +[eva] ilevel.c:39: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva] Recording results for large_ilevel +[eva] done for function large_ilevel +[eva] ====== VALUES COMPUTED ====== +[eva:final-states] Values at end of function large_ilevel: + Frama_C_entropy_source ∈ [--..--] + i_0 ∈ [0..10] + j_0 ∈ [-25..-15] ∪ [0..10] + k_0 ∈ [100..200] + a[0] ∈ {53} + [1] ∈ {17} + [2] ∈ {64} + [3] ∈ {99} + [4] ∈ {25} + [5] ∈ {12} + [6] ∈ {72} + [7] ∈ {81} + [8] ∈ {404} + [9] ∈ {303} + [10] ∈ {-101} + s2 ∈ {40; 41; 42} + s1 ∈ {-101; 12; 17; 25; 53; 64; 72; 81; 99; 303; 404} + x ∈ + {-101} ∪ [-25..-15] ∪ [0..10] + ∪ {12; 17; 25; 40; 41; 42; 53; 64; 72; 81} ∪ [99..127] ∪ [129..200] + ∪ {303; 404} +[from] Computing for function large_ilevel +[from] Computing for function Frama_C_interval <-large_ilevel +[from] Done for function Frama_C_interval +[from] Done for function large_ilevel +[from] ====== DEPENDENCIES COMPUTED ====== + These dependencies hold at termination for the executions that terminate: +[from] Function Frama_C_interval: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) + \result FROM Frama_C_entropy_source; min; max +[from] Function large_ilevel: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function large_ilevel: + Frama_C_entropy_source; i_0; j_0; tmp_0; k_0; a[0..10]; s2; tmp_2; + tmp_3; s1; x; tmp_4; tmp_5; tmp_6 +[inout] Inputs for function large_ilevel: + Frama_C_entropy_source; nondet