Skip to content

Commit 273600e

Browse files
committed
Check for null-pointer deref on array access
1 parent 3c59dc9 commit 273600e

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -524,15 +524,15 @@ static member_exprt to_member(const exprt &pointer, const exprt &fieldref)
524524
exprt pointer2=
525525
typecast_exprt(pointer, java_reference_type(class_type));
526526

527-
const dereference_exprt obj_deref(pointer2, class_type);
527+
dereference_exprt obj_deref(pointer2, class_type);
528+
// tag it so it's easy to identify during instrumentation
529+
obj_deref.set(ID_java_member_access, true);
528530

529-
member_exprt member_expr(
531+
const member_exprt member_expr(
530532
obj_deref,
531533
fieldref.get(ID_component_name),
532534
fieldref.type());
533535

534-
// tag it so it's easy to identify during instrumentation
535-
member_expr.set(ID_java_member_access, true);
536536
return member_expr;
537537
}
538538

@@ -1496,7 +1496,8 @@ codet java_bytecode_convert_methodt::convert_instructions(
14961496
exprt pointer=
14971497
typecast_exprt(op[0], java_array_type(type_char));
14981498

1499-
const dereference_exprt deref(pointer, pointer.type().subtype());
1499+
dereference_exprt deref(pointer, pointer.type().subtype());
1500+
deref.set(ID_java_member_access, true);
15001501

15011502
const member_exprt data_ptr(
15021503
deref,
@@ -1559,7 +1560,8 @@ codet java_bytecode_convert_methodt::convert_instructions(
15591560
exprt pointer=
15601561
typecast_exprt(op[0], java_array_type(type_char));
15611562

1562-
const dereference_exprt deref(pointer, pointer.type().subtype());
1563+
dereference_exprt deref(pointer, pointer.type().subtype());
1564+
deref.set(ID_java_member_access, true);
15631565

15641566
const member_exprt data_ptr(
15651567
deref,
@@ -2237,8 +2239,9 @@ codet java_bytecode_convert_methodt::convert_instructions(
22372239
exprt pointer=
22382240
typecast_exprt(op[0], java_array_type(statement[0]));
22392241

2240-
const dereference_exprt array(pointer, pointer.type().subtype());
2242+
dereference_exprt array(pointer, pointer.type().subtype());
22412243
assert(pointer.type().subtype().id()==ID_symbol);
2244+
array.set(ID_java_member_access, true);
22422245

22432246
const member_exprt length(array, "length", java_int_type());
22442247

src/java_bytecode/java_bytecode_instrument.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -550,23 +550,17 @@ codet java_bytecode_instrumentt::instrument_expr(
550550
expr.op1(),
551551
expr.source_location()));
552552
}
553-
else if(expr.id()==ID_member &&
553+
else if(expr.id()==ID_dereference &&
554554
expr.get_bool(ID_java_member_access))
555555
{
556-
// this corresponds to either getfield or putfield
557-
// so we must check null pointer dereference
558-
const member_exprt &member_expr=to_member_expr(expr);
559-
if(member_expr.op0().id()==ID_dereference)
560-
{
561-
const dereference_exprt dereference_expr=
562-
to_dereference_expr(member_expr.op0());
563-
codet null_dereference_check=
564-
check_null_dereference(
565-
dereference_expr.op0(),
566-
dereference_expr.source_location(),
567-
false);
568-
result.move_to_operands(null_dereference_check);
569-
}
556+
// Check pointer non-null before access:
557+
const dereference_exprt dereference_expr=to_dereference_expr(expr);
558+
codet null_dereference_check=
559+
check_null_dereference(
560+
dereference_expr.op0(),
561+
dereference_expr.source_location(),
562+
false);
563+
result.move_to_operands(null_dereference_check);
570564
}
571565

572566
if(result==code_blockt())

0 commit comments

Comments
 (0)