Skip to content

Commit fbc54ad

Browse files
author
Daniel Kroening
committed
guard against spurious pointers in taint analysis
1 parent de668e6 commit fbc54ad

File tree

1 file changed

+69
-55
lines changed

1 file changed

+69
-55
lines changed

src/analyses/custom_bitvector_analysis.cpp

+69-55
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,17 @@ irep_idt custom_bitvector_domaint::object2id(const exprt &src)
6767
}
6868
else if(op.id()==ID_typecast)
6969
{
70-
return object2id(dereference_exprt(to_typecast_expr(op).op()));
70+
irep_idt op_id=object2id(to_typecast_expr(op).op());
71+
72+
if(op_id.empty())
73+
return irep_idt();
74+
else
75+
return '*'+id2string(op_id);
7176
}
7277
else
7378
{
7479
irep_idt op_id=object2id(op);
80+
7581
if(op_id.empty())
7682
return irep_idt();
7783
else
@@ -188,9 +194,8 @@ std::set<exprt> custom_bitvector_analysist::aliases(
188194
std::set<exprt> result;
189195

190196
for(const auto &pointer : pointer_set)
191-
{
192-
result.insert(dereference_exprt(pointer));
193-
}
197+
if(pointer.type().id()==ID_pointer)
198+
result.insert(dereference_exprt(pointer));
194199

195200
result.insert(src);
196201

@@ -300,36 +305,39 @@ void custom_bitvector_domaint::transform(
300305

301306
exprt lhs=code_function_call.arguments()[0];
302307

303-
if(lhs.is_constant() &&
304-
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
308+
if(lhs.type().id()==ID_pointer)
305309
{
306-
if(mode==modet::CLEAR_MAY)
310+
if(lhs.is_constant() &&
311+
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
307312
{
308-
for(auto &bit : may_bits)
309-
clear_bit(bit.second, bit_nr);
310-
311-
// erase blank ones
312-
erase_blank_vectors(may_bits);
313+
if(mode==modet::CLEAR_MAY)
314+
{
315+
for(auto &bit : may_bits)
316+
clear_bit(bit.second, bit_nr);
317+
318+
// erase blank ones
319+
erase_blank_vectors(may_bits);
320+
}
321+
else if(mode==modet::CLEAR_MUST)
322+
{
323+
for(auto &bit : must_bits)
324+
clear_bit(bit.second, bit_nr);
325+
326+
// erase blank ones
327+
erase_blank_vectors(must_bits);
328+
}
313329
}
314-
else if(mode==modet::CLEAR_MUST)
330+
else
315331
{
316-
for(auto &bit : must_bits)
317-
clear_bit(bit.second, bit_nr);
318-
319-
// erase blank ones
320-
erase_blank_vectors(must_bits);
321-
}
322-
}
323-
else
324-
{
325-
dereference_exprt deref(lhs);
332+
dereference_exprt deref(lhs);
326333

327-
// may alias other stuff
328-
std::set<exprt> lhs_set=cba.aliases(deref, from);
334+
// may alias other stuff
335+
std::set<exprt> lhs_set=cba.aliases(deref, from);
329336

330-
for(const auto &lhs : lhs_set)
331-
{
332-
set_bit(lhs, bit_nr, mode);
337+
for(const auto &lhs : lhs_set)
338+
{
339+
set_bit(lhs, bit_nr, mode);
340+
}
333341
}
334342
}
335343
}
@@ -415,40 +423,43 @@ void custom_bitvector_domaint::transform(
415423

416424
exprt lhs=instruction.code.op0();
417425

418-
if(lhs.is_constant() &&
419-
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
426+
if(lhs.type().id()==ID_pointer)
420427
{
421-
if(mode==modet::CLEAR_MAY)
428+
if(lhs.is_constant() &&
429+
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
422430
{
423-
for(bitst::iterator b_it=may_bits.begin();
424-
b_it!=may_bits.end();
425-
b_it++)
426-
clear_bit(b_it->second, bit_nr);
431+
if(mode==modet::CLEAR_MAY)
432+
{
433+
for(bitst::iterator b_it=may_bits.begin();
434+
b_it!=may_bits.end();
435+
b_it++)
436+
clear_bit(b_it->second, bit_nr);
427437

428-
// erase blank ones
429-
erase_blank_vectors(may_bits);
430-
}
431-
else if(mode==modet::CLEAR_MUST)
432-
{
433-
for(bitst::iterator b_it=must_bits.begin();
434-
b_it!=must_bits.end();
435-
b_it++)
436-
clear_bit(b_it->second, bit_nr);
438+
// erase blank ones
439+
erase_blank_vectors(may_bits);
440+
}
441+
else if(mode==modet::CLEAR_MUST)
442+
{
443+
for(bitst::iterator b_it=must_bits.begin();
444+
b_it!=must_bits.end();
445+
b_it++)
446+
clear_bit(b_it->second, bit_nr);
437447

438-
// erase blank ones
439-
erase_blank_vectors(must_bits);
448+
// erase blank ones
449+
erase_blank_vectors(must_bits);
450+
}
440451
}
441-
}
442-
else
443-
{
444-
dereference_exprt deref(lhs);
452+
else
453+
{
454+
dereference_exprt deref(lhs);
445455

446-
// may alias other stuff
447-
std::set<exprt> lhs_set=cba.aliases(deref, from);
456+
// may alias other stuff
457+
std::set<exprt> lhs_set=cba.aliases(deref, from);
448458

449-
for(const auto &lhs : lhs_set)
450-
{
451-
set_bit(lhs, bit_nr, mode);
459+
for(const auto &lhs : lhs_set)
460+
{
461+
set_bit(lhs, bit_nr, mode);
462+
}
452463
}
453464
}
454465
}
@@ -628,6 +639,9 @@ exprt custom_bitvector_domaint::eval(
628639

629640
exprt pointer=src.op0();
630641

642+
if(pointer.type().id()!=ID_pointer)
643+
return src;
644+
631645
if(pointer.is_constant() &&
632646
to_constant_expr(pointer).get_value()==ID_NULL) // NULL means all
633647
{

0 commit comments

Comments
 (0)