mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Merge remote-tracking branch 'origin/topic/jsiwek/gh-786-fix-incomplete-casts'
* origin/topic/jsiwek/gh-786-fix-incomplete-casts: GH-786: fix Val::As methods casting incomplete types GH-786: fix Stmt::As methods casting incomplete types GH-786: fix Expr::As methods casting incomplete types
This commit is contained in:
commit
d1814ea1ff
8 changed files with 145 additions and 94 deletions
8
CHANGES
8
CHANGES
|
@ -1,4 +1,12 @@
|
||||||
|
|
||||||
|
3.2.0-dev.834 | 2020-07-02 15:57:09 -0700
|
||||||
|
|
||||||
|
* GH-786: fix Val::As methods casting incomplete types (Jon Siwek, Corelight)
|
||||||
|
|
||||||
|
* GH-786: fix Stmt::As methods casting incomplete types (Jon Siwek, Corelight)
|
||||||
|
|
||||||
|
* GH-786: fix Expr::As methods casting incomplete types (Jon Siwek, Corelight)
|
||||||
|
|
||||||
3.2.0-dev.830 | 2020-07-02 11:36:28 -0700
|
3.2.0-dev.830 | 2020-07-02 11:36:28 -0700
|
||||||
|
|
||||||
* GH-786: Move Type::As methods to cc file so they have type info for casting safely (Tim Wojtulewicz, Corelight)
|
* GH-786: Move Type::As methods to cc file so they have type info for casting safely (Tim Wojtulewicz, Corelight)
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
3.2.0-dev.830
|
3.2.0-dev.834
|
||||||
|
|
48
src/Expr.cc
48
src/Expr.cc
|
@ -62,6 +62,54 @@ Expr::Expr(BroExprTag arg_tag) : tag(arg_tag), type(nullptr), paren(false)
|
||||||
SetLocationInfo(&start_location, &end_location);
|
SetLocationInfo(&start_location, &end_location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ListExpr* Expr::AsListExpr() const
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name)
|
||||||
|
return (const ListExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListExpr* Expr::AsListExpr()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name)
|
||||||
|
return (ListExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NameExpr* Expr::AsNameExpr() const
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name)
|
||||||
|
return (const NameExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NameExpr* Expr::AsNameExpr()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name)
|
||||||
|
return (NameExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AssignExpr* Expr::AsAssignExpr() const
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name)
|
||||||
|
return (const AssignExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssignExpr* Expr::AsAssignExpr()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name)
|
||||||
|
return (AssignExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const IndexExpr* Expr::AsIndexExpr() const
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name)
|
||||||
|
return (const IndexExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexExpr* Expr::AsIndexExpr()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name)
|
||||||
|
return (IndexExpr*) this;
|
||||||
|
}
|
||||||
|
|
||||||
bool Expr::CanAdd() const
|
bool Expr::CanAdd() const
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
52
src/Expr.h
52
src/Expr.h
|
@ -161,53 +161,17 @@ public:
|
||||||
void MarkParen() { paren = true; }
|
void MarkParen() { paren = true; }
|
||||||
bool IsParen() const { return paren; }
|
bool IsParen() const { return paren; }
|
||||||
|
|
||||||
const ListExpr* AsListExpr() const
|
const ListExpr* AsListExpr() const;
|
||||||
{
|
ListExpr* AsListExpr();
|
||||||
CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name)
|
|
||||||
return (const ListExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ListExpr* AsListExpr()
|
const NameExpr* AsNameExpr() const;
|
||||||
{
|
NameExpr* AsNameExpr();
|
||||||
CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name)
|
|
||||||
return (ListExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NameExpr* AsNameExpr() const
|
const AssignExpr* AsAssignExpr() const;
|
||||||
{
|
AssignExpr* AsAssignExpr();
|
||||||
CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name)
|
|
||||||
return (const NameExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
NameExpr* AsNameExpr()
|
const IndexExpr* AsIndexExpr() const;
|
||||||
{
|
IndexExpr* AsIndexExpr();
|
||||||
CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name)
|
|
||||||
return (NameExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AssignExpr* AsAssignExpr() const
|
|
||||||
{
|
|
||||||
CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name)
|
|
||||||
return (const AssignExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
AssignExpr* AsAssignExpr()
|
|
||||||
{
|
|
||||||
CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name)
|
|
||||||
return (AssignExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const IndexExpr* AsIndexExpr() const
|
|
||||||
{
|
|
||||||
CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name)
|
|
||||||
return (const IndexExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
IndexExpr* AsIndexExpr()
|
|
||||||
{
|
|
||||||
CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name)
|
|
||||||
return (IndexExpr*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Describe(ODesc* d) const override final;
|
void Describe(ODesc* d) const override final;
|
||||||
|
|
||||||
|
|
18
src/Stmt.cc
18
src/Stmt.cc
|
@ -51,6 +51,24 @@ Stmt::~Stmt()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StmtList* Stmt::AsStmtList()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name)
|
||||||
|
return (StmtList*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const StmtList* Stmt::AsStmtList() const
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name)
|
||||||
|
return (const StmtList*) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ForStmt* Stmt::AsForStmt()
|
||||||
|
{
|
||||||
|
CHECK_TAG(tag, STMT_FOR, "Stmt::AsForStmt", stmt_name)
|
||||||
|
return (ForStmt*) this;
|
||||||
|
}
|
||||||
|
|
||||||
bool Stmt::SetLocationInfo(const Location* start, const Location* end)
|
bool Stmt::SetLocationInfo(const Location* start, const Location* end)
|
||||||
{
|
{
|
||||||
if ( ! BroObj::SetLocationInfo(start, end) )
|
if ( ! BroObj::SetLocationInfo(start, end) )
|
||||||
|
|
19
src/Stmt.h
19
src/Stmt.h
|
@ -40,23 +40,10 @@ public:
|
||||||
// True if the statement has no side effects, false otherwise.
|
// True if the statement has no side effects, false otherwise.
|
||||||
virtual bool IsPure() const;
|
virtual bool IsPure() const;
|
||||||
|
|
||||||
StmtList* AsStmtList()
|
StmtList* AsStmtList();
|
||||||
{
|
const StmtList* AsStmtList() const;
|
||||||
CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name)
|
|
||||||
return (StmtList*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const StmtList* AsStmtList() const
|
ForStmt* AsForStmt();
|
||||||
{
|
|
||||||
CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name)
|
|
||||||
return (const StmtList*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ForStmt* AsForStmt()
|
|
||||||
{
|
|
||||||
CHECK_TAG(tag, STMT_FOR, "Stmt::AsForStmt", stmt_name)
|
|
||||||
return (ForStmt*) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegisterAccess() const { last_access = network_time; access_count++; }
|
void RegisterAccess() const { last_access = network_time; access_count++; }
|
||||||
void AccessStats(ODesc* d) const;
|
void AccessStats(ODesc* d) const;
|
||||||
|
|
30
src/Val.cc
30
src/Val.cc
|
@ -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()));
|
||||||
|
|
62
src/Val.h
62
src/Val.h
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue