Skip to content

Commit 3907fc7

Browse files
committed
C++: Add predicates to support multidimensional subscript operators
1 parent 647d11a commit 3907fc7

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

cpp/ql/lib/semmle/code/cpp/PrintAST.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,10 +1050,10 @@ private predicate namedExprChildPredicates(Expr expr, Element ele, string pred)
10501050
expr.(Call).getQualifier() = ele and
10511051
pred = "getQualifier()"
10521052
or
1053-
// OverloadedArrayExpr::getArrayBase/0 and OverloadedArrayExpr::getArrayOffset/0 also consider arguments, and are already handled below.
1053+
// OverloadedArrayExpr::getArrayBase/0 and OverloadedArrayExpr::getArrayOffset/1 also consider arguments, and are already handled below.
10541054
exists(int n, Expr arg | expr.(Call).getArgument(n) = arg |
10551055
not expr.(OverloadedArrayExpr).getArrayBase() = arg and
1056-
not expr.(OverloadedArrayExpr).getArrayOffset() = arg and
1056+
not expr.(OverloadedArrayExpr).getAnArrayOffset() = arg and
10571057
arg = ele and
10581058
pred = "getArgument(" + n.toString() + ")"
10591059
)
@@ -1062,7 +1062,10 @@ private predicate namedExprChildPredicates(Expr expr, Element ele, string pred)
10621062
or
10631063
expr.(OverloadedArrayExpr).getArrayBase() = ele and pred = "getArrayBase()"
10641064
or
1065-
expr.(OverloadedArrayExpr).getArrayOffset() = ele and pred = "getArrayOffset()"
1065+
exists(int n |
1066+
expr.(OverloadedArrayExpr).getArrayOffset(n) = ele and
1067+
pred = "getArrayOffset(" + n.toString() + ")"
1068+
)
10661069
or
10671070
// OverloadedPointerDereferenceExpr::getExpr/0 also considers qualifiers, and is already handled above for all Call classes.
10681071
not expr.(OverloadedPointerDereferenceExpr).getQualifier() =

cpp/ql/lib/semmle/code/cpp/exprs/Call.qll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,20 @@ class OverloadedArrayExpr extends FunctionCall {
388388
/**
389389
* Gets the expression giving the index.
390390
*/
391-
Expr getArrayOffset() {
392-
if exists(this.getQualifier()) then result = this.getChild(0) else result = this.getChild(1)
391+
Expr getArrayOffset() { result = this.getArrayOffset(0) }
392+
393+
/**
394+
* Gets the expression giving the nth index.
395+
*/
396+
Expr getArrayOffset(int n) {
397+
n >= 0 and
398+
if exists(this.getQualifier()) then result = this.getChild(n) else result = this.getChild(n + 1)
393399
}
400+
401+
/**
402+
* Gets an expression giving an index.
403+
*/
404+
Expr getAnArrayOffset() { result = this.getArrayOffset(_) }
394405
}
395406

396407
/**

0 commit comments

Comments
 (0)