Tame error reporting and abort() for undefined types

The script added as a test case reports the following messages *and*
dumps a core file. Printing the first error and a normal failure exit
seems sufficient. IMO triggering an abort() due to user scripting issues
is not something that Zeek should do

    $ zeek ./identifier-not-defined-error.zeek
    error in ./identifier-not-defined-error.zeek, line 10: identifier not defined: MyEnu
    error in ./identifier-not-defined-error.zeek, line 10 and error: &default value has inconsistent type (M::MY_ENUM_A and error)
    internal error in ./identifier-not-defined-error.zeek, line 11: type inconsistency in ZVal constructor
    Aborted (core dumped)

Change is to skip certain checks when an error type is propagated.
This commit is contained in:
Arne Welzel 2023-01-26 14:40:15 +01:00
parent 9a96e3b52a
commit 25ee288a76
4 changed files with 20 additions and 3 deletions

View file

@ -243,8 +243,9 @@ void Attributes::AddAttr(AttrPtr attr, bool is_redef)
// We only check the attribute after we've added it, to facilitate
// 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 )
// that's a signal to skip the checking. If the type is error,
// there's no point checking attributes either.
if ( type && ! IsErrorType(type->Tag()) )
CheckAttr(attr.get());
// For ADD_FUNC or DEL_FUNC, add in an implicit REDEF, since

View file

@ -1088,7 +1088,7 @@ void RecordType::AddField(unsigned int field, const TypeDecl* td)
auto def_attr = a ? a->Find(detail::ATTR_DEFAULT) : nullptr;
auto def_expr = def_attr ? def_attr->GetExpr() : nullptr;
if ( def_expr )
if ( def_expr && ! IsErrorType(type->Tag()) )
{
if ( type->Tag() == TYPE_RECORD && def_expr->GetType()->Tag() == TYPE_RECORD &&
! same_type(def_expr->GetType(), type) )

View file

@ -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 <...>/identifier-not-defined-error.zeek, line 12: identifier not defined: MyEnumTypo

View file

@ -0,0 +1,14 @@
# @TEST-EXEC-FAIL: zeek -b %INPUT >out 2>&1
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out
module MyModule;
export {
type MyEnum: enum {
MY_ENUM_A,
MY_ENUM_B,
};
type MyRec: record {
a: MyEnumTypo &default=MY_ENUM_A;
};
}