From 8f031cda5f7c9f6158530eb439479a6db8f087e1 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Thu, 27 May 2021 10:35:38 +0100 Subject: [PATCH] Add more expressions --- ql/src/codeql_ql/ast/Ast.qll | 25 +++++++++++++++++++++- ql/src/codeql_ql/ast/internal/AstNodes.qll | 17 +++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll index cf5cc90f5db..57a21c940b1 100644 --- a/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -403,6 +403,9 @@ class Disjunction extends TDisjunction, AstNode { Formula getAnOperand() { toGenerated(result) in [disj.getLeft(), disj.getRight()] } } +/** + * A comparison operator, such as `<` or `=`. + */ class ComparisonOp extends TComparisonOp, AstNode { Generated::Compop op; @@ -613,7 +616,7 @@ class FunctionSymbol extends string { FunctionSymbol() { this = "+" or this = "-" or this = "*" or this = "/" or this = "%" } } -/** A binary operation, such as `x+3` or `y/2` */ +/** A binary operation expression, such as `x+3` or `y/2` */ class BinOpExpr extends TBinOpExpr, Expr { } class AddExpr extends TAddExpr, BinOpExpr { @@ -630,6 +633,26 @@ class AddExpr extends TAddExpr, BinOpExpr { FunctionSymbol getOperator() { result = addexpr.getChild().getValue() } } +/** A unary operation expression, such as `-(x*y)` */ +class UnaryExpr extends TUnaryExpr, Expr { + Generated::UnaryExpr unaryexpr; + + UnaryExpr() { this = TUnaryExpr(unaryexpr) } + + Expr getOperand() { toGenerated(result) = unaryexpr.getChild(1) } + + FunctionSymbol getOperator() { result = unaryexpr.getChild(0).toString() } +} + +/** A "don't care" expression, denoted by `_`. */ +class DontCare extends TDontCare, Expr { + Generated::Underscore dontcare; + + DontCare() { this = TDontCare(dontcare) } + + override string getAPrimaryQlClass() { result = "DontCare" } +} + /** A module expression. */ class ModuleExpr extends TModuleExpr, AstNode { Generated::ModuleExpr me; diff --git a/ql/src/codeql_ql/ast/internal/AstNodes.qll b/ql/src/codeql_ql/ast/internal/AstNodes.qll index fface5bbd4c..7597bdfafa6 100644 --- a/ql/src/codeql_ql/ast/internal/AstNodes.qll +++ b/ql/src/codeql_ql/ast/internal/AstNodes.qll @@ -27,13 +27,15 @@ newtype TAstNode = TNegation(Generated::Negation neg) or TAddExpr(Generated::AddExpr addexp) or TLiteral(Generated::Literal lit) or + TUnaryExpr(Generated::UnaryExpr unaryexpr) or + TDontCare(Generated::Underscore dontcare) or TModuleExpr(Generated::ModuleExpr me) class TFormula = TDisjunction or TConjunction or TComparisonFormula or TQuantifier or TNegation; class TBinOpExpr = TAddExpr; -class TExpr = TBinOpExpr or TLiteral or TAggregate or TIdentifier; +class TExpr = TBinOpExpr or TLiteral or TAggregate or TIdentifier or TUnaryExpr or TDontCare; Generated::AstNode toGeneratedFormula(AST::AstNode n) { n = TConjunction(result) or @@ -41,12 +43,17 @@ Generated::AstNode toGeneratedFormula(AST::AstNode n) { n = TComparisonFormula(result) or n = TComparisonOp(result) or n = TQuantifier(result) or - n = TAggregate(result) or - n = TIdentifier(result) or n = TNegation(result) } -Generated::AstNode toGeneratedExpr(AST::AstNode n) { n = TAddExpr(result) } +Generated::AstNode toGeneratedExpr(AST::AstNode n) { + n = TAddExpr(result) or + n = TLiteral(result) or + n = TAggregate(result) or + n = TIdentifier(result) or + n = TUnaryExpr(result) or + n = TDontCare(result) +} /** * Gets the underlying TreeSitter entity for a given AST node. @@ -78,8 +85,6 @@ Generated::AstNode toGenerated(AST::AstNode n) { or n = TType(result) or - n = TLiteral(result) - or n = TAsExpr(result) or n = TModuleExpr(result)