Skip to content

Commit ce3f8d0

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 392c765 commit ce3f8d0

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
@@ -44,6 +44,11 @@ const exprt &value_set_dereferencet::get_symbol(const exprt &expr)
4444
return expr;
4545
}
4646

47+
bool value_set_dereferencet::null_dereference_is_impossible() const
48+
{
49+
return language_mode == ID_java;
50+
}
51+
4752
/// \par parameters: expression dest, to be dereferenced under given guard,
4853
/// and given mode
4954
/// \return returns pointer after dereferencing
@@ -102,6 +107,13 @@ exprt value_set_dereferencet::dereference(
102107
it!=points_to_set.end();
103108
it++)
104109
{
110+
if(it->id() == ID_object_descriptor &&
111+
to_object_descriptor_expr(*it).root_object().id() == ID_null_object &&
112+
null_dereference_is_impossible())
113+
{
114+
continue;
115+
}
116+
105117
valuet value=build_reference_to(*it, mode, pointer, guard);
106118

107119
#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)