Skip to content

Commit 0640c0d

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

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
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: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,21 @@ class OverloadedArrayExpr extends FunctionCall {
389389
* Gets the expression giving the index.
390390
*/
391391
Expr getArrayOffset() {
392-
if exists(this.getQualifier()) then result = this.getChild(0) else result = this.getChild(1)
392+
result = this.getArrayOffset(0)
393393
}
394+
395+
/**
396+
* Gets the expression giving the nth index.
397+
*/
398+
Expr getArrayOffset(int n) {
399+
n >= 0 and
400+
if exists(this.getQualifier()) then result = this.getChild(n) else result = this.getChild(n + 1)
401+
}
402+
403+
/**
404+
* Gets an expression giving an index.
405+
*/
406+
Expr getAnArrayOffset() { result = this.getArrayOffset(_) }
394407
}
395408

396409
/**

0 commit comments

Comments
 (0)