diff --git a/powershell/ql/lib/semmle/code/powershell/ast/internal/MemberExpr.qll b/powershell/ql/lib/semmle/code/powershell/ast/internal/MemberExpr.qll index 0af48cd6485f..547385a52f74 100644 --- a/powershell/ql/lib/semmle/code/powershell/ast/internal/MemberExpr.qll +++ b/powershell/ql/lib/semmle/code/powershell/ast/internal/MemberExpr.qll @@ -29,22 +29,26 @@ class MemberExpr extends Expr, TMemberExpr { /** Gets the name of the member being looked up, if any. */ string getMemberName() { - result = getRawAst(this).(Raw::MemberExpr).getMember().(Raw::StringConstExpr).getValue().getValue() + result = + getRawAst(this).(Raw::MemberExpr).getMember().(Raw::StringConstExpr).getValue().getValue() } predicate isNullConditional() { getRawAst(this).(Raw::MemberExpr).isNullConditional() } predicate isStatic() { getRawAst(this).(Raw::MemberExpr).isStatic() } - final override string toString() { result = this.getMemberName() } + final override string toString() { + result = this.getMemberName() + or + not exists(this.getMemberName()) and + result = "..." + } predicate isExplicitWrite(Ast assignment) { explicitAssignment(getRawAst(this), getRawAst(assignment)) } - predicate isImplicitWrite() { - implicitAssignment(getRawAst(this)) - } + predicate isImplicitWrite() { implicitAssignment(getRawAst(this)) } } /** A `MemberExpr` that is being written to. */ diff --git a/powershell/ql/test/library-tests/ast/Expressions/MemberExpression.ps1 b/powershell/ql/test/library-tests/ast/Expressions/MemberExpression.ps1 new file mode 100644 index 000000000000..01c6623c6201 --- /dev/null +++ b/powershell/ql/test/library-tests/ast/Expressions/MemberExpression.ps1 @@ -0,0 +1,2 @@ +param($x) +[DateTime]::$x \ No newline at end of file diff --git a/powershell/ql/test/library-tests/ast/Expressions/expressions.expected b/powershell/ql/test/library-tests/ast/Expressions/expressions.expected index 7deaa7795dd4..772ab137630a 100644 --- a/powershell/ql/test/library-tests/ast/Expressions/expressions.expected +++ b/powershell/ql/test/library-tests/ast/Expressions/expressions.expected @@ -5,6 +5,7 @@ cmdExpr | BinaryExpression.ps1:4:1:4:7 | [Stmt] result | BinaryExpression.ps1:4:1:4:7 | result | | ExpandableString.ps1:1:1:1:39 | [Stmt] Date: $([DateTime]::Now)\nName: $name | ExpandableString.ps1:1:1:1:39 | Date: $([DateTime]::Now)\nName: $name | | ExpandableString.ps1:1:23:1:37 | [Stmt] Now | ExpandableString.ps1:1:23:1:37 | Now | +| MemberExpression.ps1:2:1:2:14 | [Stmt] ... | MemberExpression.ps1:2:1:2:14 | ... | | SubExpression.ps1:1:1:1:23 | [Stmt] Call to AddDays | SubExpression.ps1:1:1:1:23 | Call to AddDays | | SubExpression.ps1:1:3:1:10 | [Stmt] Call to Get-Date | SubExpression.ps1:1:3:1:10 | Call to Get-Date | | SubExpression.ps1:2:1:2:21 | [Stmt] Call to AddDays | SubExpression.ps1:2:1:2:21 | Call to AddDays | @@ -13,3 +14,6 @@ invokeMemoryExpression | SubExpression.ps1:1:1:1:23 | Call to AddDays | SubExpression.ps1:1:1:1:11 | $(...) | 0 | SubExpression.ps1:1:21:1:22 | 10 | expandableString | ExpandableString.ps1:1:1:1:39 | Date: $([DateTime]::Now)\nName: $name | 1 | ExpandableString.ps1:1:21:1:38 | $(...) | +memberExpr +| ExpandableString.ps1:1:23:1:37 | Now | ExpandableString.ps1:1:23:1:32 | DateTime | +| MemberExpression.ps1:2:1:2:14 | ... | MemberExpression.ps1:2:1:2:10 | DateTime | diff --git a/powershell/ql/test/library-tests/ast/Expressions/expressions.ql b/powershell/ql/test/library-tests/ast/Expressions/expressions.ql index 2583cdef4b81..3cd2e9c91a01 100644 --- a/powershell/ql/test/library-tests/ast/Expressions/expressions.ql +++ b/powershell/ql/test/library-tests/ast/Expressions/expressions.ql @@ -1,19 +1,19 @@ import powershell query predicate binaryExpr(BinaryExpr e, Expr e1, Expr e2) { - e1 = e.getLeft() and - e2 = e.getRight() + e1 = e.getLeft() and + e2 = e.getRight() } -query predicate cmdExpr(ExprStmt exprStmt, Expr e) { - e = exprStmt.getExpr() -} +query predicate cmdExpr(ExprStmt exprStmt, Expr e) { e = exprStmt.getExpr() } query predicate invokeMemoryExpression(InvokeMemberExpr invoke, Expr e, int i, Expr arg) { - e = invoke.getQualifier() and - arg = invoke.getArgument(i) + e = invoke.getQualifier() and + arg = invoke.getArgument(i) } query predicate expandableString(ExpandableStringExpr expandable, int i, Expr e) { - e = expandable.getExpr(i) + e = expandable.getExpr(i) } + +query predicate memberExpr(MemberExpr expr, Expr e) { e = expr.getQualifier() }