Skip to content

Commit 6e8f44d

Browse files
committed
C++: Handle sizeof VLAs with typedefs
1 parent 74f5687 commit 6e8f44d

File tree

1 file changed

+50
-22
lines changed

1 file changed

+50
-22
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4103,14 +4103,48 @@ private VlaDeclStmt getVlaDeclStmt(Expr expr, int pointerDerefCount) {
41034103
result = getVlaDeclStmt(expr.(ArrayExpr).getArrayBase(), pointerDerefCount - 1)
41044104
}
41054105

4106+
private int getNumberOfVlaDimensions(VlaDeclStmt vlaDeclStmt) {
4107+
not exists(getParentVlaDecl(vlaDeclStmt)) and
4108+
result = vlaDeclStmt.getNumberOfVlaDimensionStmts()
4109+
or
4110+
result =
4111+
vlaDeclStmt.getNumberOfVlaDimensionStmts() +
4112+
getNumberOfVlaDimensions(getParentVlaDecl(vlaDeclStmt))
4113+
}
4114+
4115+
private VlaDeclStmt getParentVlaDecl(VlaDeclStmt vlaDeclStmt) {
4116+
exists(Variable v, Type baseType |
4117+
v = vlaDeclStmt.getVariable() and
4118+
baseType = getBaseType(v.getType(), vlaDeclStmt.getNumberOfVlaDimensionStmts())
4119+
|
4120+
result.getType() = baseType
4121+
)
4122+
or
4123+
exists(Type t, Type baseType |
4124+
t = vlaDeclStmt.getType().(TypedefType).getBaseType() and
4125+
baseType = getBaseType(t, vlaDeclStmt.getNumberOfVlaDimensionStmts())
4126+
|
4127+
result.getType() = baseType
4128+
)
4129+
}
4130+
4131+
private Type getBaseType(Type type, int n) {
4132+
n = 0 and
4133+
result = type
4134+
or
4135+
result = getBaseType(type.(DerivedType).getBaseType(), n - 1)
4136+
}
4137+
41064138
class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41074139
override SizeofExprOperator expr;
41084140
VlaDeclStmt vlaDeclStmt;
4141+
int vlaDimensions;
41094142
int pointerDerefCount;
41104143

41114144
TranslatedSizeofExpr() {
41124145
vlaDeclStmt = getVlaDeclStmt(expr.getExprOperand(), pointerDerefCount) and
4113-
pointerDerefCount < vlaDeclStmt.getNumberOfVlaDimensionStmts()
4146+
vlaDimensions = getNumberOfVlaDimensions(vlaDeclStmt) and
4147+
pointerDerefCount < vlaDimensions
41144148
}
41154149

41164150
final override Instruction getFirstInstruction(EdgeKind kind) {
@@ -4119,8 +4153,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41194153
}
41204154

41214155
override Instruction getALastInstructionInternal() {
4122-
result =
4123-
this.getInstruction(SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1))
4156+
result = this.getInstruction(SizeofVlaDimensionTag(vlaDimensions - 1))
41244157
}
41254158

41264159
final override TranslatedElement getChildInternal(int id) { none() }
@@ -4131,9 +4164,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41314164
resultType = this.getResultType()
41324165
or
41334166
opcode instanceof Opcode::Mul and
4134-
exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() |
4135-
tag = SizeofVlaDimensionTag(n)
4136-
) and
4167+
exists(int n | pointerDerefCount <= n and n < vlaDimensions | tag = SizeofVlaDimensionTag(n)) and
41374168
resultType = this.getResultType()
41384169
}
41394170

@@ -4142,33 +4173,24 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41424173
result = this.getInstruction(SizeofVlaDimensionTag(pointerDerefCount)) and
41434174
kind instanceof GotoEdge
41444175
or
4145-
exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1 |
4176+
exists(int n | pointerDerefCount <= n and n < vlaDimensions - 1 |
41464177
tag = SizeofVlaDimensionTag(n) and
41474178
result = this.getInstruction(SizeofVlaDimensionTag(n + 1))
41484179
) and
41494180
kind instanceof GotoEdge
41504181
or
4151-
tag = SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1) and
4182+
tag = SizeofVlaDimensionTag(vlaDimensions - 1) and
41524183
result = this.getParent().getChildSuccessor(this, kind)
41534184
}
41544185

41554186
override string getInstructionConstantValue(InstructionTag tag) {
41564187
tag = SizeofVlaDimensionTag(-1) and
41574188
result =
4158-
this.getBaseSize(vlaDeclStmt.getVariable().getType(),
4159-
vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1).toString()
4160-
}
4161-
4162-
private int getBaseSize(DerivedType type, int n) {
4163-
n = 0 and
4164-
result = type.getBaseType().getSize()
4165-
or
4166-
n = [1 .. vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1] and
4167-
result = this.getBaseSize(type.getBaseType(), n - 1)
4189+
getBaseType(vlaDeclStmt.getVariable().getUnderlyingType(), vlaDimensions).getSize().toString()
41684190
}
41694191

41704192
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
4171-
exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() |
4193+
exists(int n | pointerDerefCount <= n and n < vlaDimensions |
41724194
tag = SizeofVlaDimensionTag(n) and
41734195
(
41744196
operandTag instanceof LeftOperandTag and
@@ -4182,14 +4204,20 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41824204
or
41834205
operandTag instanceof RightOperandTag and
41844206
result =
4185-
getTranslatedExpr(vlaDeclStmt.getVlaDimensionStmt(n).getDimensionExpr()).getResult()
4207+
getTranslatedExpr(this.getVlaDimension(vlaDeclStmt, n).getDimensionExpr()).getResult()
41864208
)
41874209
)
41884210
}
41894211

4212+
private VlaDimensionStmt getVlaDimension(VlaDeclStmt v, int n) {
4213+
n < v.getNumberOfVlaDimensionStmts() and
4214+
result = v.getVlaDimensionStmt(n)
4215+
or
4216+
result = this.getVlaDimension(getParentVlaDecl(v), n - v.getNumberOfVlaDimensionStmts())
4217+
}
4218+
41904219
final override Instruction getResult() {
4191-
result =
4192-
this.getInstruction(SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1))
4220+
result = this.getInstruction(SizeofVlaDimensionTag(vlaDimensions - 1))
41934221
}
41944222
}
41954223

0 commit comments

Comments
 (0)