Skip to content

Commit 7ef0091

Browse files
author
Daniel Kroening
authored
Merge pull request #999 from tautschnig/fix-taint
Repair custom_bitvector_analysist
2 parents eac8e2c + 10822d4 commit 7ef0091

34 files changed

+160
-91
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
aliasing1.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file aliasing1.java line 10( function .*)?: There is a flow \(taint rule my_sink\)$
7+
--
8+
^file aliasing1.java line 8( function .*)?: There is a flow \(taint rule my_sink\)$
9+
^warning: ignoring
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
basic1.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file basic1.java line 8( function .*)?: There is a T1 flow \(taint rule my_h1\)$
7+
^file basic1.java line 11( function .*)?: There is a T2 flow \(taint rule my_h2\)$
8+
--
9+
^warning: ignoring
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
basic2.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file basic2.java line 8( function .*)?: There is a T1 flow \(taint rule my_h1\)$
7+
^file basic2.java line 11( function .*)?: There is a T2 flow \(taint rule my_h2\)$
8+
--
9+
^warning: ignoring
Binary file not shown.
Binary file not shown.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
interface1.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file interface1.java line 18( function .*)?: There is a flow! \(taint rule sink_rule\)$
7+
--
8+
^warning: ignoring
Binary file not shown.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class interproc1
2+
{
3+
static void my_method()
4+
{
5+
Object o=null;
6+
7+
my_f(o); // T1 source
8+
my_g(o);
9+
}
10+
11+
static void my_g(Object p)
12+
{
13+
my_h(p); // T1 sink
14+
}
15+
16+
static void my_f(Object p) { }
17+
static void my_h(Object p) { }
18+
};
19+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
{ "id": "my_f", "kind": "source", "where": "parameter1", "taint": "T1", "function": "interproc1.my_f" },
3+
{ "id": "my_h1", "kind": "sink", "where": "parameter1", "taint": "T1", "function": "interproc1.my_h", "message": "There is a T1 flow" }
4+
]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
interproc1.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file interproc1.java line 13( function .*)?: There is a T1 flow \(taint rule my_h1\)$
7+
--
8+
^warning: ignoring
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
KNOWNBUG
2+
map1.class
3+
--taint taint.json
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^file map1.java line 12( function .*)?: There is a flow \(taint rule my_sink\)$
7+
--
8+
^warning: ignoring

regression/taint/Makefile

Lines changed: 0 additions & 19 deletions
This file was deleted.

regression/taint/aliasing1/test.desc

Lines changed: 0 additions & 9 deletions
This file was deleted.

regression/taint/basic1/test.desc

Lines changed: 0 additions & 9 deletions
This file was deleted.

regression/taint/basic2/test.desc

Lines changed: 0 additions & 9 deletions
This file was deleted.

regression/taint/interface1/test.desc

Lines changed: 0 additions & 8 deletions
This file was deleted.

regression/taint/map1/test.desc

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/analyses/custom_bitvector_analysis.cpp

