From 12a5616f4daa4029d5ef5f6dc180828beef7f3dd Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Mon, 10 Jul 2023 14:13:27 +0200 Subject: [PATCH 1/2] Support :: prefix to reference global namespace, deprecate GLOBAL:: Closes #2709 --- NEWS | 7 + src/Scope.cc | 43 ++++- src/module_util.cc | 11 +- src/parse.y | 25 ++- src/scan.l | 8 + .../language.deprecate-global/.stderr | 3 + .../Baseline/language.deprecate-global/out | 4 + .../Baseline/language.event-shadowing/.stderr | 1 + .../Baseline/language.event-shadowing/out | 2 + .../.stderr | 2 + .../.stderr | 2 + .../.stderr | 2 + .../.stderr | 2 + .../.stderr | 2 + .../.stderr | 2 + .../language.global-colon-colon-redef/.stderr | 1 + .../language.global-colon-colon-redef/out | 5 + .../language.global-colon-colon/.stderr | 9 + .../Baseline/language.global-colon-colon/out | 75 ++++++++ testing/btest/language/deprecate-global.zeek | 27 +++ testing/btest/language/enum-scope.zeek | 2 +- testing/btest/language/event-shadowing.zeek | 23 +++ .../language/global-colon-colon-errors.zeek | 45 +++++ .../language/global-colon-colon-redef.zeek | 26 +++ .../btest/language/global-colon-colon.zeek | 165 ++++++++++++++++++ testing/btest/language/no-module.zeek | 2 +- 26 files changed, 476 insertions(+), 20 deletions(-) create mode 100644 testing/btest/Baseline/language.deprecate-global/.stderr create mode 100644 testing/btest/Baseline/language.deprecate-global/out create mode 100644 testing/btest/Baseline/language.event-shadowing/.stderr create mode 100644 testing/btest/Baseline/language.event-shadowing/out create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors-2/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors-3/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors-4/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors-5/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors-6/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-errors/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-redef/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon-redef/out create mode 100644 testing/btest/Baseline/language.global-colon-colon/.stderr create mode 100644 testing/btest/Baseline/language.global-colon-colon/out create mode 100644 testing/btest/language/deprecate-global.zeek create mode 100644 testing/btest/language/event-shadowing.zeek create mode 100644 testing/btest/language/global-colon-colon-errors.zeek create mode 100644 testing/btest/language/global-colon-colon-redef.zeek create mode 100644 testing/btest/language/global-colon-colon.zeek diff --git a/NEWS b/NEWS index 2e4542805f..a009088290 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,10 @@ New Functionality table is prefixed with "module " and their value will have the ``type_name`` field set to "module". +- Identifiers in the global scope can now be referenced and defined from within + modules by prefixing their names with ``::``. Previously, these required an + explicit ``GLOBAL::`` prefix to be used. Using ``GLOBAL::`` has been deprecated. + Changed Functionality --------------------- @@ -55,6 +59,9 @@ Removed Functionality Deprecated Functionality ------------------------ +- Accessing globals with ``GLOBAL::name`` has been deprecated and will be + removed with Zeek 7.1. Use ``::name`` instead. + Zeek 6.0.0 ========== diff --git a/src/Scope.cc b/src/Scope.cc index 4164bfb98e..22ce5fe824 100644 --- a/src/Scope.cc +++ b/src/Scope.cc @@ -108,22 +108,47 @@ TraversalCode Scope::Traverse(TraversalCallback* cb) const const IDPtr& lookup_ID(const char* name, const char* curr_module, bool no_global, bool same_module_only, bool check_export) { + bool explicit_global = zeek::util::starts_with(name, "::"); + + // Ad-hoc deprecation if a name starts with "GLOBAL::". In v7.1 we could + // tweak {ID} to reject GLOBAL::, or switch this warning to error instead. + static std::string deprecated_prefix = util::fmt("%s::", GLOBAL_MODULE_NAME); + if ( zeek::util::starts_with(name, deprecated_prefix) ) + reporter->Deprecation(util::fmt("Remove in v7.1: Use :: instead of %s (%s)", + deprecated_prefix.c_str(), name)); + std::string fullname = make_full_var_name(curr_module, name); - std::string ID_module = extract_module_name(fullname.c_str()); - bool need_export = check_export && - (ID_module != GLOBAL_MODULE_NAME && ID_module != curr_module); - for ( auto s_i = scopes.rbegin(); s_i != scopes.rend(); ++s_i ) + // This is mostly for sanity (and should be covered by syntax) + if ( explicit_global && same_module_only && ID_module != GLOBAL_MODULE_NAME ) { - const auto& id = (*s_i)->Find(fullname); + reporter->Error("lookup_ID for %s with :: prefix for non-global module called", name); + return ID::nil; + } - if ( id ) + if ( explicit_global && no_global ) + { + reporter->Error("lookup_ID for %s with :: prefix, but no_global=true", name); + return ID::nil; + } + + if ( ! explicit_global ) + { + bool need_export = check_export && + (ID_module != GLOBAL_MODULE_NAME && ID_module != curr_module); + + for ( auto s_i = scopes.rbegin(); s_i != scopes.rend(); ++s_i ) { - if ( need_export && ! id->IsExport() && ! in_debug ) - reporter->Error("identifier is not exported: %s", fullname.c_str()); + const auto& id = (*s_i)->Find(fullname); - return id; + if ( id ) + { + if ( need_export && ! id->IsExport() && ! in_debug ) + reporter->Error("identifier is not exported: %s", fullname.c_str()); + + return id; + } } } diff --git a/src/module_util.cc b/src/module_util.cc index d835e86613..772f220318 100644 --- a/src/module_util.cc +++ b/src/module_util.cc @@ -28,6 +28,7 @@ TEST_CASE("module_util streq") TEST_CASE("module_util extract_module_name") { CHECK(extract_module_name("mod") == GLOBAL_MODULE_NAME); + CHECK(extract_module_name("::var") == GLOBAL_MODULE_NAME); CHECK(extract_module_name("mod::") == "mod"); CHECK(extract_module_name("mod::var") == "mod"); } @@ -38,7 +39,7 @@ string extract_module_name(const char* name) string module_name = name; string::size_type pos = module_name.rfind("::"); - if ( pos == string::npos ) + if ( pos == string::npos || pos == 0 ) return GLOBAL_MODULE_NAME; module_name.erase(pos); @@ -89,16 +90,18 @@ TEST_CASE("module_util make_full_var_name") CHECK(make_full_var_name(nullptr, "GLOBAL::var") == "var"); CHECK(make_full_var_name(GLOBAL_MODULE_NAME, "var") == "var"); CHECK(make_full_var_name(nullptr, "notglobal::var") == "notglobal::var"); - CHECK(make_full_var_name(nullptr, "::var") == "::var"); + CHECK(make_full_var_name(nullptr, "::var") == "var"); CHECK(make_full_var_name("module", "var") == "module::var"); CHECK(make_full_var_name("module::", "var") == "module::var"); - CHECK(make_full_var_name("", "var") == "::var"); + CHECK(make_full_var_name("", "var") == "var"); + CHECK(make_full_var_name("", "::var") == "var"); } string make_full_var_name(const char* module_name, const char* var_name) { - if ( ! module_name || streq(module_name, GLOBAL_MODULE_NAME) || strstr(var_name, "::") ) + if ( ! module_name || streq(module_name, "") || streq(module_name, GLOBAL_MODULE_NAME) || + strstr(var_name, "::") ) { if ( streq(GLOBAL_MODULE_NAME, extract_module_name(var_name).c_str()) ) return extract_var_name(var_name); diff --git a/src/parse.y b/src/parse.y index 61936b8996..d9c4309445 100644 --- a/src/parse.y +++ b/src/parse.y @@ -21,6 +21,7 @@ %token TOK_STRING TOK_SUBNET TOK_SWITCH TOK_TABLE %token TOK_TIME TOK_TIMEOUT TOK_TYPE TOK_VECTOR TOK_WHEN %token TOK_WHILE TOK_AS TOK_IS +%token TOK_GLOBAL_ID %token TOK_ATTR_ADD_FUNC TOK_ATTR_DEFAULT TOK_ATTR_OPTIONAL TOK_ATTR_REDEF %token TOK_ATTR_DEL_FUNC TOK_ATTR_EXPIRE_FUNC @@ -55,7 +56,7 @@ %nonassoc TOK_AS TOK_IS %type opt_no_test opt_no_test_block opt_deep when_flavor -%type TOK_ID TOK_PATTERN_TEXT +%type TOK_ID TOK_PATTERN_TEXT TOK_GLOBAL_ID lookup_identifier %type local_id global_id def_global_id event_id global_or_event_id resolve_id begin_lambda case_type %type local_id_list case_type_list %type init_class @@ -925,7 +926,7 @@ expr: $$ = new ScheduleExpr({AdoptRef{}, $2}, {AdoptRef{}, $4}); } - | TOK_ID + | lookup_identifier { set_location(@1); auto id = lookup_ID($1, current_module.c_str()); @@ -1976,7 +1977,7 @@ stmt_list: ; event: - TOK_ID '(' opt_expr_list ')' + lookup_identifier '(' opt_expr_list ')' { set_location(@1, @4); const auto& id = lookup_ID($1, current_module.c_str()); @@ -2179,7 +2180,7 @@ event_id: ; global_or_event_id: - TOK_ID + lookup_identifier { set_location(@1); auto id = lookup_ID($1, current_module.c_str(), false, @@ -2217,7 +2218,7 @@ global_or_event_id: resolve_id: - TOK_ID + lookup_identifier { set_location(@1); auto id = lookup_ID($1, current_module.c_str()); @@ -2230,6 +2231,20 @@ resolve_id: } ; +lookup_identifier: + TOK_ID + | + TOK_GLOBAL_ID + { + if ( is_export ) + { + reporter->Error("cannot use :: prefix in export section: %s", $1); + YYERROR; + } + } + + ; + opt_assert_msg: ',' expr { $$ = $2; } diff --git a/src/scan.l b/src/scan.l index 9fa8c3d118..e9138faaf1 100644 --- a/src/scan.l +++ b/src/scan.l @@ -233,6 +233,8 @@ D [0-9]+ HEX [0-9a-fA-F]+ IDCOMPONENT [A-Za-z_][A-Za-z_0-9]* ID {IDCOMPONENT}(::{IDCOMPONENT})* +/* Token including including :: prefix for lookups of global identifiers */ +GLOBAL_ID ::{IDCOMPONENT} IP6 ("["({HEX}:){7}{HEX}"]")|("["0x{HEX}({HEX}|:)*"::"({HEX}|:)*"]")|("["({HEX}|:)*"::"({HEX}|:)*"]")|("["({HEX}:){6}({D}"."){3}{D}"]")|("["({HEX}|:)*"::"({HEX}|:)*({D}"."){3}{D}"]") FILE [^ \t\r\n]+ PREFIX [^ \t\r\n]+ @@ -549,6 +551,12 @@ F RET_CONST(zeek::val_mgr->False()->Ref()) return TOK_ID; } +{GLOBAL_ID} { + yylval.str = zeek::util::copy_string(yytext); + last_id_tok = yylval.str; + return TOK_GLOBAL_ID; + } + {D} { RET_CONST(zeek::val_mgr->Count(static_cast(strtoull(yytext, (char**) NULL, 10))).release()) } diff --git a/testing/btest/Baseline/language.deprecate-global/.stderr b/testing/btest/Baseline/language.deprecate-global/.stderr new file mode 100644 index 0000000000..ba832c6e5f --- /dev/null +++ b/testing/btest/Baseline/language.deprecate-global/.stderr @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +warning in <...>/deprecate-global.zeek, line 22: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::test_function) +warning in <...>/deprecate-global.zeek, line 26: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::X) diff --git a/testing/btest/Baseline/language.deprecate-global/out b/testing/btest/Baseline/language.deprecate-global/out new file mode 100644 index 0000000000..3987e838f5 --- /dev/null +++ b/testing/btest/Baseline/language.deprecate-global/out @@ -0,0 +1,4 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +X, shadows ::X (42) +::X, 42 +GLOBAL::X, 42 diff --git a/testing/btest/Baseline/language.event-shadowing/.stderr b/testing/btest/Baseline/language.event-shadowing/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.event-shadowing/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.event-shadowing/out b/testing/btest/Baseline/language.event-shadowing/out new file mode 100644 index 0000000000..e6ec7ebd62 --- /dev/null +++ b/testing/btest/Baseline/language.event-shadowing/out @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +::zeek_init() diff --git a/testing/btest/Baseline/language.global-colon-colon-errors-2/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors-2/.stderr new file mode 100644 index 0000000000..9e4bc66f21 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors-2/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 3: syntax error, at or near "::disabling_analyzer" diff --git a/testing/btest/Baseline/language.global-colon-colon-errors-3/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors-3/.stderr new file mode 100644 index 0000000000..df988546dc --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors-3/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 5: cannot use :: prefix in export section: ::c diff --git a/testing/btest/Baseline/language.global-colon-colon-errors-4/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors-4/.stderr new file mode 100644 index 0000000000..b953cc5f44 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors-4/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 2: syntax error, at or near "::a" diff --git a/testing/btest/Baseline/language.global-colon-colon-errors-5/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors-5/.stderr new file mode 100644 index 0000000000..d8adb90eed --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors-5/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 4: unknown identifier ::missing, at or near "::missing" diff --git a/testing/btest/Baseline/language.global-colon-colon-errors-6/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors-6/.stderr new file mode 100644 index 0000000000..ee78c0dc53 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors-6/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 9: unknown identifier MyModule::f, at or near "MyModule::f" diff --git a/testing/btest/Baseline/language.global-colon-colon-errors/.stderr b/testing/btest/Baseline/language.global-colon-colon-errors/.stderr new file mode 100644 index 0000000000..f2e0110b41 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-errors/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/global-colon-colon-errors.zeek, line 7: syntax error, at or near "::a" diff --git a/testing/btest/Baseline/language.global-colon-colon-redef/.stderr b/testing/btest/Baseline/language.global-colon-colon-redef/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-redef/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.global-colon-colon-redef/out b/testing/btest/Baseline/language.global-colon-colon-redef/out new file mode 100644 index 0000000000..d397701460 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon-redef/out @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +connection, MyModule::connection, { +[y] = [type_name=count, log=F, value=, default_val=, optional=T] +} +::connection, connection, [type_name=count, log=F, value=, default_val=, optional=T] diff --git a/testing/btest/Baseline/language.global-colon-colon/.stderr b/testing/btest/Baseline/language.global-colon-colon/.stderr new file mode 100644 index 0000000000..a24c303643 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon/.stderr @@ -0,0 +1,9 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +warning in <...>/global-colon-colon.zeek, line 67: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::X) +warning in <...>/global-colon-colon.zeek, line 75: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::my_hook) +warning in <...>/global-colon-colon.zeek, line 82: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::func) +warning in <...>/global-colon-colon.zeek, line 89: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::funcX) +warning in <...>/global-colon-colon.zeek, line 110: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::X) +warning in <...>/global-colon-colon.zeek, line 118: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::my_hook) +warning in <...>/global-colon-colon.zeek, line 125: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::func) +warning in <...>/global-colon-colon.zeek, line 132: Remove in v7.1: Use :: instead of GLOBAL:: (GLOBAL::funcX) diff --git a/testing/btest/Baseline/language.global-colon-colon/out b/testing/btest/Baseline/language.global-colon-colon/out new file mode 100644 index 0000000000..59ffb07de4 --- /dev/null +++ b/testing/btest/Baseline/language.global-colon-colon/out @@ -0,0 +1,75 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +(MyModule) print X + MyModule X +(MyModule) print MyModule::X + MyModule X +(MyModule) print GLOBAL::X + global X +(MyModule) print ::X + global X +(MyModule) hook my_hook() + MyModule::my_hook() (in GLOBAL) + MyModule::my_hook() +(MyModule) hook MyModule::my_hook() + MyModule::my_hook() (in GLOBAL) + MyModule::my_hook() +(MyModule) hook GLOBAL::my_hook() + my_hook() (in GLOBAL) + ::my_hook() (in GLOBAL) + ::my_hook() (in MyModule using ::) +(MyModule) hook ::my_hook() + my_hook() (in GLOBAL) + ::my_hook() (in GLOBAL) + ::my_hook() (in MyModule using ::) +(MyModule) call func() + MyModule::func() +(MyModule) call GLOBAL::func() + GLOBAL::func() +(MyModule) call ::func() + GLOBAL::func() +(MyModule) call funcX() + ::funcX() (in MyModule) +(MyModule) call GLOBAL::funcX() + ::funcX() (in MyModule) +(MyModule) call ::funcX() + ::funcX() (in MyModule) +(G) print X + global X +(G) print MyModule::X + MyModule X +(G) print GLOBAL::X + global X +(G) print ::X + global X +(G) hook my_hook() + my_hook() (in GLOBAL) + ::my_hook() (in GLOBAL) + ::my_hook() (in MyModule using ::) +(G) MyModule::my_hook() + MyModule::my_hook() (in GLOBAL) + MyModule::my_hook() +(G) hook GLOBAL::my_hook() + my_hook() (in GLOBAL) + ::my_hook() (in GLOBAL) + ::my_hook() (in MyModule using ::) +(G) hook ::my_hook() + my_hook() (in GLOBAL) + ::my_hook() (in GLOBAL) + ::my_hook() (in MyModule using ::) +(G) call func() + GLOBAL::func() +(G) call GLOBAL::func() + GLOBAL::func() +(G) call ::func() + GLOBAL::func() +(G) call funcX() + ::funcX() (in MyModule) +(G) call GLOBAL::funcX() + ::funcX() (in MyModule) +(G) call ::funcX() + ::funcX() (in MyModule) + MyModule::my_event() (in MyModule) + MyModule::my_event() (in GLOBAL) + my_event() (in GLOBAL) + ::my_event() in (in GLOBAL) + ::my_event() (in MyModule) diff --git a/testing/btest/language/deprecate-global.zeek b/testing/btest/language/deprecate-global.zeek new file mode 100644 index 0000000000..236cc3bf19 --- /dev/null +++ b/testing/btest/language/deprecate-global.zeek @@ -0,0 +1,27 @@ +# @TEST-DOC: Adapt in v7.1 to check for errors upon GLOBAL accesses. + +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr + +module GLOBAL; + +function test_function() { } + +global X = 42; + + +module MyModule; + +global X = fmt("shadows ::X (%s)", ::X); + +event zeek_init() + { + test_function(); + ::test_function(); + GLOBAL::test_function(); + + print "X", X; + print "::X", ::X; + print "GLOBAL::X", GLOBAL::X; + } diff --git a/testing/btest/language/enum-scope.zeek b/testing/btest/language/enum-scope.zeek index 246f918a20..f531f057b3 100644 --- a/testing/btest/language/enum-scope.zeek +++ b/testing/btest/language/enum-scope.zeek @@ -11,4 +11,4 @@ export { type foo: enum { a, b }; } -print GLOBAL::a, GLOBAL::b, a, b, c; +print ::a, ::b, a, b, c; diff --git a/testing/btest/language/event-shadowing.zeek b/testing/btest/language/event-shadowing.zeek new file mode 100644 index 0000000000..d25f34e135 --- /dev/null +++ b/testing/btest/language/event-shadowing.zeek @@ -0,0 +1,23 @@ +# @TEST-DOC: Shadow zeek_init() event, demonstrate ::zeek_init() usage. +# +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: btest-diff .stderr + +module MyModule; + +export { + ## MyModule::zeek_init() shadows global zeek_init() event. + global zeek_init: event(); +} + +# This is never invoked! +event zeek_init() + { + print "MyModule::zeek_init() - FAIL"; + } + +event ::zeek_init() + { + print "::zeek_init()"; + } diff --git a/testing/btest/language/global-colon-colon-errors.zeek b/testing/btest/language/global-colon-colon-errors.zeek new file mode 100644 index 0000000000..c795cf7e44 --- /dev/null +++ b/testing/btest/language/global-colon-colon-errors.zeek @@ -0,0 +1,45 @@ +# @TEST-EXEC-FAIL: zeek -b %INPUT >&2 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr + +event zeek_init() + { + # Do not allow local variables with ::prefix. + local ::a = 1; + } + +@TEST-START-NEXT + +# Do not allow :: prefix for an identifier containing a module. +hook ::Analyzer::disabling_analyzer(c: connection, atype: AllAnalyzers::Tag, aid: count) { } + +@TEST-START-NEXT +# Do not allow exporting names with :: +module MyModule; + +export { + global ::c = 1; + global ::h: hook(); +} + +@TEST-START-NEXT +# Do not allow :: prefix on parameter names. +function f(::a: string) { } + +@TEST-START-NEXT +# Non-existing global identifier. +event zeek_init() + { + print ::missing; + } + +@TEST-START-NEXT + +module MyModule; + +function ::f() { +} + +event zeek_init() + { + MyModule::f(); + } diff --git a/testing/btest/language/global-colon-colon-redef.zeek b/testing/btest/language/global-colon-colon-redef.zeek new file mode 100644 index 0000000000..5c34e722be --- /dev/null +++ b/testing/btest/language/global-colon-colon-redef.zeek @@ -0,0 +1,26 @@ +# @TEST-DOC: redef of ::type works when global type is shadowed by module. + +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: btest-diff .stderr + +module MyModule; + +# Module private connection type. +type connection: record { }; + +# Redefing the moduleconnection record. +redef record connection += { + y: count &optional; +}; + +# Redefing the global connection record. +redef record ::connection += { + x: count &optional; +}; + +event zeek_init() + { + print "connection", connection, record_fields(connection); + print "::connection", ::connection, record_fields(::connection)["x"]; + } diff --git a/testing/btest/language/global-colon-colon.zeek b/testing/btest/language/global-colon-colon.zeek new file mode 100644 index 0000000000..f1abef9066 --- /dev/null +++ b/testing/btest/language/global-colon-colon.zeek @@ -0,0 +1,165 @@ +# @TEST-DOC: GLOBAL:: and just :: are the same, adapt with v7.1 to remove GLOBAL:: usage. +# @TEST-EXEC: zeek -b %INPUT >out + +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr + +module GLOBAL; + +global X = "global X"; + +global my_hook: hook(); +global my_event: event(); + +function func() { + print " GLOBAL::func()"; +} + +module MyModule; + +export { + global X = "MyModule X"; + global my_hook: hook(); + global my_event: event(); + global func: function(); +} + +# This implements MyModule::my_hook() +hook my_hook() &priority=9 + { + print " MyModule::my_hook()"; + } + +# This implements GLOBAL::my_hook() +hook ::my_hook() &priority=8 + { + print " ::my_hook() (in MyModule using ::)"; + } + +event my_event() &priority=9 + { + print " MyModule::my_event() (in MyModule)"; + } + +event ::my_event() &priority=8 + { + print " ::my_event() (in MyModule)"; + } + +function func() + { + print " MyModule::func()"; + } + +# This one is a bit funky: Defines a global function while in a module. +function ::funcX() + { + print " ::funcX() (in MyModule)"; + } + +event zeek_init() &priority=5 + { + print "(MyModule) print X"; + print fmt(" %s", X); + print "(MyModule) print MyModule::X"; + print fmt(" %s", MyModule::X); + print "(MyModule) print GLOBAL::X"; + print fmt(" %s", GLOBAL::X); + print "(MyModule) print ::X"; + print fmt(" %s", ::X); + print "(MyModule) hook my_hook()"; + hook my_hook(); # This uses MyModule::my_hook(); + print "(MyModule) hook MyModule::my_hook()"; + hook MyModule::my_hook(); # This uses MyModule::hook(); + print "(MyModule) hook GLOBAL::my_hook()"; + hook GLOBAL::my_hook(); + print "(MyModule) hook ::my_hook()"; + hook ::my_hook(); + + print "(MyModule) call func()"; + func(); + print "(MyModule) call GLOBAL::func()"; + GLOBAL::func(); + print "(MyModule) call ::func()"; + ::func(); + + print "(MyModule) call funcX()"; + funcX(); + print "(MyModule) call GLOBAL::funcX()"; + GLOBAL::funcX(); + print "(MyModule) call ::funcX()"; + ::funcX(); + + # This schedules MyEvent::my_event() + event my_event(); + + # This schedules the GLOBAL::my_event(); + event ::my_event(); + } + + +module GLOBAL; + +event zeek_init() &priority=5 + { + print "(G) print X"; + print fmt(" %s", X); + print "(G) print MyModule::X"; + print fmt(" %s", MyModule::X); + print "(G) print GLOBAL::X"; + print fmt(" %s", GLOBAL::X); + print "(G) print ::X"; + print fmt(" %s", ::X); + print "(G) hook my_hook()"; + hook my_hook(); # This uses GLOBAL::my_hook(); + print "(G) MyModule::my_hook()"; + hook MyModule::my_hook(); # This uses MyModule::hook(); + print "(G) hook GLOBAL::my_hook()"; + hook GLOBAL::my_hook(); + print "(G) hook ::my_hook()"; + hook ::my_hook(); + + print "(G) call func()"; + func(); + print "(G) call GLOBAL::func()"; + GLOBAL::func(); + print "(G) call ::func()"; + ::func(); + + print "(G) call funcX()"; + funcX(); + print "(G) call GLOBAL::funcX()"; + GLOBAL::funcX(); + print "(G) call ::funcX()"; + ::funcX(); + } + +hook my_hook() &priority=10 + { + print " my_hook() (in GLOBAL)"; + } + +hook ::my_hook() &priority=10 + { + print " ::my_hook() (in GLOBAL)"; + } + +hook MyModule::my_hook() &priority=10 + { + print " MyModule::my_hook() (in GLOBAL)"; + } + +event MyModule::my_event() &priority=9 + { + print " MyModule::my_event() (in GLOBAL)"; + } + +event my_event() &priority=10 + { + print " my_event() (in GLOBAL)"; + } + +event ::my_event() &priority=10 + { + print " ::my_event() in (in GLOBAL)"; + } diff --git a/testing/btest/language/no-module.zeek b/testing/btest/language/no-module.zeek index e209936c90..3f22e0bb44 100644 --- a/testing/btest/language/no-module.zeek +++ b/testing/btest/language/no-module.zeek @@ -28,7 +28,7 @@ event zeek_init() { test_case( "function", T ); test_case( "global variable", num == 123 ); - test_case( "fully qualified global variable", GLOBAL::num == 123 ); # test for BIT-1758 : GLOBAL scope ID discovery bug + test_case( "fully qualified global variable", ::num == 123 ); test_case( "const", daysperyear == 365 ); event testevent( "foo" ); } From da6ee8125d428d44f13a10c1f3e52bb568c296bf Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Tue, 11 Jul 2023 12:52:41 +0200 Subject: [PATCH 2/2] ci: Bust Ubuntu 22.10 image cache Cirrus jobs failing to pull the image, try rebuilding. --- ci/ubuntu-22.10/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ubuntu-22.10/Dockerfile b/ci/ubuntu-22.10/Dockerfile index 63f9ca2dd5..fc6c6e896d 100644 --- a/ci/ubuntu-22.10/Dockerfile +++ b/ci/ubuntu-22.10/Dockerfile @@ -4,7 +4,7 @@ ENV DEBIAN_FRONTEND="noninteractive" TZ="America/Los_Angeles" # A version field to invalidate Cirrus's build cache when needed, as suggested in # https://github.com/cirruslabs/cirrus-ci-docs/issues/544#issuecomment-566066822 -ENV DOCKERFILE_VERSION 20230413 +ENV DOCKERFILE_VERSION 20230711 RUN apt-get update && apt-get -y install \ bc \