GH-786: fix Val::As methods casting incomplete types

This commit is contained in:
Jon Siwek 2020-07-02 14:55:04 -07:00
parent 5cba12444a
commit 902173a358
2 changed files with 59 additions and 33 deletions

View file

@ -82,6 +82,36 @@ Val::~Val()
#endif #endif
} }
#define CONVERTER(tag, ctype, name) \
ctype name() \
{ \
CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \
return (ctype)(this); \
}
#define CONST_CONVERTER(tag, ctype, name) \
const ctype name() const \
{ \
CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \
return (const ctype)(this); \
}
#define CONVERTERS(tag, ctype, name) \
CONVERTER(tag, ctype, name) \
CONST_CONVERTER(tag, ctype, name)
CONVERTERS(zeek::TYPE_PATTERN, PatternVal*, Val::AsPatternVal)
CONVERTERS(zeek::TYPE_PORT, PortVal*, Val::AsPortVal)
CONVERTERS(zeek::TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal)
CONVERTERS(zeek::TYPE_ADDR, AddrVal*, Val::AsAddrVal)
CONVERTERS(zeek::TYPE_TABLE, TableVal*, Val::AsTableVal)
CONVERTERS(zeek::TYPE_RECORD, RecordVal*, Val::AsRecordVal)
CONVERTERS(zeek::TYPE_LIST, ListVal*, Val::AsListVal)
CONVERTERS(zeek::TYPE_STRING, StringVal*, Val::AsStringVal)
CONVERTERS(zeek::TYPE_VECTOR, VectorVal*, Val::AsVectorVal)
CONVERTERS(zeek::TYPE_ENUM, EnumVal*, Val::AsEnumVal)
CONVERTERS(zeek::TYPE_OPAQUE, OpaqueVal*, Val::AsOpaqueVal)
IntrusivePtr<Val> Val::CloneState::NewClone(Val* src, IntrusivePtr<Val> dst) IntrusivePtr<Val> Val::CloneState::NewClone(Val* src, IntrusivePtr<Val> dst)
{ {
clones.insert(std::make_pair(src, dst.get())); clones.insert(std::make_pair(src, dst.get()));

View file

@ -277,42 +277,38 @@ public:
bro_int_t ForceAsInt() const { return val.int_val; } bro_int_t ForceAsInt() const { return val.int_val; }
bro_uint_t ForceAsUInt() const { return val.uint_val; } bro_uint_t ForceAsUInt() const { return val.uint_val; }
#define CONVERTER(tag, ctype, name) \ PatternVal* AsPatternVal();
ctype name() \ const PatternVal* AsPatternVal() const;
{ \
CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \
return (ctype)(this); \
}
CONVERTER(zeek::TYPE_PATTERN, PatternVal*, AsPatternVal) PortVal* AsPortVal();
CONVERTER(zeek::TYPE_PORT, PortVal*, AsPortVal) const PortVal* AsPortVal() const;
CONVERTER(zeek::TYPE_SUBNET, SubNetVal*, AsSubNetVal)
CONVERTER(zeek::TYPE_ADDR, AddrVal*, AsAddrVal)
CONVERTER(zeek::TYPE_TABLE, TableVal*, AsTableVal)
CONVERTER(zeek::TYPE_RECORD, RecordVal*, AsRecordVal)
CONVERTER(zeek::TYPE_LIST, ListVal*, AsListVal)
CONVERTER(zeek::TYPE_STRING, StringVal*, AsStringVal)
CONVERTER(zeek::TYPE_VECTOR, VectorVal*, AsVectorVal)
CONVERTER(zeek::TYPE_ENUM, EnumVal*, AsEnumVal)
CONVERTER(zeek::TYPE_OPAQUE, OpaqueVal*, AsOpaqueVal)
#define CONST_CONVERTER(tag, ctype, name) \ SubNetVal* AsSubNetVal();
const ctype name() const \ const SubNetVal* AsSubNetVal() const;
{ \
CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \
return (const ctype)(this); \
}
CONST_CONVERTER(zeek::TYPE_PATTERN, PatternVal*, AsPatternVal) AddrVal* AsAddrVal();
CONST_CONVERTER(zeek::TYPE_PORT, PortVal*, AsPortVal) const AddrVal* AsAddrVal() const;
CONST_CONVERTER(zeek::TYPE_SUBNET, SubNetVal*, AsSubNetVal)
CONST_CONVERTER(zeek::TYPE_ADDR, AddrVal*, AsAddrVal) TableVal* AsTableVal();
CONST_CONVERTER(zeek::TYPE_TABLE, TableVal*, AsTableVal) const TableVal* AsTableVal() const;
CONST_CONVERTER(zeek::TYPE_RECORD, RecordVal*, AsRecordVal)
CONST_CONVERTER(zeek::TYPE_LIST, ListVal*, AsListVal) RecordVal* AsRecordVal();
CONST_CONVERTER(zeek::TYPE_STRING, StringVal*, AsStringVal) const RecordVal* AsRecordVal() const;
CONST_CONVERTER(zeek::TYPE_VECTOR, VectorVal*, AsVectorVal)
CONST_CONVERTER(zeek::TYPE_OPAQUE, OpaqueVal*, AsOpaqueVal) ListVal* AsListVal();
const ListVal* AsListVal() const;
StringVal* AsStringVal();
const StringVal* AsStringVal() const;
VectorVal* AsVectorVal();
const VectorVal* AsVectorVal() const;
EnumVal* AsEnumVal();
const EnumVal* AsEnumVal() const;
OpaqueVal* AsOpaqueVal();
const OpaqueVal* AsOpaqueVal() const;
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
virtual void DescribeReST(ODesc* d) const; virtual void DescribeReST(ODesc* d) const;