Lines changed: 84 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,6 @@ void custom_bitvector_domaint::transform(
210210
ai_baset &ai,
211211
const namespacet &ns)
212212
{
213-
if(has_values.is_false())
214-
return;
215-
216213
// upcast of ai
217214
custom_bitvector_analysist &cba=
218215
static_cast<custom_bitvector_analysist &>(ai);
@@ -337,6 +334,54 @@ void custom_bitvector_domaint::transform(
337334
}
338335
}
339336
}
337+
else
338+
{
339+
goto_programt::const_targett next=from;
340+
++next;
341+
342+
// only if there is an actual call, i.e., we have a body
343+
if(next!=to)
344+
{
345+
const code_typet &code_type=
346+
to_code_type(ns.lookup(identifier).type);
347+
348+
code_function_callt::argumentst::const_iterator arg_it=
349+
code_function_call.arguments().begin();
350+
for(const auto &param : code_type.parameters())
351+
{
352+
const irep_idt &p_identifier=param.get_identifier();
353+
if(p_identifier.empty())
354+
continue;
355+
356+
// there may be a mismatch in the number of arguments
357+
if(arg_it==code_function_call.arguments().end())
358+
break;
359+
360+
// assignments arguments -> parameters
361+
symbol_exprt p=ns.lookup(p_identifier).symbol_expr();
362+
// may alias other stuff
363+
std::set<exprt> lhs_set=cba.aliases(p, from);
364+
365+
vectorst rhs_vectors=get_rhs(*arg_it);
366+
367+
for(const auto &lhs : lhs_set)
368+
{
369+
assign_lhs(lhs, rhs_vectors);
370+
}
371+
372+
// is it a pointer?
373+
if(p.type().id()==ID_pointer)
374+
{
375+
dereference_exprt lhs_deref(p);
376+
dereference_exprt rhs_deref(*arg_it);
377+
vectorst rhs_vectors=get_rhs(rhs_deref);
378+
assign_lhs(lhs_deref, rhs_vectors);
379+
}
380+
381+
++arg_it;
382+
}
383+
}
384+
}
340385
}
341386
}
342387
break;
@@ -484,44 +529,55 @@ bool custom_bitvector_domaint::merge(
484529
locationt from,
485530
locationt to)
486531
{
487-
if(b.has_values.is_false())
488-
return false; // no change
489-
490-
if(has_values.is_false())
491-
{
492-
*this=b;
493-
return true; // change
494-
}
495-
496-
bool changed=false;
532+
bool changed=has_values.is_false();
533+
has_values=tvt::unknown();
497534

498535
// first do MAY
499-
for(const auto &bit : may_bits)
536+
bitst::iterator it=may_bits.begin();
537+
for(const auto &bit : b.may_bits)
500538
{
501-
bit_vectort &a_bits=may_bits[bit.first];
502-
bit_vectort old=a_bits;
503-
a_bits|=bit.second;
504-
if(old!=a_bits)
539+
while(it!=may_bits.end() && it->first<bit.first)
540+
++it;
541+
if(it==may_bits.end() || bit.first<it->first)
542+
{
543+
may_bits.insert(it, bit);
505544
changed=true;
545+
}
546+
else if(it!=may_bits.end())
547+
{
548+
bit_vectort &a_bits=it->second;
549+
bit_vectort old=a_bits;
550+
a_bits|=bit.second;
551+
if(old!=a_bits)
552+
changed=true;
553+
554+
++it;
555+
}
506556
}
507557

508558
// now do MUST
509-
for(auto &bit : must_bits)
559+
it=must_bits.begin();
560+
for(auto &bit : b.must_bits)
510561
{
511-
bitst::const_iterator b_it=
512-
b.must_bits.find(bit.first);
513-
514-
if(b_it==b.must_bits.end())
562+
while(it!=must_bits.end() && it->first<bit.first)
515563
{
516-
bit.second=0;
564+
it=must_bits.erase(it);
517565
changed=true;
518566
}
519-
else
567+
if(it==must_bits.end() || bit.first<it->first)
520568
{
521-
bit_vectort old=bit.second;
522-
bit.second&=bit.second;
523-
if(old!=bit.second)
569+
must_bits.insert(it, bit);
570+
changed=true;
571+
}
572+
else if(it!=must_bits.end())
573+
{
574+
bit_vectort &a_bits=it->second;
575+
bit_vectort old=a_bits;
576+
a_bits&=bit.second;
577+
if(old!=a_bits)
524578
changed=true;
579+
580+
++it;
525581
}
526582
}
527583

src/analyses/custom_bitvector_analysis.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class custom_bitvector_domaint:public ai_domain_baset
8787

8888
tvt has_values;
8989

90-
custom_bitvector_domaint():has_values(true)
90+
custom_bitvector_domaint():has_values(false)
9191
{
9292
}
9393

@@ -145,6 +145,7 @@ class custom_bitvector_analysist:public ait<custom_bitvector_domaint>
145145
protected:
146146
virtual void initialize(const goto_functionst &_goto_functions)
147147
{
148+
ait<custom_bitvector_domaint>::initialize(_goto_functions);
148149
local_may_alias_factory(_goto_functions);
149150
}
150151

0 commit comments

Comments
 (0)