mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Merge remote-tracking branch 'origin/topic/jsiwek/bit-1296'
* origin/topic/jsiwek/bit-1296: Make using local IDs in @if directives an error. BIT-1296 #merged
This commit is contained in:
commit
bb7d94d9c5
7 changed files with 103 additions and 5 deletions
5
CHANGES
5
CHANGES
|
@ -1,4 +1,9 @@
|
||||||
|
|
||||||
|
2.3-332 | 2014-12-03 14:14:11 -0800
|
||||||
|
|
||||||
|
* Make using local IDs in @if directives an error. Addresses
|
||||||
|
BIT-1296. (Jon Siwek)
|
||||||
|
|
||||||
2.3-330 | 2014-12-03 14:10:39 -0800
|
2.3-330 | 2014-12-03 14:10:39 -0800
|
||||||
|
|
||||||
* Fix some "make doc" warnings and update some doc tests. (Daniel
|
* Fix some "make doc" warnings and update some doc tests. (Daniel
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
2.3-330
|
2.3-332
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9bd12e1cbb249ce35e65beddc2c77fcde3f58a87
|
Subproject commit 39e865dec9611b9b53b609cbc8df519cebae0a1e
|
42
src/scan.l
42
src/scan.l
|
@ -26,6 +26,7 @@
|
||||||
#include "Reporter.h"
|
#include "Reporter.h"
|
||||||
#include "RE.h"
|
#include "RE.h"
|
||||||
#include "Net.h"
|
#include "Net.h"
|
||||||
|
#include "Traverse.h"
|
||||||
|
|
||||||
#include "analyzer/Analyzer.h"
|
#include "analyzer/Analyzer.h"
|
||||||
#include "broxygen/Manager.h"
|
#include "broxygen/Manager.h"
|
||||||
|
@ -615,11 +616,50 @@ void end_RE()
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LocalNameFinder : public TraversalCallback {
|
||||||
|
public:
|
||||||
|
LocalNameFinder()
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual TraversalCode PreExpr(const Expr* expr)
|
||||||
|
{
|
||||||
|
if ( expr->Tag() != EXPR_NAME )
|
||||||
|
return TC_CONTINUE;
|
||||||
|
|
||||||
|
const NameExpr* name_expr = static_cast<const NameExpr*>(expr);
|
||||||
|
|
||||||
|
if ( name_expr->Id()->IsGlobal() )
|
||||||
|
return TC_CONTINUE;
|
||||||
|
|
||||||
|
local_names.push_back(name_expr);
|
||||||
|
return TC_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<const NameExpr*> local_names;
|
||||||
|
};
|
||||||
|
|
||||||
void do_atif(Expr* expr)
|
void do_atif(Expr* expr)
|
||||||
{
|
{
|
||||||
++current_depth;
|
++current_depth;
|
||||||
|
|
||||||
Val* val = expr->Eval(0);
|
LocalNameFinder cb;
|
||||||
|
expr->Traverse(&cb);
|
||||||
|
Val* val = 0;
|
||||||
|
|
||||||
|
if ( cb.local_names.empty() )
|
||||||
|
val = expr->Eval(0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( size_t i = 0; i < cb.local_names.size(); ++i )
|
||||||
|
cb.local_names[i]->Error("referencing a local name in @if");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! val )
|
||||||
|
{
|
||||||
|
expr->Error("invalid expression in @if");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( ! val->AsBool() )
|
if ( ! val->AsBool() )
|
||||||
{
|
{
|
||||||
if_stack.append(current_depth);
|
if_stack.append(current_depth);
|
||||||
|
|
4
testing/btest/Baseline/language.at-if-invalid/out
Normal file
4
testing/btest/Baseline/language.at-if-invalid/out
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.at-if-invalid/at-if-invalid.bro, line 28: referencing a local name in @if (xyz)
|
||||||
|
error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.at-if-invalid/at-if-invalid.bro, line 28: invalid expression in @if (F && foo(xyz))
|
||||||
|
error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.at-if-invalid/at-if-invalid.bro, line 36: referencing a local name in @if (local_true_condition)
|
||||||
|
error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.at-if-invalid/at-if-invalid.bro, line 36: invalid expression in @if (T && TRUE_CONDITION && local_true_condition)
|
41
testing/btest/language/at-if-invalid.bro
Normal file
41
testing/btest/language/at-if-invalid.bro
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# @TEST-EXEC-FAIL: bro -b %INPUT >out 2>&1
|
||||||
|
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out
|
||||||
|
|
||||||
|
function foo(c: count): bool
|
||||||
|
{ return c == 42 ? T : F; }
|
||||||
|
|
||||||
|
global TRUE_CONDITION = T;
|
||||||
|
|
||||||
|
event bro_init()
|
||||||
|
{
|
||||||
|
local xyz = 0;
|
||||||
|
local local_true_condition = T;
|
||||||
|
|
||||||
|
@if ( F )
|
||||||
|
xyz += 1;
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ( foo(0) )
|
||||||
|
xyz += 1;
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ( T && foo(42) )
|
||||||
|
xyz += 2;
|
||||||
|
@endif
|
||||||
|
|
||||||
|
xyz = 0;
|
||||||
|
|
||||||
|
@if ( F && foo(xyz) )
|
||||||
|
xyz += 1;
|
||||||
|
@else
|
||||||
|
xyz += 2;
|
||||||
|
@endif
|
||||||
|
|
||||||
|
xyz = 0;
|
||||||
|
|
||||||
|
@if ( T && TRUE_CONDITION && local_true_condition )
|
||||||
|
xyz += 1;
|
||||||
|
@else
|
||||||
|
xyz += 2;
|
||||||
|
@endif
|
||||||
|
}
|
|
@ -6,6 +6,10 @@ function test_case(msg: string, expect: bool)
|
||||||
print fmt("%s (%s)", msg, expect ? "PASS" : "FAIL");
|
print fmt("%s (%s)", msg, expect ? "PASS" : "FAIL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function foo(c: count): bool
|
||||||
|
{ return c == 42 ? T : F; }
|
||||||
|
|
||||||
|
global TRUE_CONDITION = T;
|
||||||
|
|
||||||
event bro_init()
|
event bro_init()
|
||||||
{
|
{
|
||||||
|
@ -17,7 +21,11 @@ event bro_init()
|
||||||
xyz += 1;
|
xyz += 1;
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if ( T )
|
@if ( foo(0) )
|
||||||
|
xyz += 1;
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ( T && foo(42) )
|
||||||
xyz += 2;
|
xyz += 2;
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
@ -37,7 +45,7 @@ event bro_init()
|
||||||
|
|
||||||
xyz = 0;
|
xyz = 0;
|
||||||
|
|
||||||
@if ( T )
|
@if ( T && TRUE_CONDITION )
|
||||||
xyz += 1;
|
xyz += 1;
|
||||||
@else
|
@else
|
||||||
xyz += 2;
|
xyz += 2;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue