mirror of
https://github.com/zeek/zeek.git
synced 2025-10-10 02:28:21 +00:00
parse.y/directives: Reject directives as statements
Avoid the issue outlined in #2289 where the @if or @else is taken as the statement of an `if`, `for` or `while` by rejecting such constructs. Effectively this means the following scripts are now rejected: # Print's "cond true" with Zeek 5.0 even though the `if ( F )` # should be in effect. if ( F ) @if ( T ) print "cond true"; @else print "cond false"; @endif or # Print's "hello" once with Zeek 5.0 local v = vector( 1, 2, 3 ); for ( i in v ) @if ( T ) print("hello") @endif To make above work as intended, additional braces can be used. if ( T ) { @if ( cond ) print "cond true"; @else print "cond false"; @endif } for ( i in v ) { @if ( T ) print("hello") @endif }
This commit is contained in:
parent
6721248da5
commit
171846a37a
16 changed files with 124 additions and 2 deletions
|
@ -525,7 +525,7 @@ protected:
|
|||
class NullStmt final : public Stmt
|
||||
{
|
||||
public:
|
||||
NullStmt() : Stmt(STMT_NULL) { }
|
||||
NullStmt(bool arg_is_directive = false);
|
||||
|
||||
ValPtr Exec(Frame* f, StmtFlowType& flow) override;
|
||||
bool IsPure() const override;
|
||||
|
@ -536,6 +536,12 @@ public:
|
|||
|
||||
// Optimization-related:
|
||||
StmtPtr Duplicate() override { return SetSucc(new NullStmt()); }
|
||||
|
||||
// Returns true if this NullStmt represents a directive (@if..., @else, @endif)
|
||||
bool IsDirective() const { return is_directive; };
|
||||
|
||||
private:
|
||||
bool is_directive;
|
||||
};
|
||||
|
||||
// A helper class for tracking all of the information associated with
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue