diff --git a/powershell/ql/lib/semmle/code/powershell/InvokeMemberExpression.qll b/powershell/ql/lib/semmle/code/powershell/InvokeMemberExpression.qll index c337a4f08fa..12017cd7de5 100644 --- a/powershell/ql/lib/semmle/code/powershell/InvokeMemberExpression.qll +++ b/powershell/ql/lib/semmle/code/powershell/InvokeMemberExpression.qll @@ -5,11 +5,15 @@ class InvokeMemberExpr extends @invoke_member_expression, MemberExprBase { Expr getQualifier() { invoke_member_expression(this, result, _) } + string getName() { result = this.getMember().(StringConstExpr).getValue().getValue() } + CmdElement getMember() { invoke_member_expression(this, _, result) } Expr getArgument(int i) { invoke_member_expression_argument(this, i, result) } Expr getAnArgument() { invoke_member_expression_argument(this, _, result) } - override string toString() { result = "call to " + this.getMember() } + override string toString() { result = "call to " + this.getName() } + + override predicate isStatic() { this.getQualifier() instanceof TypeNameExpr } } diff --git a/powershell/ql/lib/semmle/code/powershell/MemberExpr.qll b/powershell/ql/lib/semmle/code/powershell/MemberExpr.qll index 74cf36b2c53..5af9eef345c 100644 --- a/powershell/ql/lib/semmle/code/powershell/MemberExpr.qll +++ b/powershell/ql/lib/semmle/code/powershell/MemberExpr.qll @@ -12,7 +12,7 @@ class MemberExpr extends @member_expression, MemberExprBase { predicate isNullConditional() { member_expression(this, _, _, true, _) } - predicate isStatic() { member_expression(this, _, _, _, true) } + override predicate isStatic() { member_expression(this, _, _, _, true) } final override string toString() { result = this.getMember().toString() } } diff --git a/powershell/ql/lib/semmle/code/powershell/MemberExpressionBase.qll b/powershell/ql/lib/semmle/code/powershell/MemberExpressionBase.qll index 774cbd9b88a..81db24f0019 100644 --- a/powershell/ql/lib/semmle/code/powershell/MemberExpressionBase.qll +++ b/powershell/ql/lib/semmle/code/powershell/MemberExpressionBase.qll @@ -1,3 +1,5 @@ import powershell -class MemberExprBase extends @member_expression_base, Expr { } +class MemberExprBase extends @member_expression_base, Expr { + predicate isStatic() { none() } +} diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll index 29eaf301998..4ab9bd18661 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll @@ -128,6 +128,8 @@ abstract private class NonExprChildMapping extends ChildMapping { abstract private class AbstractCallCfgNode extends AstCfgNode { override string getAPrimaryQlClass() { result = "CfgCall" } + abstract string getName(); + ExprCfgNode getQualifier() { none() } abstract ExprCfgNode getArgument(int i); @@ -137,6 +139,8 @@ abstract private class AbstractCallCfgNode extends AstCfgNode { abstract ExprCfgNode getNamedArgument(string name); abstract ExprCfgNode getAnArgument(); + + abstract ExprCfgNode getCommand(); } final class CallCfgNode = AbstractCallCfgNode; @@ -221,6 +225,10 @@ module ExprNodes { final override ExprCfgNode getNamedArgument(string name) { none() } final override ExprCfgNode getAnArgument() { e.hasCfgChild(e.getAnArgument(), this, result) } + + final override string getName() { none() } + + final override ExprCfgNode getCommand() { none() } } /** A control-flow node that wraps a qualifier expression. */ @@ -308,7 +316,9 @@ module StmtNodes { override ExprCfgNode getAnArgument() { s.hasCfgChild(s.getAnArgument(), this, result) } - ExprCfgNode getCommand() { s.hasCfgChild(s.getCommand(), this, result) } + final override ExprCfgNode getCommand() { s.hasCfgChild(s.getCommand(), this, result) } + + final override string getName() { result = s.getCmdName().getValue().getValue() } } private class AssignStmtChildMapping extends NonExprChildMapping, AssignStmt {