From 070b28ac0572d4cc4e1c9f060eb2f72f0a505eaf Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 9 Apr 2020 21:00:09 -0700 Subject: [PATCH] Emit error for alternate event/hook prototype args with attributes Argument attributes are only allowed in the canonical prototype. --- src/Var.cc | 7 +++ .../errors | 1 + .../out | 6 +++ .../alternate-prototypes-default-args.zeek | 50 +++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 testing/btest/Baseline/language.alternate-prototypes-default-args/errors create mode 100644 testing/btest/Baseline/language.alternate-prototypes-default-args/out create mode 100644 testing/btest/language/alternate-prototypes-default-args.zeek diff --git a/src/Var.cc b/src/Var.cc index 8b283e4a81..caa599ed6b 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -76,6 +76,13 @@ static bool add_prototype(ID* id, BroType* t, attr_list* attrs, for ( auto i = 0; i < alt_args->NumFields(); ++i ) { auto field = alt_args->FieldName(i); + + if ( alt_args->FieldDecl(i)->attrs ) + { + alt_ft->Error(fmt("alternate function prototype arguments may not have attributes: arg '%s'", field), canon_ft); + return false; + } + auto o = canon_args->FieldOffset(field); if ( o < 0 ) diff --git a/testing/btest/Baseline/language.alternate-prototypes-default-args/errors b/testing/btest/Baseline/language.alternate-prototypes-default-args/errors new file mode 100644 index 0000000000..ec8fac7ea0 --- /dev/null +++ b/testing/btest/Baseline/language.alternate-prototypes-default-args/errors @@ -0,0 +1 @@ +error in ./bad.zeek, line 2 and ./bad.zeek, line 1: alternate function prototype arguments may not have attributes: arg 'a' (event(c:string; b:string; a:string;) and event(a:string; b:string; c:string;)) diff --git a/testing/btest/Baseline/language.alternate-prototypes-default-args/out b/testing/btest/Baseline/language.alternate-prototypes-default-args/out new file mode 100644 index 0000000000..19682ecd68 --- /dev/null +++ b/testing/btest/Baseline/language.alternate-prototypes-default-args/out @@ -0,0 +1,6 @@ +foo, A, B, C +foo, A, B, C +reverse foo, A, B, C +foo a, A +foo b, B +foo c, C diff --git a/testing/btest/language/alternate-prototypes-default-args.zeek b/testing/btest/language/alternate-prototypes-default-args.zeek new file mode 100644 index 0000000000..a7eeafac20 --- /dev/null +++ b/testing/btest/language/alternate-prototypes-default-args.zeek @@ -0,0 +1,50 @@ +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC-FAIL: zeek -b bad.zeek >errors 2>&1 +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff errors + +global foo: event(a: string, b: string, c: string &default="C"); +global foo: event(c: string, b: string, a: string); +global foo: event(a: string); +global foo: event(b: string); +global foo: event(c: string); + +event foo(a: string, b: string, c: string) + { + print "foo", a, b, c; + } + +event foo(mya: string, b: string, c: string) + { + print "foo", mya, b, c; + } + +event foo(c: string, b: string, a: string) + { + print "reverse foo", a, b, c; + } + +event foo(a: string) + { + print "foo a", a; + } + +event foo(b: string) + { + print "foo b", b; + } + +event foo(c: string) + { + print "foo c", c; + } + +event zeek_init() + { + event foo("A", "B"); + } + +@TEST-START-FILE bad.zeek +global foo: event(a: string, b: string, c: string &default="C"); +global foo: event(c: string, b: string, a: string &default="A"); +@TEST-END-FILE bad.zeek