Skip to content

Commit e3d29a0

Browse files
committed
Symex: ignore null dereferences when targeting Java
In Java (and other safe languages) we know that any path that led to dereferencing a null pointer would have thrown or asserted beforehand (i.e. all pointer dereferences are checked). Therefore when dereferencing a pointer with value-set {NULL, someobj} there is no need to generate (for example) `ptr == &someobj ? someobj.somefield : invalid_object.somefield`, but rather we can simply produce `someobj.somefield`. In principle this could also be extended to C programs that have `--pointer-check` enabled, to other safe languages, and to specific pointer accesses that are analysed never-null at a particular program point.
1 parent 10d0042 commit e3d29a0

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

src/pointer-analysis/value_set_dereference.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ const exprt &value_set_dereferencet::get_symbol(const exprt &expr)
5656
return expr;
5757
}
5858

59+
bool value_set_dereferencet::null_dereference_is_impossible() const
60+
{
61+
return language_mode == ID_java;
62+
}
63+
5964
/// \par parameters: expression dest, to be dereferenced under given guard,
6065
/// and given mode
6166
/// \return returns pointer after dereferencing
@@ -114,6 +119,13 @@ exprt value_set_dereferencet::dereference(
114119
it!=points_to_set.end();
115120
it++)
116121
{
122+
if(it->id() == ID_object_descriptor &&
123+
to_object_descriptor_expr(*it).root_object().id() == ID_null_object &&
124+
null_dereference_is_impossible())
125+
{
126+
continue;
127+
}
128+
117129
valuet value=build_reference_to(*it, mode, pointer, guard);
118130

119131
#if 0

src/pointer-analysis/value_set_dereference.h

+4
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ class value_set_dereferencet
138138
const typet &type,
139139
const guardt &guard,
140140
const exprt &offset);
141+
142+
/// Returns true if due to language guarantees or some pre-processing pass
143+
/// we always know pointers being dereferenced cannot be null.
144+
bool null_dereference_is_impossible() const;
141145
};
142146

143147
#endif // CPROVER_POINTER_ANALYSIS_VALUE_SET_DEREFERENCE_H

0 commit comments

Comments
 (0)