Merge remote-tracking branch 'origin/topic/jsiwek/ticket-932'

* origin/topic/jsiwek/ticket-932:
  Fix uninitialized locals in event/hook handlers from having a value.

Closes #932.
This commit is contained in:
Robin Sommer 2013-01-23 15:17:55 -08:00
commit c780bfdb48
4 changed files with 38 additions and 8 deletions

View file

@ -1853,13 +1853,21 @@ Val* InitStmt::Exec(Frame* f, stmt_flow_type& flow) const
ID* aggr = (*inits)[i]; ID* aggr = (*inits)[i];
BroType* t = aggr->Type(); BroType* t = aggr->Type();
Val* v; Val* v = 0;
if ( t->Tag() == TYPE_RECORD )
switch ( t->Tag() ) {
case TYPE_RECORD:
v = new RecordVal(t->AsRecordType()); v = new RecordVal(t->AsRecordType());
else if ( aggr->Type()->Tag() == TYPE_VECTOR ) break;
case TYPE_VECTOR:
v = new VectorVal(t->AsVectorType()); v = new VectorVal(t->AsVectorType());
else break;
case TYPE_TABLE:
v = new TableVal(t->AsTableType(), aggr->Attrs()); v = new TableVal(t->AsTableType(), aggr->Attrs());
break;
default:
break;
}
f->SetElement(aggr->Offset(), v); f->SetElement(aggr->Offset(), v);
} }

View file

@ -243,10 +243,7 @@ Stmt* add_local(ID* id, BroType* t, init_class c, Expr* init,
else else
{ {
if ( t->Tag() == TYPE_RECORD || t->Tag() == TYPE_TABLE || current_scope()->AddInit(id);
t->Tag() == TYPE_VECTOR )
current_scope()->AddInit(id);
return new NullStmt; return new NullStmt;
} }
} }

View file

@ -0,0 +1,2 @@
error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.uninitialized-local/uninitialized-local.bro, line 16: value used but not set (my_string)
Continuing

View file

@ -0,0 +1,23 @@
# @TEST-EXEC: bro -b %INPUT >out 2>&1
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out
event testit() &priority=10
{
local my_count: count = 10;
}
event testit()
{
# my_string's value occupies same Frame offset as my_count's from above
# handler, but execution of this handler body should still "initialize"
# it to a null value instead of referring to a left-over value of my_count.
local my_string: string;
local my_vector: vector of string;
my_vector[0] = my_string;
print "Continuing";
}
event bro_init()
{
event testit();
}