diff --git a/CHANGES b/CHANGES index efaa51f596..89cc1d1c22 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,22 @@ +4.1.0-dev.355 | 2021-03-23 19:05:10 -0700 + + * add option for deterministic descriptions of sets & tables (Vern Paxson, Corelight) + + * determinism for concurrent Zeek test suite invocations; split out deprecations (Vern Paxson, Corelight) + + * disambiguate descriptions of enum types; include attributes when describing record types (Vern Paxson, Corelight) + + * more liberal view of attribute equality; allow suppressing attr type-checking (Vern Paxson, Corelight) + + * support for operations on sets that return new values (Vern Paxson, Corelight) + + * add low-level method for adding new enum values (Vern Paxson, Corelight) + + * sundry accessors/cast-ers; RE_Matcher's track their construction values (Vern Paxson, Corelight) + + * add convenience functions for comparing IP addresses (Vern Paxson, Corelight) + 4.1.0-dev.346 | 2021-03-23 17:25:02 -0700 * Add new ``./configure --plugindir`` option (Vlad Grigorescu) diff --git a/VERSION b/VERSION index 5775bc751e..d1342ec5fb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.1.0-dev.346 +4.1.0-dev.355 diff --git a/src/Attr.cc b/src/Attr.cc index 6850c80b5f..976fde083e 100644 --- a/src/Attr.cc +++ b/src/Attr.cc @@ -208,8 +208,11 @@ void Attributes::AddAttr(AttrPtr attr, bool is_redef) attrs.emplace_back(attr); // We only check the attribute after we've added it, to facilitate - // generating error messages via Attributes::Describe. - CheckAttr(attr.get()); + // generating error messages via Attributes::Describe. If the + // instantiator of the object specified a null type, however, then + // that's a signal to skip the checking. + if ( type ) + CheckAttr(attr.get()); // For ADD_FUNC or DEL_FUNC, add in an implicit REDEF, since // those attributes only have meaning for a redefinable value. diff --git a/src/Attr.h b/src/Attr.h index 5f1f2ab59f..9c29c4ccd0 100644 --- a/src/Attr.h +++ b/src/Attr.h @@ -86,10 +86,11 @@ public: return false; if ( expr || other.expr ) - // If any has an expression and they aren't the same object, we - // declare them unequal, as we can't really find out if the two - // expressions are equivalent. - return (expr == other.expr); + // Too hard to check for equivalency, since one + // might be expressed/compiled differently than + // the other, so assume they're compatible, as + // long as both are present. + return expr && other.expr; return true; } diff --git a/src/Desc.cc b/src/Desc.cc index 3497f73680..0def8cd8aa 100644 --- a/src/Desc.cc +++ b/src/Desc.cc @@ -40,6 +40,7 @@ ODesc::ODesc(DescType t, File* arg_f) indent_level = 0; is_short = false; want_quotes = false; + want_determinism = false; do_flush = true; include_stats = false; indent_with_spaces = 0; diff --git a/src/Desc.h b/src/Desc.h index 54900329ec..23fb172ec6 100644 --- a/src/Desc.h +++ b/src/Desc.h @@ -47,6 +47,11 @@ public: bool WantQuotes() const { return want_quotes; } void SetQuotes(bool q) { want_quotes = q; } + // Whether to ensure deterministic output (for example, when + // describing TableVal's). + bool WantDeterminism() const { return want_determinism; } + void SetDeterminism(bool d) { want_determinism = d; } + // Whether we want to print statistics like access time and execution // count where available. bool IncludeStats() const { return include_stats; } @@ -194,6 +199,7 @@ protected: bool escape; // escape unprintable characters in output? bool is_short; bool want_quotes; + bool want_determinism; int indent_with_spaces; diff --git a/src/Expr.h b/src/Expr.h index d0560942e1..ae275a7a84 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -96,6 +96,7 @@ class IndexAssignExpr; class IndexExpr; class IsExpr; class InlineExpr; +class LambdaExpr; class ListExpr; class NameExpr; class RefExpr; @@ -216,6 +217,7 @@ public: ZEEK_EXPR_ACCESSOR_DECLS(IndexExpr) ZEEK_EXPR_ACCESSOR_DECLS(IsExpr) ZEEK_EXPR_ACCESSOR_DECLS(InlineExpr) + ZEEK_EXPR_ACCESSOR_DECLS(LambdaExpr) ZEEK_EXPR_ACCESSOR_DECLS(ListExpr) ZEEK_EXPR_ACCESSOR_DECLS(NameExpr) ZEEK_EXPR_ACCESSOR_DECLS(RefExpr) @@ -1304,7 +1306,9 @@ public: LambdaExpr(std::unique_ptr ingredients, IDPList outer_ids); + const std::string& Name() const { return my_name; } const IDPList& OuterIDs() const { return outer_ids; } + const function_ingredients& Ingredients() const { return *ingredients; } ValPtr Eval(Frame* f) const override; TraversalCode Traverse(TraversalCallback* cb) const override; @@ -1427,7 +1431,7 @@ class IsExpr final : public UnaryExpr { public: IsExpr(ExprPtr op, TypePtr t); - TypePtr TestType() const { return t; } + const TypePtr& TestType() const { return t; } // Optimization-related: ExprPtr Duplicate() override; diff --git a/src/IPAddr.h b/src/IPAddr.h index f4b9d0693d..d2cfda09b1 100644 --- a/src/IPAddr.h +++ b/src/IPAddr.h @@ -39,7 +39,11 @@ struct ConnIDKey { } bool operator<(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) < 0; } + bool operator<=(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) <= 0; } bool operator==(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) == 0; } + bool operator!=(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) != 0; } + bool operator>=(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) >= 0; } + bool operator>(const ConnIDKey& rhs) const { return memcmp(this, &rhs, sizeof(ConnIDKey)) > 0; } ConnIDKey& operator=(const ConnIDKey& rhs) { diff --git a/src/RE.cc b/src/RE.cc index 9639f8223c..0348dc4284 100644 --- a/src/RE.cc +++ b/src/RE.cc @@ -479,7 +479,7 @@ RE_Matcher::RE_Matcher() re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); } -RE_Matcher::RE_Matcher(const char* pat) +RE_Matcher::RE_Matcher(const char* pat) : orig_text(pat) { re_anywhere = new detail::Specific_RE_Matcher(detail::MATCH_ANYWHERE); re_exact = new detail::Specific_RE_Matcher(detail::MATCH_EXACTLY); @@ -511,6 +511,8 @@ void RE_Matcher::MakeCaseInsensitive() { re_anywhere->MakeCaseInsensitive(); re_exact->MakeCaseInsensitive(); + + is_case_insensitive = true; } bool RE_Matcher::Compile(bool lazy) diff --git a/src/RE.h b/src/RE.h index fdbd023fd7..ab1b5a3439 100644 --- a/src/RE.h +++ b/src/RE.h @@ -197,6 +197,7 @@ public: // Makes the matcher as specified to date case-insensitive. void MakeCaseInsensitive(); + bool IsCaseInsensitive() const { return is_case_insensitive; } bool Compile(bool lazy = false); @@ -227,6 +228,10 @@ public: const char* PatternText() const { return re_exact->PatternText(); } const char* AnywherePatternText() const { return re_anywhere->PatternText(); } + // Original text used to construct this matcher. Empty unless + // the main ("explicit") constructor was used. + const char* OrigText() const { return orig_text.c_str(); } + unsigned int MemoryAllocation() const { return padded_sizeof(*this) @@ -235,8 +240,12 @@ public: } protected: + std::string orig_text; + detail::Specific_RE_Matcher* re_anywhere; detail::Specific_RE_Matcher* re_exact; + + bool is_case_insensitive = false; }; } // namespace zeek diff --git a/src/Type.cc b/src/Type.cc index 4969d56dc2..7f545059f2 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -147,6 +147,18 @@ FuncType* Type::AsFuncType() return (FuncType*) this; } +const FileType* Type::AsFileType() const + { + CHECK_TYPE_TAG(TYPE_FILE, "Type::AsFileType"); + return (const FileType*) this; + } + +FileType* Type::AsFileType() + { + CHECK_TYPE_TAG(TYPE_FILE, "Type::AsFileType"); + return (FileType*) this; + } + const EnumType* Type::AsEnumType() const { CHECK_TYPE_TAG(TYPE_ENUM, "Type::AsEnumType"); @@ -1052,6 +1064,12 @@ void RecordType::DescribeFields(ODesc* d) const else td->type->Describe(d); + if ( td->attrs ) + { + d->SP(); + td->attrs->Describe(d); + } + d->Add(";"); } } @@ -1355,6 +1373,14 @@ void EnumType::AddNameInternal(const string& module_name, const char* name, names[fullname] = val; } +void EnumType::AddNameInternal(const string& full_name, bro_int_t val) + { + names[full_name] = val; + + if ( vals.find(val) == vals.end() ) + vals[val] = make_intrusive(IntrusivePtr{NewRef{}, this}, val); + } + bro_int_t EnumType::Lookup(const string& module_name, const char* name) const { NameMap::const_iterator pos = @@ -1399,6 +1425,27 @@ const EnumValPtr& EnumType::GetEnumVal(bro_int_t i) return it->second; } +void EnumType::Describe(ODesc* d) const + { + auto t = Tag(); + + if ( d->IsBinary() ) + { + d->Add(int(t)); + if ( ! d->IsShort() ) + d->Add(GetName()); + } + else + { + d->Add(type_name(t)); + if ( ! d->IsShort() ) + { + d->SP(); + d->Add(GetName()); + } + } + } + void EnumType::DescribeReST(ODesc* d, bool roles_only) const { d->Add(":zeek:type:`enum`"); diff --git a/src/Type.h b/src/Type.h index 7726da52c9..72c52a6e45 100644 --- a/src/Type.h +++ b/src/Type.h @@ -219,6 +219,9 @@ public: const FuncType* AsFuncType() const; FuncType* AsFuncType(); + const FileType* AsFileType() const; + FileType* AsFileType(); + const EnumType* AsEnumType() const; EnumType* AsEnumType(); @@ -595,7 +598,8 @@ public: // Given an offset, returns the field's name. const char* FieldName(int field) const; - type_decl_list* Types() { return types; } + const type_decl_list* Types() const { return types; } + type_decl_list* Types() { return types; } // Given an offset, returns the field's TypeDecl. const TypeDecl* FieldDecl(int field) const; @@ -704,6 +708,7 @@ public: // will be fully qualified with their module name. enum_name_list Names() const; + void Describe(ODesc* d) const override; void DescribeReST(ODesc* d, bool roles_only = false) const override; const EnumValPtr& GetEnumVal(bro_int_t i); @@ -712,6 +717,8 @@ protected: void AddNameInternal(const std::string& module_name, const char* name, bro_int_t val, bool is_export); + void AddNameInternal(const std::string& full_name, bro_int_t val); + void CheckAndAddName(const std::string& module_name, const char* name, bro_int_t val, bool is_export, detail::Expr* deprecation = nullptr, diff --git a/src/Val.cc b/src/Val.cc index e76a62d0f8..924e0e858e 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -71,6 +71,8 @@ Val::~Val() CONVERTER(tag, ctype, name) \ CONST_CONVERTER(tag, ctype, name) +CONVERTERS(TYPE_FUNC, FuncVal*, Val::AsFuncVal) +CONVERTERS(TYPE_FILE, FileVal*, Val::AsFileVal) CONVERTERS(TYPE_PATTERN, PatternVal*, Val::AsPatternVal) CONVERTERS(TYPE_PORT, PortVal*, Val::AsPortVal) CONVERTERS(TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal) @@ -2332,6 +2334,9 @@ void TableVal::Describe(ODesc* d) const d->PushIndent(); } + bool determ = d->WantDeterminism(); + std::vector elem_descs; + auto iter = table_val->begin(); for ( int i = 0; i < n; ++i ) @@ -2345,7 +2350,10 @@ void TableVal::Describe(ODesc* d) const auto vl = table_hash->RecoverVals(*k); int dim = vl->Length(); - if ( i > 0 ) + ODesc intermediary_d; + ODesc* d_ptr = determ ? &intermediary_d : d; + + if ( ! determ && i > 0 ) { if ( ! d->IsBinary() ) d->Add(","); @@ -2356,42 +2364,65 @@ void TableVal::Describe(ODesc* d) const if ( d->IsReadable() ) { if ( dim != 1 || ! table_type->IsSet() ) - d->Add("["); + d_ptr->Add("["); } else { - d->Add(dim); - d->SP(); + d_ptr->Add(dim); + d_ptr->SP(); } - vl->Describe(d); + vl->Describe(d_ptr); if ( table_type->IsSet() ) { // We're a set, not a table. if ( d->IsReadable() ) if ( dim != 1 ) - d->AddSP("]"); + d_ptr->AddSP("]"); } else { if ( d->IsReadable() ) - d->AddSP("] ="); + d_ptr->AddSP("] ="); if ( v->GetVal() ) - v->GetVal()->Describe(d); + v->GetVal()->Describe(d_ptr); } if ( d->IsReadable() && ! d->IsShort() && d->IncludeStats() ) { - d->Add(" @"); - d->Add(util::detail::fmt_access_time(v->ExpireAccessTime())); + d_ptr->Add(" @"); + d_ptr->Add(util::detail::fmt_access_time(v->ExpireAccessTime())); } + if ( determ ) + elem_descs.emplace_back(d_ptr->Description()); + ++iter; } if ( iter != table_val->end() ) reporter->InternalError("hash table overflow in TableVal::Describe"); + if ( determ ) + { + sort(elem_descs.begin(), elem_descs.end()); + bool did_elems = false; + + for ( const auto& ed : elem_descs ) + { + if ( did_elems ) + { + if ( ! d->IsBinary() ) + d->Add(","); + + d->NL(); + } + + d->Add(ed); + did_elems = true; + } + } + if ( d->IsPortable() || d->IsReadable() ) { d->PopIndent(); @@ -3499,7 +3530,8 @@ void describe_vals(const std::vector& vals, if ( i > offset && d->IsReadable() && d->Style() != RAW_STYLE ) d->Add(", "); - vals[i]->Describe(d); + if ( vals[i] ) + vals[i]->Describe(d); } } diff --git a/src/Val.h b/src/Val.h index e035e8a76e..4ee197afdb 100644 --- a/src/Val.h +++ b/src/Val.h @@ -61,6 +61,8 @@ class PortVal; class AddrVal; class SubNetVal; class IntervalVal; +class FuncVal; +class FileVal; class PatternVal; class TableVal; class RecordVal; @@ -143,6 +145,12 @@ UNDERLYING_ACCESSOR_DECL(PatternVal, const RE_Matcher*, AsPattern) UNDERLYING_ACCESSOR_DECL(TableVal, const PDict*, AsTable) UNDERLYING_ACCESSOR_DECL(TypeVal, zeek::Type*, AsType) + FuncVal* AsFuncVal(); + const FuncVal* AsFuncVal() const; + + FileVal* AsFileVal(); + const FileVal* AsFileVal() const; + PatternVal* AsPatternVal(); const PatternVal* AsPatternVal() const; @@ -760,6 +768,32 @@ public: */ TableValPtr Intersection(const TableVal& v) const; + /** + * Returns a new table that is the union of this table and the + * given table. Union is done only on index, so this generally + * makes most sense to use for sets, not tables. + * @param v The union'ing table. + * @return The union of this table and the given one. + */ + TableValPtr Union(TableVal* v) const + { + auto v_clone = cast_intrusive(v->Clone()); + AddTo(v_clone.get(), false, false); + return v_clone; + } + + /** + * Returns a copy of this table with the given table removed. + * @param v The table to remove. + * @return The subset of this table that doesn't include v. + */ + TableValPtr TakeOut(TableVal* v) + { + auto clone = cast_intrusive(Clone()); + v->RemoveFrom(clone.get()); + return clone; + } + // Returns true if this set contains the same members as the // given set. Note that comparisons are done using hash keys, // so errors can arise for compound sets such as sets-of-sets. diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 8002ef37a6..d77f20ea22 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -85,6 +85,12 @@ const AnyIndexExpr* Expr::AsAnyIndexExpr() const return (const AnyIndexExpr*) this; } +const LambdaExpr* Expr::AsLambdaExpr() const + { + CHECK_TAG(tag, EXPR_LAMBDA, "ExprVal::AsLambdaExpr", expr_name) + return (const LambdaExpr*) this; + } + ExprPtr Expr::GetOp1() const { return nullptr; } ExprPtr Expr::GetOp2() const { return nullptr; } ExprPtr Expr::GetOp3() const { return nullptr; } diff --git a/testing/btest/Baseline/bifs.type_name/out b/testing/btest/Baseline/bifs.type_name/out index f96c9b51cc..8b4e1ce81e 100644 --- a/testing/btest/Baseline/bifs.type_name/out +++ b/testing/btest/Baseline/bifs.type_name/out @@ -7,7 +7,7 @@ bool time interval pattern -enum +enum color port addr addr diff --git a/testing/btest/Baseline/language.alternate-prototypes-default-args/errors b/testing/btest/Baseline/language.alternate-prototypes-default-args/errors index 842e9f2548..a4ebed301e 100644 --- a/testing/btest/Baseline/language.alternate-prototypes-default-args/errors +++ b/testing/btest/Baseline/language.alternate-prototypes-default-args/errors @@ -1,2 +1,2 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -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;)) +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 &default=A, &optional;) and event(a:string; b:string; c:string &default=C, &optional;)) diff --git a/testing/btest/Baseline/language.closure-binding-deprecated/out b/testing/btest/Baseline/language.closure-binding-deprecated/out new file mode 100644 index 0000000000..066ca90cec --- /dev/null +++ b/testing/btest/Baseline/language.closure-binding-deprecated/out @@ -0,0 +1,12 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +reference capture +4, 10 +6, 8 +7, 7 +reference double capture +4 +2, 10, 47 +4 +2, 8, 47 +3 +1, 7, 47 diff --git a/testing/btest/Baseline/language.closure-binding/out b/testing/btest/Baseline/language.closure-binding/out index 891492d324..d5c7c22634 100644 --- a/testing/btest/Baseline/language.closure-binding/out +++ b/testing/btest/Baseline/language.closure-binding/out @@ -1,43 +1,42 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -4, 10 -6, 8 -7, 7 +shallow copy 4, 10 5, 8 6, 7 +deep copy 4, 10 5, 9 6, 8 +mixed copy, case 1 4, 10 5, 8 6, 7 +mixed copy, case 2 4, 10 5, 9 6, 8 -4 -2, 10, 47 -4 -2, 8, 47 -3 -1, 7, 47 +double shallow copy 4 2, 10, 47 5 3, 8, 47 6 4, 7, 47 +double deep copy, case 1 4 2, 10, 47 5 3, 9, 47 6 4, 8, 47 +double deep copy, case 2 4 2, 10, 91 5 3, 9, 91 6 4, 9, 91 +double deep copy, case 3 4 2, 10, 91 5 diff --git a/testing/btest/Baseline/language.closure-sending-deprecated/recv.recv.out b/testing/btest/Baseline/language.closure-sending-deprecated/recv.recv.out new file mode 100644 index 0000000000..d48a41b96d --- /dev/null +++ b/testing/btest/Baseline/language.closure-sending-deprecated/recv.recv.out @@ -0,0 +1,27 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +hello :-) +peer added +receiver got ping: function 2 +inside: 1 | outside: 12 | global: 100 +77 +receiver got ping: function 1 +begin: 100 | base_step: 2 +begin: 100 | base_step: 2 | step: 76 +178 +receiver got ping: function 2 +inside: 3 | outside: 12 | global: 100 +79 +receiver got ping: function 1 +begin: 100 | base_step: 4 +begin: 100 | base_step: 4 | step: 76 +180 +receiver got ping: function 2 +inside: 5 | outside: 12 | global: 100 +81 +receiver got ping: function 1 +begin: 100 | base_step: 6 +begin: 100 | base_step: 6 | step: 76 +182 +receiver got ping: function 2 +inside: 7 | outside: 12 | global: 100 +83 diff --git a/testing/btest/Baseline/language.closure-sending-deprecated/send.send.out b/testing/btest/Baseline/language.closure-sending-deprecated/send.send.out new file mode 100644 index 0000000000..39d70d48d5 --- /dev/null +++ b/testing/btest/Baseline/language.closure-sending-deprecated/send.send.out @@ -0,0 +1,32 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +hello :) +peer added +begin: 100 | base_step: 50 +sender got pong: function 2 +inside: 1 | outside: 12 | global: 10 +77 +begin: 100 | base_step: 50 +sender got pong: function 1 +begin: 178 | base_step: 2 +begin: 178 | base_step: 2 | step: 76 +256 +begin: 100 | base_step: 50 +sender got pong: function 2 +inside: 3 | outside: 12 | global: 10 +79 +begin: 100 | base_step: 50 +sender got pong: function 1 +begin: 180 | base_step: 4 +begin: 180 | base_step: 4 | step: 76 +260 +begin: 100 | base_step: 50 +sender got pong: function 2 +inside: 5 | outside: 12 | global: 10 +81 +begin: 100 | base_step: 50 +sender got pong: function 1 +begin: 182 | base_step: 6 +begin: 182 | base_step: 6 | step: 76 +264 +begin: 100 | base_step: 50 +peer lost diff --git a/testing/btest/Baseline/language.copy-all-types/out b/testing/btest/Baseline/language.copy-all-types/out index 767e229f78..3a5e6dbb8d 100644 --- a/testing/btest/Baseline/language.copy-all-types/out +++ b/testing/btest/Baseline/language.copy-all-types/out @@ -9,5 +9,5 @@ orig=/^?(.*PATTERN.*)$?/ (pattern) clone=/^?(.*PATTERN.*)$?/ (pattern) same_obje orig=2,5,3,4,1 (set[count]) clone=2,5,3,4,1 (set[count]) equal=T same_object=F (ok) orig=[1, 2, 3, 4, 5] (vector of count) clone=[1, 2, 3, 4, 5] (vector of count) equal=T same_object=F (ok) orig=a=va;b=vb (table[string] of string) clone=a=va;b=vb (table[string] of string) equal=T same_object=F (ok) -orig=ENUMME (enum) clone=ENUMME (enum) equal=T same_object=T (ok) -orig=[s1=s1, s2=s2, i1=[a=a], i2=[a=a], donotset=, def=5] (record { s1:string; s2:string; i1:record { a:string; }; i2:record { a:string; }; donotset:record { a:string; }; def:count; }) clone=[s1=s1, s2=s2, i1=[a=a], i2=[a=a], donotset=, def=5] (record { s1:string; s2:string; i1:record { a:string; }; i2:record { a:string; }; donotset:record { a:string; }; def:count; }) equal=T same_object=F (ok) +orig=ENUMME (enum MyEnum) clone=ENUMME (enum MyEnum) equal=T same_object=T (ok) +orig=[s1=s1, s2=s2, i1=[a=a], i2=[a=a], donotset=, def=5] (record { s1:string; s2:string; i1:record { a:string; }; i2:record { a:string; } &optional; donotset:record { a:string; } &optional; def:count &default=5, &optional; }) clone=[s1=s1, s2=s2, i1=[a=a], i2=[a=a], donotset=, def=5] (record { s1:string; s2:string; i1:record { a:string; }; i2:record { a:string; } &optional; donotset:record { a:string; } &optional; def:count &default=5, &optional; }) equal=T same_object=F (ok) diff --git a/testing/btest/Baseline/language.record-function-recursion/out b/testing/btest/Baseline/language.record-function-recursion/out index 15181bfcc1..9f32322cd6 100644 --- a/testing/btest/Baseline/language.record-function-recursion/out +++ b/testing/btest/Baseline/language.record-function-recursion/out @@ -1,3 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. [id=, inner=] -record { id:count; inner:record { create:function(input:;) : string; }; } +record { id:count &optional; inner:record { create:function(input:;) : string; } &optional; } diff --git a/testing/btest/Baseline/language.type-cast-error-dynamic/output b/testing/btest/Baseline/language.type-cast-error-dynamic/output index 19e917d7be..bf6438e3e6 100644 --- a/testing/btest/Baseline/language.type-cast-error-dynamic/output +++ b/testing/btest/Baseline/language.type-cast-error-dynamic/output @@ -1,5 +1,5 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. expression error in <...>/type-cast-error-dynamic.zeek, line 11: invalid cast of value with type 'count' to type 'string' (a as string) expression error in <...>/type-cast-error-dynamic.zeek, line 11: invalid cast of value with type 'record { a:addr; b:port; }' to type 'string' (a as string) -expression error in <...>/type-cast-error-dynamic.zeek, line 11: invalid cast of value with type 'record { data:opaque of Broker::Data; }' to type 'string' (nil $data field) (a as string) +expression error in <...>/type-cast-error-dynamic.zeek, line 11: invalid cast of value with type 'record { data:opaque of Broker::Data &optional; }' to type 'string' (nil $data field) (a as string) data is string, F diff --git a/testing/btest/Baseline/language.type-coerce-numerics/first_set.out b/testing/btest/Baseline/language.type-coerce-numerics/first_set.out index 7516e00089..f053ab7046 100644 --- a/testing/btest/Baseline/language.type-coerce-numerics/first_set.out +++ b/testing/btest/Baseline/language.type-coerce-numerics/first_set.out @@ -1,6 +1,6 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. error in int and ./first_set.zeek, line 46: overflow promoting from unsigned/double to signed arithmetic value (int and 9223372036854775808) -expression error in ./first_set.zeek, line 46: Failed type conversion ((coerce [$ii=9223372036854775808] to record { ii:int; cc:count; dd:double; })) +expression error in ./first_set.zeek, line 46: Failed type conversion ((coerce [$ii=9223372036854775808] to record { ii:int &optional; cc:count &optional; dd:double &optional; })) 3 int 4 diff --git a/testing/btest/Baseline/language.uninitialized-local3/out b/testing/btest/Baseline/language.uninitialized-local3/out index 70650b5bb5..e65bf87f36 100644 --- a/testing/btest/Baseline/language.uninitialized-local3/out +++ b/testing/btest/Baseline/language.uninitialized-local3/out @@ -1,6 +1,6 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -warning in <...>/uninitialized-local3.zeek, line 33: possibly used without definition (x4) -expression error in <...>/uninitialized-local3.zeek, line 33: value used but not set (x4) +warning in <...>/uninitialized-local3.zeek, line 38: possibly used without definition (x4) +expression error in <...>/uninitialized-local3.zeek, line 38: value used but not set (x4) x$a (x <...>/uninitialized-local3.zeek, line 20) possibly used without being set x$e (x <...>/uninitialized-local3.zeek, line 20) possibly used without being set x$e (x <...>/uninitialized-local3.zeek, line 24) possibly used without being set diff --git a/testing/btest/Baseline/language.vector-of-enum/out b/testing/btest/Baseline/language.vector-of-enum/out index d02272c5f3..283fcabc84 100644 --- a/testing/btest/Baseline/language.vector-of-enum/out +++ b/testing/btest/Baseline/language.vector-of-enum/out @@ -1,2 +1,2 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -vector of enum, [Red, Green, Blue] +vector of enum color, [Red, Green, Blue] diff --git a/testing/btest/Baseline/plugins.hooks/output b/testing/btest/Baseline/plugins.hooks/output index 780e01ccde..700c195e39 100644 --- a/testing/btest/Baseline/plugins.hooks/output +++ b/testing/btest/Baseline/plugins.hooks/output @@ -615,14 +615,14 @@ 0.000000 MetaHookPost CallFunction(SumStats::add_observe_plugin_dependency, , (SumStats::VARIANCE, SumStats::AVERAGE)) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::AVERAGE, lambda_<3452231521688988155>{ if (!SumStats::rv?$average) SumStats::rv$average = SumStats::valelseSumStats::rv$average += (SumStats::val - SumStats::rv$average) / (coerce SumStats::rv$num to double)})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::HLL_UNIQUE, lambda_<943258244234523627>{ if (!SumStats::rv?$card) { SumStats::rv$card = hll_cardinality_init(SumStats::r$hll_error_margin, SumStats::r$hll_confidence)SumStats::rv$hll_error_margin = SumStats::r$hll_error_marginSumStats::rv$hll_confidence = SumStats::r$hll_confidence}hll_cardinality_add(SumStats::rv$card, SumStats::obs)SumStats::rv$hll_unique = double_to_count(hll_cardinality_estimate(SumStats::rv$card))})) -> -0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::LAST, lambda_<14831357773699754131>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}})) -> +0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::LAST, lambda_<6246854644409869026>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::MAX, lambda_<9734000075919044397>{ if (!SumStats::rv?$max) SumStats::rv$max = SumStats::valelseif (SumStats::rv$max < SumStats::val) SumStats::rv$max = SumStats::val})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::MIN, lambda_<2451066605226214733>{ if (!SumStats::rv?$min) SumStats::rv$min = SumStats::valelseif (SumStats::val < SumStats::rv$min) SumStats::rv$min = SumStats::val})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::SAMPLE, lambda_<11888441397542569241>{ SumStats::sample_add_sample(SumStats::obs, SumStats::rv)})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::STD_DEV, lambda_<5704045257244168718>{ SumStats::calc_std_dev(SumStats::rv)})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::SUM, lambda_<6958532551242393774>{ SumStats::rv$sum += SumStats::val})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::TOPK, lambda_<2861372781530360365>{ topk_add(SumStats::rv$topk, SumStats::obs)})) -> -0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::UNIQUE, lambda_<10387912117292132662>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals})) -> +0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::UNIQUE, lambda_<14393221830775341876>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugin, , (SumStats::VARIANCE, lambda_<6557258612059469785>{ if (1 < SumStats::rv$num) SumStats::rv$var_s += ((SumStats::val - SumStats::rv$prev_avg) * (SumStats::val - SumStats::rv$average))SumStats::calc_variance(SumStats::rv)SumStats::rv$prev_avg = SumStats::rv$average})) -> 0.000000 MetaHookPost CallFunction(SumStats::register_observe_plugins, , ()) -> 0.000000 MetaHookPost CallFunction(__init_primary_bifs, , ()) -> @@ -1618,14 +1618,14 @@ 0.000000 MetaHookPre CallFunction(SumStats::add_observe_plugin_dependency, , (SumStats::VARIANCE, SumStats::AVERAGE)) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::AVERAGE, lambda_<3452231521688988155>{ if (!SumStats::rv?$average) SumStats::rv$average = SumStats::valelseSumStats::rv$average += (SumStats::val - SumStats::rv$average) / (coerce SumStats::rv$num to double)})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::HLL_UNIQUE, lambda_<943258244234523627>{ if (!SumStats::rv?$card) { SumStats::rv$card = hll_cardinality_init(SumStats::r$hll_error_margin, SumStats::r$hll_confidence)SumStats::rv$hll_error_margin = SumStats::r$hll_error_marginSumStats::rv$hll_confidence = SumStats::r$hll_confidence}hll_cardinality_add(SumStats::rv$card, SumStats::obs)SumStats::rv$hll_unique = double_to_count(hll_cardinality_estimate(SumStats::rv$card))})) -0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::LAST, lambda_<14831357773699754131>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}})) +0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::LAST, lambda_<6246854644409869026>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::MAX, lambda_<9734000075919044397>{ if (!SumStats::rv?$max) SumStats::rv$max = SumStats::valelseif (SumStats::rv$max < SumStats::val) SumStats::rv$max = SumStats::val})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::MIN, lambda_<2451066605226214733>{ if (!SumStats::rv?$min) SumStats::rv$min = SumStats::valelseif (SumStats::val < SumStats::rv$min) SumStats::rv$min = SumStats::val})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::SAMPLE, lambda_<11888441397542569241>{ SumStats::sample_add_sample(SumStats::obs, SumStats::rv)})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::STD_DEV, lambda_<5704045257244168718>{ SumStats::calc_std_dev(SumStats::rv)})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::SUM, lambda_<6958532551242393774>{ SumStats::rv$sum += SumStats::val})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::TOPK, lambda_<2861372781530360365>{ topk_add(SumStats::rv$topk, SumStats::obs)})) -0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::UNIQUE, lambda_<10387912117292132662>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals})) +0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::UNIQUE, lambda_<14393221830775341876>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugin, , (SumStats::VARIANCE, lambda_<6557258612059469785>{ if (1 < SumStats::rv$num) SumStats::rv$var_s += ((SumStats::val - SumStats::rv$prev_avg) * (SumStats::val - SumStats::rv$average))SumStats::calc_variance(SumStats::rv)SumStats::rv$prev_avg = SumStats::rv$average})) 0.000000 MetaHookPre CallFunction(SumStats::register_observe_plugins, , ()) 0.000000 MetaHookPre CallFunction(__init_primary_bifs, , ()) @@ -2620,14 +2620,14 @@ 0.000000 | HookCallFunction SumStats::add_observe_plugin_dependency(SumStats::VARIANCE, SumStats::AVERAGE) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::AVERAGE, lambda_<3452231521688988155>{ if (!SumStats::rv?$average) SumStats::rv$average = SumStats::valelseSumStats::rv$average += (SumStats::val - SumStats::rv$average) / (coerce SumStats::rv$num to double)}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::HLL_UNIQUE, lambda_<943258244234523627>{ if (!SumStats::rv?$card) { SumStats::rv$card = hll_cardinality_init(SumStats::r$hll_error_margin, SumStats::r$hll_confidence)SumStats::rv$hll_error_margin = SumStats::r$hll_error_marginSumStats::rv$hll_confidence = SumStats::r$hll_confidence}hll_cardinality_add(SumStats::rv$card, SumStats::obs)SumStats::rv$hll_unique = double_to_count(hll_cardinality_estimate(SumStats::rv$card))}) -0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::LAST, lambda_<14831357773699754131>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}}) +0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::LAST, lambda_<6246854644409869026>{ if (0 < SumStats::r$num_last_elements) { if (!SumStats::rv?$last_elements) SumStats::rv$last_elements = Queue::init((coerce [$max_len=SumStats::r$num_last_elements] to Queue::Settings))Queue::put(SumStats::rv$last_elements, SumStats::obs)}}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::MAX, lambda_<9734000075919044397>{ if (!SumStats::rv?$max) SumStats::rv$max = SumStats::valelseif (SumStats::rv$max < SumStats::val) SumStats::rv$max = SumStats::val}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::MIN, lambda_<2451066605226214733>{ if (!SumStats::rv?$min) SumStats::rv$min = SumStats::valelseif (SumStats::val < SumStats::rv$min) SumStats::rv$min = SumStats::val}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::SAMPLE, lambda_<11888441397542569241>{ SumStats::sample_add_sample(SumStats::obs, SumStats::rv)}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::STD_DEV, lambda_<5704045257244168718>{ SumStats::calc_std_dev(SumStats::rv)}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::SUM, lambda_<6958532551242393774>{ SumStats::rv$sum += SumStats::val}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::TOPK, lambda_<2861372781530360365>{ topk_add(SumStats::rv$topk, SumStats::obs)}) -0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::UNIQUE, lambda_<10387912117292132662>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals}) +0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::UNIQUE, lambda_<14393221830775341876>{ if (!SumStats::rv?$unique_vals) SumStats::rv$unique_vals = (coerce set() to set[SumStats::Observation])if (SumStats::r?$unique_max) SumStats::rv$unique_max = SumStats::r$unique_maxif (!SumStats::r?$unique_max || sizeofSumStats::rv$unique_vals <= SumStats::r$unique_max) add SumStats::rv$unique_vals[SumStats::obs]SumStats::rv$unique = sizeofSumStats::rv$unique_vals}) 0.000000 | HookCallFunction SumStats::register_observe_plugin(SumStats::VARIANCE, lambda_<6557258612059469785>{ if (1 < SumStats::rv$num) SumStats::rv$var_s += ((SumStats::val - SumStats::rv$prev_avg) * (SumStats::val - SumStats::rv$average))SumStats::calc_variance(SumStats::rv)SumStats::rv$prev_avg = SumStats::rv$average}) 0.000000 | HookCallFunction SumStats::register_observe_plugins() 0.000000 | HookCallFunction __init_primary_bifs() diff --git a/testing/btest/Baseline/scripts.base.frameworks.input.errors/.stderr b/testing/btest/Baseline/scripts.base.frameworks.input.errors/.stderr index 62cc8f4164..902551f30a 100644 --- a/testing/btest/Baseline/scripts.base.frameworks.input.errors/.stderr +++ b/testing/btest/Baseline/scripts.base.frameworks.input.errors/.stderr @@ -9,29 +9,29 @@ error: Input stream filetable: Problem unrolling The input framework does not support optional record fields: "r" error: Input stream optionalrecordtable: Problem unrolling Encountered incompatible type "file" in type definition for field "s" in ReaderFrontend. Ignoring optional field. -error: Input stream optionalfiletable: Table type does not match value type. Need type 'record { i:int; s:file of string; }', got 'record { i:int; r:record { i:int; s:file of string; }; }' +error: Input stream optionalfiletable: Table type does not match value type. Need type 'record { i:int; s:file of string &optional; }', got 'record { i:int; r:record { i:int; s:file of string; } &optional; }' error: Input stream optionalfiletable2: Table type does not match index type. Need type 'count':count, got 'string':string error: Input stream optionalfiletable3: Stream event is a function, not an event error: Input stream optionalfiletable3: Table event must take 4 arguments error: Input stream optionalfiletable4: Table event's first attribute must be of type Input::TableDescription error: Input stream optionalfiletable5: Table event's second attribute must be of type Input::Event -error: Input stream optionalfiletable6: Table event's index attributes do not match. Need 'record { c:count; }', got 'record { i:int; r:record { i:int; s:file of string; }; }' -error: Input stream optionalfiletable7: Table event's value attributes do not match. Need 'record { i:int; s:file of string; }', got 'record { i:int; r:record { i:int; s:file of string; }; }' +error: Input stream optionalfiletable6: Table event's index attributes do not match. Need 'record { c:count; }', got 'record { i:int; r:record { i:int; s:file of string; } &optional; }' +error: Input stream optionalfiletable7: Table event's value attributes do not match. Need 'record { i:int; s:file of string &optional; }', got 'record { i:int; r:record { i:int; s:file of string; } &optional; }' error: Input stream optionalfiletable8: Stream does not want a record (want_record=F), but has more then one value field. error: Input stream optionalfiletable9: Table has less elements than index definition error: Input stream optionalfiletable10: Table type has more indexes than index definition error: Input stream optionalfiletable11: Table type does not match value type. Need type 'count', got 'int' error: Input stream optionalfiletable12: Table type does not match value type. Need type 'count', got 'record { i:int; s:string; a:addr; }' -error: Input stream optionalfiletable14: Table type does not match value type. Need type 'int', got 'record { i:int; s:file of string; }' +error: Input stream optionalfiletable14: Table type does not match value type. Need type 'int', got 'record { i:int; s:file of string &optional; }' error: Input stream optionalfiletable15: Table type does not match value type. Need type 'record { c:count; }', got 'record { i:int; s:string; a:addr; }' error: Input stream event1: Stream event is a function, not an event error: Input stream event2: Event does not take enough arguments error: Input stream event3: Event's first attribute must be of type Input::EventDescription error: Input stream event4: Event's second attribute must be of type Input::Event -error: Input stream event5: Incompatible type 'record':record { i:int; r:record { i:int; s:file of string; }; } for event, which needs type 'record':record { i:int; s:file of string; } +error: Input stream event5: Incompatible type 'record':record { i:int; r:record { i:int; s:file of string; } &optional; } for event, which needs type 'record':record { i:int; s:file of string &optional; } error: Input stream event6: Event has wrong number of arguments -error: Input stream event7: Incompatible type for event in field 3. Need type 'int':int, got 'record':record { i:int; r:record { i:int; s:file of string; }; } +error: Input stream event7: Incompatible type for event in field 3. Need type 'int':int, got 'record':record { i:int; r:record { i:int; s:file of string; } &optional; } error: Input stream event8: Incompatible type for event in field 5. Need type 'addr':addr, got 'string':string error: Input stream event9: Event has wrong number of arguments error: Input stream error1: Error event's first attribute must be of type Input::EventDescription diff --git a/testing/btest/core/conn-uid.zeek b/testing/btest/core/conn-uid.zeek index 5852236ff0..6c7c326492 100644 --- a/testing/btest/core/conn-uid.zeek +++ b/testing/btest/core/conn-uid.zeek @@ -1,7 +1,7 @@ # # In "normal" test mode, connection uids should be determistic. # -# @TEST-EXEC: zeek -b -C -r $TRACES/wikipedia.trace %INPUT >output +# @TEST-EXEC: zeek -b -D -C -r $TRACES/wikipedia.trace %INPUT >output # @TEST-EXEC: btest-diff output # # Without a seed, they should differ each time: diff --git a/testing/btest/language/closure-binding-deprecated.zeek b/testing/btest/language/closure-binding-deprecated.zeek new file mode 100644 index 0000000000..90a5c7e78f --- /dev/null +++ b/testing/btest/language/closure-binding-deprecated.zeek @@ -0,0 +1,47 @@ +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out + +type mutable_aggregate: record { x: count; }; + +function reference_capture() : function() + { + local a = 3; + local b = mutable_aggregate($x=11); + local f = function() { print ++a, --b$x; }; + f(); + ++a; + --b$x; + f(); + + return f; + } + +function reference_capture_double() : function() : function() + { + local a = 3; + local b = mutable_aggregate($x=11); + local f = function() : function() { + local c = mutable_aggregate($x=88); + print ++a; + local f2 = function() { print a -= 2, --b$x, c$x += 3; }; + c$x = c$x / 2; + return f2; + }; + f()(); + ++a; + --b$x; + f()(); + + return f; + } + +event zeek_init() + { + print "reference capture"; + local rc = reference_capture(); + rc(); + + print "reference double capture"; + local rc2 = reference_capture_double(); + rc2()(); + } diff --git a/testing/btest/language/closure-binding.zeek b/testing/btest/language/closure-binding.zeek index 6e1596b6f9..241c92484d 100644 --- a/testing/btest/language/closure-binding.zeek +++ b/testing/btest/language/closure-binding.zeek @@ -3,19 +3,6 @@ type mutable_aggregate: record { x: count; }; -function reference_capture() : function() - { - local a = 3; - local b = mutable_aggregate($x=11); - local f = function() { print ++a, --b$x; }; - f(); - ++a; - --b$x; - f(); - - return f; - } - function shallow_copy_capture() : function() { local a = 3; @@ -68,25 +55,6 @@ function mixed_copy_capture_b() : function() return f; } -function reference_capture_double() : function() : function() - { - local a = 3; - local b = mutable_aggregate($x=11); - local f = function() : function() { - local c = mutable_aggregate($x=88); - print ++a; - local f2 = function() { print a -= 2, --b$x, c$x += 3; }; - c$x = c$x / 2; - return f2; - }; - f()(); - ++a; - --b$x; - f()(); - - return f; - } - function shallow_copy_capture_double() : function() : function() { local a = 3; @@ -167,33 +135,35 @@ function deep_copy3_capture_double() : function() : function() event zeek_init() { - local rc = reference_capture(); - rc(); - + print "shallow copy"; local scc = shallow_copy_capture(); scc(); + print "deep copy"; local dcc = deep_copy_capture(); dcc(); + print "mixed copy, case 1"; local mcca = mixed_copy_capture_a(); mcca(); + print "mixed copy, case 2"; local mccb = mixed_copy_capture_b(); mccb(); - local rc2 = reference_capture_double(); - rc2()(); - + print "double shallow copy"; local scc2 = shallow_copy_capture_double(); scc2()(); + print "double deep copy, case 1"; local dcc2_1 = deep_copy1_capture_double(); dcc2_1()(); + print "double deep copy, case 2"; local dcc2_2 = deep_copy2_capture_double(); dcc2_2()(); + print "double deep copy, case 3"; local dcc2_3 = deep_copy3_capture_double(); dcc2_3()(); } diff --git a/testing/btest/language/closure-sending.zeek b/testing/btest/language/closure-sending-deprecated.zeek similarity index 96% rename from testing/btest/language/closure-sending.zeek rename to testing/btest/language/closure-sending-deprecated.zeek index f5a3e44035..09f403fc9b 100644 --- a/testing/btest/language/closure-sending.zeek +++ b/testing/btest/language/closure-sending-deprecated.zeek @@ -1,7 +1,7 @@ # @TEST-PORT: BROKER_PORT # -# @TEST-EXEC: btest-bg-run recv "zeek -B broker -b ../recv.zeek >recv.out" -# @TEST-EXEC: btest-bg-run send "zeek -B broker -b ../send.zeek >send.out" +# @TEST-EXEC: btest-bg-run recv "zeek -D -B broker -b ../recv.zeek >recv.out" +# @TEST-EXEC: btest-bg-run send "zeek -D -B broker -b ../send.zeek >send.out" # # @TEST-EXEC: btest-bg-wait 45 # @TEST-EXEC: btest-diff recv/recv.out diff --git a/testing/btest/language/closure-sending-naming.zeek b/testing/btest/language/closure-sending-naming.zeek index e616574002..92268c9a93 100644 --- a/testing/btest/language/closure-sending-naming.zeek +++ b/testing/btest/language/closure-sending-naming.zeek @@ -1,7 +1,7 @@ # @TEST-PORT: BROKER_PORT # -# @TEST-EXEC: btest-bg-run recv "zeek -B broker -b ../recv.zeek >recv.out 2>recv.error" -# @TEST-EXEC: btest-bg-run send "zeek -B broker -b ../send.zeek >send.out" +# @TEST-EXEC: btest-bg-run recv "zeek -D -B broker -b ../recv.zeek >recv.out 2>recv.error" +# @TEST-EXEC: btest-bg-run send "zeek -D -B broker -b ../send.zeek >send.out" # # @TEST-EXEC: btest-bg-wait 20 # @TEST-EXEC: btest-diff recv/recv.error diff --git a/testing/btest/language/closure-sending2.zeek b/testing/btest/language/closure-sending2.zeek index c6a421a708..e447b8224c 100644 --- a/testing/btest/language/closure-sending2.zeek +++ b/testing/btest/language/closure-sending2.zeek @@ -1,7 +1,7 @@ # @TEST-PORT: BROKER_PORT # -# @TEST-EXEC: btest-bg-run recv "zeek -B broker -b ../recv.zeek >recv.out" -# @TEST-EXEC: btest-bg-run send "zeek -B broker -b ../send.zeek >send.out" +# @TEST-EXEC: btest-bg-run recv "zeek -D -B broker -b ../recv.zeek >recv.out" +# @TEST-EXEC: btest-bg-run send "zeek -D -B broker -b ../send.zeek >send.out" # # @TEST-EXEC: btest-bg-wait 45 # @TEST-EXEC: btest-diff recv/recv.out diff --git a/testing/btest/language/function-sending.zeek b/testing/btest/language/function-sending.zeek index a45911878a..234e0a5431 100644 --- a/testing/btest/language/function-sending.zeek +++ b/testing/btest/language/function-sending.zeek @@ -1,7 +1,7 @@ # @TEST-PORT: BROKER_PORT # -# @TEST-EXEC: btest-bg-run recv "zeek -B broker -b ../recv.zeek >recv.out" -# @TEST-EXEC: btest-bg-run send "zeek -B broker -b ../send.zeek >send.out" +# @TEST-EXEC: btest-bg-run recv "zeek -D -B broker -b ../recv.zeek >recv.out" +# @TEST-EXEC: btest-bg-run send "zeek -D -B broker -b ../send.zeek >send.out" # # @TEST-EXEC: btest-bg-wait 20 # @TEST-EXEC: btest-diff recv/recv.out diff --git a/testing/btest/language/paraglob-serialization.zeek b/testing/btest/language/paraglob-serialization.zeek index c5d5d516dd..788aa4e95f 100644 --- a/testing/btest/language/paraglob-serialization.zeek +++ b/testing/btest/language/paraglob-serialization.zeek @@ -1,7 +1,7 @@ # @TEST-PORT: BROKER_PORT # -# @TEST-EXEC: btest-bg-run recv "zeek -B broker -b ../recv.zeek >recv.out" -# @TEST-EXEC: btest-bg-run send "zeek -B broker -b ../send.zeek >send.out" +# @TEST-EXEC: btest-bg-run recv "zeek -D -B broker -b ../recv.zeek >recv.out" +# @TEST-EXEC: btest-bg-run send "zeek -D -B broker -b ../send.zeek >send.out" # # @TEST-EXEC: btest-bg-wait 45 # @TEST-EXEC: btest-diff recv/recv.out diff --git a/testing/btest/language/uninitialized-local3.zeek b/testing/btest/language/uninitialized-local3.zeek index b251960633..f3aae38f5b 100644 --- a/testing/btest/language/uninitialized-local3.zeek +++ b/testing/btest/language/uninitialized-local3.zeek @@ -30,5 +30,13 @@ event zeek_init() print x3; local x4: count; - print x4; # note, no execution after this point due to error + # note, no execution after this point due to error + + # We use this slightly baroque expression because compiled code + # may have x4 genuinely uninitialized, and we want deterministic + # output in that case. + if ( x4 > 5 ) + print T; + else + print T; }