diff --git a/tests/value/oracle/strings.res.oracle b/tests/value/oracle/strings.res.oracle index 42c9b97457147d7e7b3759de9093bf31002a7484..5e410a5aad929dc5580b43a5d42f68a94d87a59f 100644 --- a/tests/value/oracle/strings.res.oracle +++ b/tests/value/oracle/strings.res.oracle @@ -39,7 +39,7 @@ Y ∈ {0} Z ∈ {0} [eva] computing for function string_reads <- main. - Called from tests/value/strings.i:127. + Called from tests/value/strings.i:142. [eva] computing for function u <- string_reads <- main. Called from tests/value/strings.i:39. [kernel:annot:missing-spec] tests/value/strings.i:39: Warning: @@ -81,7 +81,7 @@ [eva] Recording results for string_reads [eva] Done for function string_reads [eva] computing for function string_writes <- main. - Called from tests/value/strings.i:128. + Called from tests/value/strings.i:143. [eva:alarm] tests/value/strings.i:64: Warning: out of bounds write. assert \valid(tmp); (tmp from nondet?s5 + 2:& c) @@ -91,12 +91,12 @@ out of bounds write. assert \valid(s6); [eva] Recording results for string_writes [eva] Done for function string_writes -[eva:locals-escaping] tests/value/strings.i:128: Warning: +[eva:locals-escaping] tests/value/strings.i:143: Warning: locals {c} escaping the scope of string_writes through s5 -[eva:locals-escaping] tests/value/strings.i:128: Warning: +[eva:locals-escaping] tests/value/strings.i:143: Warning: locals {c} escaping the scope of string_writes through s6 [eva] computing for function string_comparison <- main. - Called from tests/value/strings.i:129. + Called from tests/value/strings.i:144. [eva] computing for function u <- string_comparison <- main. Called from tests/value/strings.i:78. [eva] Done for function u @@ -153,17 +153,25 @@ assert \pointer_comparable((void *)("oh, hello" + 4), (void *)s7); [eva] Recording results for string_comparison [eva] Done for function string_comparison +[eva] computing for function wide_string_comparison <- main. + Called from tests/value/strings.i:145. +[eva:alarm] tests/value/strings.i:111: Warning: + pointer comparison. assert \pointer_comparable((void *)w1, (void *)w2); +[eva:alarm] tests/value/strings.i:114: Warning: + pointer comparison. assert \pointer_comparable((void *)w2, (void *)w3); +[eva] Recording results for wide_string_comparison +[eva] Done for function wide_string_comparison [eva] computing for function long_chain <- main. - Called from tests/value/strings.i:130. + Called from tests/value/strings.i:146. [eva] computing for function assigns <- long_chain <- main. - Called from tests/value/strings.i:120. + Called from tests/value/strings.i:135. [eva] using specification for function assigns -[eva] tests/value/strings.i:114: Warning: +[eva] tests/value/strings.i:129: Warning: no \from part for clause 'assigns *(p + (0 .. s - 1));' [eva] Done for function assigns [eva] computing for function strcmp <- long_chain <- main. - Called from tests/value/strings.i:121. -[eva:alarm] tests/value/strings.i:108: Warning: + Called from tests/value/strings.i:136. +[eva:alarm] tests/value/strings.i:123: Warning: out of bounds read. assert \valid_read(tmp_0); (tmp_0 from s2_0++) [eva] Recording results for strcmp @@ -261,6 +269,11 @@ T ∈ {0; 101} p ∈ {{ &s1[5] ; &s2[3] }} __retres ∈ {5} +[eva:final-states] Values at end of function wide_string_comparison: + w1 ∈ {{ L"abcdef" }} + w2 ∈ {{ L"def" }} + w3 ∈ {{ L"abc" }} + res ∈ {0} [eva:final-states] Values at end of function main: s1[0] ∈ {104} [1] ∈ {101} @@ -307,6 +320,8 @@ [from] Done for function string_comparison [from] Computing for function string_reads [from] Done for function string_reads +[from] Computing for function wide_string_comparison +[from] Done for function wide_string_comparison [from] Computing for function main [from] Done for function main [from] ====== DEPENDENCIES COMPUTED ====== @@ -349,6 +364,8 @@ S FROM \nothing (and SELF) T FROM s1[1] (and SELF) \result FROM s1{[0..2]; [4]}; cc +[from] Function wide_string_comparison: + \result FROM \nothing [from] Function main: s1{[3]; [6]} FROM cc s5 FROM s3; s8 @@ -401,6 +418,10 @@ tmp_3; tmp_4; __retres [inout] Inputs for function string_reads: s1[0..5]; cc +[inout] Out (internal) for function wide_string_comparison: + w1; w2; w3; res +[inout] Inputs for function wide_string_comparison: + \nothing [inout] Out (internal) for function main: s1{[3]; [6]}; s5; s6; cc; Q; R; S; T; U; V; W; X; Y; Z [inout] Inputs for function main: diff --git a/tests/value/strings.i b/tests/value/strings.i index 912cf516f9c570a4066951be8c13aa11caf9ab6e..0f6087161602aca84fc72009a38b18e5ccb75272 100644 --- a/tests/value/strings.i +++ b/tests/value/strings.i @@ -100,6 +100,21 @@ int string_comparison() { return cc; } +/* Currently, Eva does not support wide string comparisons: alarms are emitted + on any comparison involving a wide string. Tests are minimal for now. */ +int wide_string_comparison() { + char* w1 = L"abcdef"; + char* w2 = L"def"; + char* w3 = L"abc"; + int res = 0; + /* Must emit a comparison alarm. */ + if (w1 == w2) + res = 1; + /* Ideally, should not emit a comparison alarm. */ + if (w2 == w3) + res = -1; + return res; +} int strcmp(const char *s1, const char *s2) { @@ -127,5 +142,6 @@ void main() { string_reads (); string_writes (); string_comparison (); + wide_string_comparison (); long_chain (); }