Skip to content

Commit 89530d3

Browse files
author
klaas
committed
Fixed secondary issues arising from local_bitvector_analysis fix.
In particular, goto_check did not properly handle pointers whose value was an integer address (such as int *p = 0x10 in the test case memory_allocation1). This commit adds in pointer checks on pointers which are integer addresses, treating them essentially the same as pointers which are unknown (and could therefore point to any of the more well-defined types of memory objects), except that they are known not to be null, so no check for NULL is needed.
1 parent 131e525 commit 89530d3

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

regression/cbmc/memory_allocation1/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ int main()
99
assert(*p==42);
1010
*(p+1)=42;
1111
assert(*(p+1)==42);
12+
*(p - 0x10) = 42;
13+
assert(*(p - 0x10) == 42);
1214

1315
return 0;
1416
}

regression/cbmc/memory_allocation1/test.desc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ main.c
33
--pointer-check
44
^EXIT=10$
55
^SIGNAL=0$
6-
\[main.pointer_dereference.2\] dereference failure: pointer invalid in \*p: SUCCESS
6+
\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in \*p: SUCCESS
77
\[main.assertion.1\] assertion \*p==42: SUCCESS
8-
\[main.pointer_dereference.14\] dereference failure: pointer invalid in p\[.*1\]: FAILURE
8+
\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in p\[.*1\]: FAILURE
99
\[main.assertion.2\] assertion \*\(p\+1\)==42: SUCCESS
10-
\*\* 12 of 26 failed
10+
^VERIFICATION FAILED$
1111
--
1212
^warning: ignoring

src/analyses/goto_check.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,8 @@ void goto_checkt::pointer_validity_check(
991991
allocs=disjunction(disjuncts);
992992
}
993993

994-
if(flags.is_unknown() || flags.is_null())
994+
if(flags.is_unknown() ||
995+
flags.is_null())
995996
{
996997
add_guarded_claim(
997998
or_exprt(allocs, not_exprt(null_pointer(pointer))),
@@ -1002,7 +1003,8 @@ void goto_checkt::pointer_validity_check(
10021003
guard);
10031004
}
10041005

1005-
if(flags.is_unknown())
1006+
if(flags.is_unknown() ||
1007+
flags.is_integer_address())
10061008
add_guarded_claim(
10071009
or_exprt(allocs, not_exprt(invalid_pointer(pointer))),
10081010
"dereference failure: pointer invalid",
@@ -1020,7 +1022,9 @@ void goto_checkt::pointer_validity_check(
10201022
expr,
10211023
guard);
10221024

1023-
if(flags.is_unknown() || flags.is_dynamic_heap())
1025+
if(flags.is_unknown() ||
1026+
flags.is_dynamic_heap() ||
1027+
flags.is_integer_address())
10241028
add_guarded_claim(
10251029
or_exprt(allocs, not_exprt(deallocated(pointer, ns))),
10261030
"dereference failure: deallocated dynamic object",
@@ -1029,7 +1033,9 @@ void goto_checkt::pointer_validity_check(
10291033
expr,
10301034
guard);
10311035

1032-
if(flags.is_unknown() || flags.is_dynamic_local())
1036+
if(flags.is_unknown() ||
1037+
flags.is_dynamic_local() ||
1038+
flags.is_integer_address())
10331039
add_guarded_claim(
10341040
or_exprt(allocs, not_exprt(dead_object(pointer, ns))),
10351041
"dereference failure: dead object",
@@ -1038,7 +1044,9 @@ void goto_checkt::pointer_validity_check(
10381044
expr,
10391045
guard);
10401046

1041-
if(flags.is_unknown() || flags.is_dynamic_heap())
1047+
if(flags.is_unknown() ||
1048+
flags.is_dynamic_heap() ||
1049+
flags.is_integer_address())
10421050
{
10431051
const or_exprt dynamic_bounds(
10441052
dynamic_object_lower_bound(pointer, ns, access_lb),
@@ -1059,7 +1067,8 @@ void goto_checkt::pointer_validity_check(
10591067

10601068
if(flags.is_unknown() ||
10611069
flags.is_dynamic_local() ||
1062-
flags.is_static_lifetime())
1070+
flags.is_static_lifetime() ||
1071+
flags.is_integer_address())
10631072
{
10641073
const or_exprt object_bounds(
10651074
object_lower_bound(pointer, ns, access_lb),

0 commit comments

Comments
 (0)