diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml index f6aebe306d45681b089a7e5e8c08a75260f7e139..f958082d4b04d4d907094cd9ea3fefcb985d5284 100644 --- a/src/kernel_internals/typing/cabs2cil.ml +++ b/src/kernel_internals/typing/cabs2cil.ml @@ -3399,9 +3399,13 @@ let rec setOneInit this o preinit = let l = Array.length !pArray in if l <= idx then begin let growBy = max (max 32 (idx + 1 - l)) (l / 2) in - let newarray = Array.make (growBy + idx) NoInitPre in - Array.blit !pArray 0 newarray 0 l; - pArray := newarray + try + let newarray = Array.make (growBy + idx) NoInitPre in + Array.blit !pArray 0 newarray 0 l; + pArray := newarray + with Invalid_argument _ | Out_of_memory -> + Kernel.abort ~current:true + "array length too large for Frama-C: %d" (idx) end end; pMaxIdx, pArray diff --git a/tests/syntax/oracle/very_large_integers.0.res.oracle b/tests/syntax/oracle/very_large_integers.0.res.oracle index 1236cc7d7251b2e8c568575ebd87c1f5fe81ecbc..aadc000d33d4ccd15c6d6c8d5d00427c21ff79cd 100644 --- a/tests/syntax/oracle/very_large_integers.0.res.oracle +++ b/tests/syntax/oracle/very_large_integers.0.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:25: User Error: +[kernel] very_large_integers.c:35: User Error: integer constant too large in expression (unsigned long long)999999999999999999 + 9999999999999999999 -[kernel] very_large_integers.c:26: User Error: +[kernel] very_large_integers.c:36: User Error: bitfield width is not a valid integer constant [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.1.res.oracle b/tests/syntax/oracle/very_large_integers.1.res.oracle index 0ceeff36ccde04c3d61ff573c96102096722534f..4f4479d850994060abd17b9c1bb2c03213580381 100644 --- a/tests/syntax/oracle/very_large_integers.1.res.oracle +++ b/tests/syntax/oracle/very_large_integers.1.res.oracle @@ -1,11 +1,11 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:32: User Error: +[kernel] very_large_integers.c:42: User Error: Cannot represent the integer 99999999999999999999U -[kernel] very_large_integers.c:32: User Error: +[kernel] very_large_integers.c:42: User Error: Cannot represent the integer 99999999999999999999U -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add diff --git a/tests/syntax/oracle/very_large_integers.10.res.oracle b/tests/syntax/oracle/very_large_integers.10.res.oracle index 468e5fb2083acf41ff3217f2eb0a4afcbb5e4412..b40b28536c462ed1cdf6e67e9bd4a8662508186b 100644 --- a/tests/syntax/oracle/very_large_integers.10.res.oracle +++ b/tests/syntax/oracle/very_large_integers.10.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:87: Failure: +[kernel] very_large_integers.c:97: Failure: Invalid digit 9 in integer literal '09876543210' in base 8. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.11.res.oracle b/tests/syntax/oracle/very_large_integers.11.res.oracle index c0fab3ffc4147ea4527558d6d2590660893ad8cf..26c3f665ecafde3a0756a18e39bff27fc10983c1 100644 --- a/tests/syntax/oracle/very_large_integers.11.res.oracle +++ b/tests/syntax/oracle/very_large_integers.11.res.oracle @@ -1,19 +1,19 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel:annot-error] very_large_integers.c:114: Warning: +[kernel:annot-error] very_large_integers.c:132: Warning: Invalid slevel directive. Ignoring code annotation [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization nondet ∈ [--..--] -[kernel:annot-error] very_large_integers.c:111: Warning: +[kernel:annot-error] very_large_integers.c:129: Warning: invalid loop unrolling parameter; ignoring -[kernel:annot-error] very_large_integers.c:113: Warning: +[kernel:annot-error] very_large_integers.c:131: Warning: invalid loop unrolling parameter; ignoring [eva] done for function main [eva] ====== VALUES COMPUTED ====== diff --git a/tests/syntax/oracle/very_large_integers.12.res.oracle b/tests/syntax/oracle/very_large_integers.12.res.oracle index 71f4141e2feac45abe01a04d0e72485ae2fbbfda..8b9b72707ecc9fd6c21a7915fd0c220d2c065b3f 100644 --- a/tests/syntax/oracle/very_large_integers.12.res.oracle +++ b/tests/syntax/oracle/very_large_integers.12.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:118: User Error: +[kernel] very_large_integers.c:136: User Error: Invalid digit 9 in integer literal '09' in base 8. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.13.res.oracle b/tests/syntax/oracle/very_large_integers.13.res.oracle index 3d0eb837dc4c63ebeadb4d593353cddca2ad52dd..3a4a0c0b8384464f300e6e536aa0a235f44df597 100644 --- a/tests/syntax/oracle/very_large_integers.13.res.oracle +++ b/tests/syntax/oracle/very_large_integers.13.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:92: User Error: +[kernel] very_large_integers.c:102: User Error: array length too large: 72057594037927937 [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.14.res.oracle b/tests/syntax/oracle/very_large_integers.14.res.oracle index d404452dfd895f433aa72dea49482f99e8643a49..8d7684b496fc3074cacf1497a58a1b93f44243ed 100644 --- a/tests/syntax/oracle/very_large_integers.14.res.oracle +++ b/tests/syntax/oracle/very_large_integers.14.res.oracle @@ -1,10 +1,10 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:103: User Error: +[kernel] very_large_integers.c:113: User Error: array length too large: 7205759403792794 [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.15.res.oracle b/tests/syntax/oracle/very_large_integers.15.res.oracle index dc363357b8e0127f7ae9529b4746e8c6280c06d0..adad50468228f08fd7b086a7df5e94d996d82dbe 100644 --- a/tests/syntax/oracle/very_large_integers.15.res.oracle +++ b/tests/syntax/oracle/very_large_integers.15.res.oracle @@ -1,22 +1,11 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) -[kernel] very_large_integers.c:123: Warning: - ignoring unrolling directive (not an understood constant expression) -/* Generated by Frama-C */ -int volatile nondet; -/*@ logic ℤ too_large_integer= 9999999999999999999; - */ -int main(void) -{ - int __retres; - /*@ loop pragma UNROLL 99999999999999999999; */ - while (nondet) ; - __retres = 0; - return __retres; -} - - +[kernel] very_large_integers.c:119: User Error: + array length too large for Frama-C: 72057594037927936 +[kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[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 new file mode 100644 index 0000000000000000000000000000000000000000..1d8fc3c7d7c010cb51c88aa883b1d8d7426f8e48 --- /dev/null +++ b/tests/syntax/oracle/very_large_integers.16.res.oracle @@ -0,0 +1,11 @@ +[kernel] Parsing very_large_integers.c (with preprocessing) +[kernel] very_large_integers.c:84: Warning: + ignoring invalid aligned attribute: __aligned__(9223372036854775808) +[kernel] very_large_integers.c:84: Warning: + ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ + (9223372036854775808) ) +[kernel] very_large_integers.c:123: User Error: + array length too large for Frama-C: 7205759403792793 +[kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add + '-kernel-msg-key pp' for preprocessing command. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.17.res.oracle b/tests/syntax/oracle/very_large_integers.17.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..3012ddb57d4c817230e4b623ba1731f31374dd26 --- /dev/null +++ b/tests/syntax/oracle/very_large_integers.17.res.oracle @@ -0,0 +1,22 @@ +[kernel] Parsing very_large_integers.c (with preprocessing) +[kernel] very_large_integers.c:84: Warning: + ignoring invalid aligned attribute: __aligned__(9223372036854775808) +[kernel] very_large_integers.c:84: Warning: + ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ + (9223372036854775808) ) +[kernel] very_large_integers.c:141: Warning: + ignoring unrolling directive (not an understood constant expression) +/* Generated by Frama-C */ +int volatile nondet; +/*@ logic ℤ too_large_integer= 9999999999999999999; + */ +int main(void) +{ + int __retres; + /*@ loop pragma UNROLL 99999999999999999999; */ + while (nondet) ; + __retres = 0; + return __retres; +} + + diff --git a/tests/syntax/oracle/very_large_integers.2.res.oracle b/tests/syntax/oracle/very_large_integers.2.res.oracle index 1b64027503125bcc49fc9d4599971c336cfb15b1..851e81eb0347ab34fc53a305992e740c3faed63b 100644 --- a/tests/syntax/oracle/very_large_integers.2.res.oracle +++ b/tests/syntax/oracle/very_large_integers.2.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:39: User Error: +[kernel] very_large_integers.c:49: User Error: integer constant too large in expression 9999999999999999999U -[kernel] very_large_integers.c:39: Failure: +[kernel] very_large_integers.c:49: Failure: Cannot understand the constants in case range [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.3.res.oracle b/tests/syntax/oracle/very_large_integers.3.res.oracle index 09f3e166f6fc16b424d6b82504c8e6acbd5ba5c2..b46e1c5c2cdc38eb7172f8fac3c72b50af75f6c1 100644 --- a/tests/syntax/oracle/very_large_integers.3.res.oracle +++ b/tests/syntax/oracle/very_large_integers.3.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:47: Failure: Case range too large +[kernel] very_large_integers.c:57: Failure: Case range too large [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.4.res.oracle b/tests/syntax/oracle/very_large_integers.4.res.oracle index b4a00ef7aed6589641454c16903b943c79833606..5e6c8b87f5192cbca50ffe3fb8ef83cb69bb860b 100644 --- a/tests/syntax/oracle/very_large_integers.4.res.oracle +++ b/tests/syntax/oracle/very_large_integers.4.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:52: User Error: +[kernel] very_large_integers.c:62: User Error: Array length 9999999999999999999U is too big: no explicit initializer allowed. [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.5.res.oracle b/tests/syntax/oracle/very_large_integers.5.res.oracle index e38af09ec48d06731752da54ed19b9dcfb554195..4d011e9d84409f07345491a9d08de690be085027 100644 --- a/tests/syntax/oracle/very_large_integers.5.res.oracle +++ b/tests/syntax/oracle/very_large_integers.5.res.oracle @@ -1,12 +1,12 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:56: User Error: +[kernel] very_large_integers.c:66: User Error: INDEX initialization designator overflows - 54 - 55 #ifdef INIT_DESIGNATOR2 - 56 int arr3[1] = { [9999999999999999999U] = 42 }; + 64 + 65 #ifdef INIT_DESIGNATOR2 + 66 int arr3[1] = { [9999999999999999999U] = 42 }; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 57 #endif - 58 + 67 #endif + 68 [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.6.res.oracle b/tests/syntax/oracle/very_large_integers.6.res.oracle index dd10e931b3a969b30c76a65f4809e6a6cc45855e..c603644b586085db6acb633701ae40c06a261e5f 100644 --- a/tests/syntax/oracle/very_large_integers.6.res.oracle +++ b/tests/syntax/oracle/very_large_integers.6.res.oracle @@ -1,9 +1,9 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:60: User Error: +[kernel] very_large_integers.c:70: User Error: integer constant too large in expression -9999999999999999999U -[kernel] very_large_integers.c:60: User Error: +[kernel] very_large_integers.c:70: User Error: integer constant too large in expression 9999999999999999999U -[kernel] very_large_integers.c:60: Failure: +[kernel] very_large_integers.c:70: Failure: INDEX_RANGE initialization designator is not a valid constant [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. diff --git a/tests/syntax/oracle/very_large_integers.7.res.oracle b/tests/syntax/oracle/very_large_integers.7.res.oracle index 406e636f4628df47d7cbd15e4cb0569b412feddc..5ca8f61644c59e35ad6866a23f53a401e46009c8 100644 --- a/tests/syntax/oracle/very_large_integers.7.res.oracle +++ b/tests/syntax/oracle/very_large_integers.7.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:64: Failure: INDEX_RANGE too large +[kernel] very_large_integers.c:74: Failure: INDEX_RANGE too large [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add '-kernel-msg-key pp' for preprocessing command. [kernel] Frama-C aborted: invalid user input. diff --git a/tests/syntax/oracle/very_large_integers.8.res.oracle b/tests/syntax/oracle/very_large_integers.8.res.oracle index 8de4f1b1a653361bea91ef257e180702797f46ce..bf9a096053416e2ccb7778ba85efc209edc8d656 100644 --- a/tests/syntax/oracle/very_large_integers.8.res.oracle +++ b/tests/syntax/oracle/very_large_integers.8.res.oracle @@ -1,9 +1,9 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:69: User Error: +[kernel] very_large_integers.c:79: User Error: Invalid attribute constant: 0x80000000000000000 -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add diff --git a/tests/syntax/oracle/very_large_integers.9.res.oracle b/tests/syntax/oracle/very_large_integers.9.res.oracle index fb843772ce75ca63700e1629a728e82e4f660024..2c2a6cbdf3ab7e69653f75f37b88839bf91fe53d 100644 --- a/tests/syntax/oracle/very_large_integers.9.res.oracle +++ b/tests/syntax/oracle/very_large_integers.9.res.oracle @@ -1,7 +1,7 @@ [kernel] Parsing very_large_integers.c (with preprocessing) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__(9223372036854775808) -[kernel] very_large_integers.c:74: Warning: +[kernel] very_large_integers.c:84: Warning: ignoring invalid aligned attribute: __aligned__((9223372036854775808)+ (9223372036854775808) ) [kernel] Failure: Cannot represent logical integer in C: 9999999999999999999 diff --git a/tests/syntax/very_large_integers.c b/tests/syntax/very_large_integers.c index 996c0ca0bf0ce2528d4ebb0cd4fe8801b4426e67..02f67ae756044c9e232212160f82af45e9017f32 100644 --- a/tests/syntax/very_large_integers.c +++ b/tests/syntax/very_large_integers.c @@ -16,10 +16,20 @@ STDOPT: #"-cpp-extra-args=-DCABS_DOWHILE" STDOPT: #"-cpp-extra-args=-DARRAY_INIT1" STDOPT: #"-cpp-extra-args=-DARRAY_INIT2" + STDOPT: #"-cpp-extra-args=-DARRAY_INIT3" + STDOPT: #"-cpp-extra-args=-DARRAY_INIT4" EXIT: 0 STDOPT: #"-cpp-extra-args=-DUNROLL_PRAGMA" */ + + + + + + +// Lines intentionally left blank to minimize future oracle changes + volatile int nondet; #ifdef BITFIELD struct st { @@ -105,6 +115,14 @@ struct st s = { }; #endif +#ifdef ARRAY_INIT3 +int ai3[] = {0xdead, [72057594037927936] = 0xbeef}; +#endif +#ifdef ARRAY_INIT4 +// Previously caused Out of memory +int ai4[] = {1, [7205759403792793] = 11}; +#endif + int main() { #ifdef EVA_UNROLL //@ loop unroll (-9999999999999999999); // IntLimit