Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
frama-c
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
frama-c
Commits
e511c67e
Commit
e511c67e
authored
4 years ago
by
David Bühler
Committed by
Andre Maroneze
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
[Eva] Adds minimal tests of wide string comparisons.
Comparison alarms are emitted for any comparison involving wide strings.
parent
c12b257a
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
tests/value/oracle/strings.res.oracle
+31
-10
31 additions, 10 deletions
tests/value/oracle/strings.res.oracle
tests/value/strings.i
+16
-0
16 additions, 0 deletions
tests/value/strings.i
with
47 additions
and
10 deletions
tests/value/oracle/strings.res.oracle
+
31
−
10
View file @
e511c67e
...
@@ -39,7 +39,7 @@
...
@@ -39,7 +39,7 @@
Y ∈ {0}
Y ∈ {0}
Z ∈ {0}
Z ∈ {0}
[eva] computing for function string_reads <- main.
[eva] computing for function string_reads <- main.
Called from tests/value/strings.i:12
7
.
Called from tests/value/strings.i:1
4
2.
[eva] computing for function u <- string_reads <- main.
[eva] computing for function u <- string_reads <- main.
Called from tests/value/strings.i:39.
Called from tests/value/strings.i:39.
[kernel:annot:missing-spec] tests/value/strings.i:39: Warning:
[kernel:annot:missing-spec] tests/value/strings.i:39: Warning:
...
@@ -81,7 +81,7 @@
...
@@ -81,7 +81,7 @@
[eva] Recording results for string_reads
[eva] Recording results for string_reads
[eva] Done for function string_reads
[eva] Done for function string_reads
[eva] computing for function string_writes <- main.
[eva] computing for function string_writes <- main.
Called from tests/value/strings.i:1
28
.
Called from tests/value/strings.i:1
43
.
[eva:alarm] tests/value/strings.i:64: Warning:
[eva:alarm] tests/value/strings.i:64: Warning:
out of bounds write. assert \valid(tmp);
out of bounds write. assert \valid(tmp);
(tmp from nondet?s5 + 2:& c)
(tmp from nondet?s5 + 2:& c)
...
@@ -91,12 +91,12 @@
...
@@ -91,12 +91,12 @@
out of bounds write. assert \valid(s6);
out of bounds write. assert \valid(s6);
[eva] Recording results for string_writes
[eva] Recording results for string_writes
[eva] Done for function string_writes
[eva] Done for function string_writes
[eva:locals-escaping] tests/value/strings.i:1
28
: Warning:
[eva:locals-escaping] tests/value/strings.i:1
43
: Warning:
locals {c} escaping the scope of string_writes through s5
locals {c} escaping the scope of string_writes through s5
[eva:locals-escaping] tests/value/strings.i:1
28
: Warning:
[eva:locals-escaping] tests/value/strings.i:1
43
: Warning:
locals {c} escaping the scope of string_writes through s6
locals {c} escaping the scope of string_writes through s6
[eva] computing for function string_comparison <- main.
[eva] computing for function string_comparison <- main.
Called from tests/value/strings.i:1
29
.
Called from tests/value/strings.i:1
44
.
[eva] computing for function u <- string_comparison <- main.
[eva] computing for function u <- string_comparison <- main.
Called from tests/value/strings.i:78.
Called from tests/value/strings.i:78.
[eva] Done for function u
[eva] Done for function u
...
@@ -153,17 +153,25 @@
...
@@ -153,17 +153,25 @@
assert \pointer_comparable((void *)("oh, hello" + 4), (void *)s7);
assert \pointer_comparable((void *)("oh, hello" + 4), (void *)s7);
[eva] Recording results for string_comparison
[eva] Recording results for string_comparison
[eva] Done for function 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.
[eva] computing for function long_chain <- main.
Called from tests/value/strings.i:1
30
.
Called from tests/value/strings.i:1
46
.
[eva] computing for function assigns <- long_chain <- main.
[eva] computing for function assigns <- long_chain <- main.
Called from tests/value/strings.i:1
20
.
Called from tests/value/strings.i:1
35
.
[eva] using specification for function assigns
[eva] using specification for function assigns
[eva] tests/value/strings.i:1
14
: Warning:
[eva] tests/value/strings.i:1
29
: Warning:
no \from part for clause 'assigns *(p + (0 .. s - 1));'
no \from part for clause 'assigns *(p + (0 .. s - 1));'
[eva] Done for function assigns
[eva] Done for function assigns
[eva] computing for function strcmp <- long_chain <- main.
[eva] computing for function strcmp <- long_chain <- main.
Called from tests/value/strings.i:1
21
.
Called from tests/value/strings.i:1
36
.
[eva:alarm] tests/value/strings.i:1
08
: Warning:
[eva:alarm] tests/value/strings.i:1
23
: Warning:
out of bounds read. assert \valid_read(tmp_0);
out of bounds read. assert \valid_read(tmp_0);
(tmp_0 from s2_0++)
(tmp_0 from s2_0++)
[eva] Recording results for strcmp
[eva] Recording results for strcmp
...
@@ -261,6 +269,11 @@
...
@@ -261,6 +269,11 @@
T ∈ {0; 101}
T ∈ {0; 101}
p ∈ {{ &s1[5] ; &s2[3] }}
p ∈ {{ &s1[5] ; &s2[3] }}
__retres ∈ {5}
__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:
[eva:final-states] Values at end of function main:
s1[0] ∈ {104}
s1[0] ∈ {104}
[1] ∈ {101}
[1] ∈ {101}
...
@@ -307,6 +320,8 @@
...
@@ -307,6 +320,8 @@
[from] Done for function string_comparison
[from] Done for function string_comparison
[from] Computing for function string_reads
[from] Computing for function string_reads
[from] Done 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] Computing for function main
[from] Done for function main
[from] Done for function main
[from] ====== DEPENDENCIES COMPUTED ======
[from] ====== DEPENDENCIES COMPUTED ======
...
@@ -349,6 +364,8 @@
...
@@ -349,6 +364,8 @@
S FROM \nothing (and SELF)
S FROM \nothing (and SELF)
T FROM s1[1] (and SELF)
T FROM s1[1] (and SELF)
\result FROM s1{[0..2]; [4]}; cc
\result FROM s1{[0..2]; [4]}; cc
[from] Function wide_string_comparison:
\result FROM \nothing
[from] Function main:
[from] Function main:
s1{[3]; [6]} FROM cc
s1{[3]; [6]} FROM cc
s5 FROM s3; s8
s5 FROM s3; s8
...
@@ -401,6 +418,10 @@
...
@@ -401,6 +418,10 @@
tmp_3; tmp_4; __retres
tmp_3; tmp_4; __retres
[inout] Inputs for function string_reads:
[inout] Inputs for function string_reads:
s1[0..5]; cc
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:
[inout] Out (internal) for function main:
s1{[3]; [6]}; s5; s6; cc; Q; R; S; T; U; V; W; X; Y; Z
s1{[3]; [6]}; s5; s6; cc; Q; R; S; T; U; V; W; X; Y; Z
[inout] Inputs for function main:
[inout] Inputs for function main:
...
...
This diff is collapsed.
Click to expand it.
tests/value/strings.i
+
16
−
0
View file @
e511c67e
...
@@ -100,6 +100,21 @@ int string_comparison() {
...
@@ -100,6 +100,21 @@ int string_comparison() {
return cc;
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
)
int
strcmp
(
const
char
*
s1
,
const
char
*
s2
)
{
{
...
@@ -127,5 +142,6 @@ void main() {
...
@@ -127,5 +142,6 @@ void main() {
string_reads ();
string_reads ();
string_writes ();
string_writes ();
string_comparison ();
string_comparison ();
wide_string_comparison ();
long_chain ();
long_chain ();
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment