Skip to content

Commit 8569c9d

Browse files
committed
C++: Minor refactor
* Introduce new instruction tag for the base size * Introduce some convenience predicates on `VlaDeclStmt`
1 parent c54128e commit 8569c9d

File tree

3 files changed

+78
-55
lines changed

3 files changed

+78
-55
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,9 @@ newtype TInstructionTag =
9898
} or
9999
CoAwaitBranchTag() or
100100
BoolToIntConversionTag() or
101+
SizeofVlaBaseSizeTag() or
101102
SizeofVlaDimensionTag(int index) {
102-
index = -1
103-
or
104-
exists(VlaDeclStmt v | exists(v.getVlaDimensionStmt(index)))
103+
exists(VlaDeclStmt v | exists(v.getTransitiveVlaDimensionStmt(index)))
105104
}
106105

107106
class InstructionTag extends TInstructionTag {

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

Lines changed: 22 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4103,38 +4103,6 @@ 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-
41384106
class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41394107
override SizeofExprOperator expr;
41404108
VlaDeclStmt vlaDeclStmt;
@@ -4143,12 +4111,12 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41434111

41444112
TranslatedSizeofExpr() {
41454113
vlaDeclStmt = getVlaDeclStmt(expr.getExprOperand(), pointerDerefCount) and
4146-
vlaDimensions = getNumberOfVlaDimensions(vlaDeclStmt) and
4114+
vlaDimensions = vlaDeclStmt.getTransitiveNumberOfVlaDimensionStmts() and
41474115
pointerDerefCount < vlaDimensions
41484116
}
41494117

41504118
final override Instruction getFirstInstruction(EdgeKind kind) {
4151-
result = this.getInstruction(SizeofVlaDimensionTag(-1)) and
4119+
result = this.getInstruction(SizeofVlaBaseSizeTag()) and
41524120
kind instanceof GotoEdge
41534121
}
41544122

@@ -4160,7 +4128,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41604128

41614129
final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
41624130
opcode instanceof Opcode::Constant and
4163-
tag = SizeofVlaDimensionTag(-1) and
4131+
tag = SizeofVlaBaseSizeTag() and
41644132
resultType = this.getResultType()
41654133
or
41664134
opcode instanceof Opcode::Mul and
@@ -4169,7 +4137,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41694137
}
41704138

41714139
final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) {
4172-
tag = SizeofVlaDimensionTag(-1) and
4140+
tag = SizeofVlaBaseSizeTag() and
41734141
result = this.getInstruction(SizeofVlaDimensionTag(pointerDerefCount)) and
41744142
kind instanceof GotoEdge
41754143
or
@@ -4184,19 +4152,27 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41844152
}
41854153

41864154
override string getInstructionConstantValue(InstructionTag tag) {
4187-
tag = SizeofVlaDimensionTag(-1) and
4188-
result = this.getVlaBaseType(vlaDeclStmt).getSize().toString()
4155+
tag = SizeofVlaBaseSizeTag() and
4156+
result = this.getBaseType(vlaDeclStmt).getSize().toString()
41894157
}
41904158

4191-
private Type getVlaBaseType(VlaDeclStmt v) {
4192-
not exists(getParentVlaDecl(v)) and
4159+
private Type getBaseType(VlaDeclStmt v) {
4160+
not exists(v.getParentVlaDecl()) and
41934161
(
4194-
result = getBaseType(v.getVariable().getUnderlyingType(), v.getNumberOfVlaDimensionStmts())
4162+
result =
4163+
this.getBaseType(v.getVariable().getUnderlyingType(), v.getNumberOfVlaDimensionStmts())
41954164
or
4196-
result = getBaseType(v.getType().getUnderlyingType(), v.getNumberOfVlaDimensionStmts())
4165+
result = this.getBaseType(v.getType().getUnderlyingType(), v.getNumberOfVlaDimensionStmts())
41974166
)
41984167
or
4199-
result = this.getVlaBaseType(getParentVlaDecl(v))
4168+
result = this.getBaseType(v.getParentVlaDecl())
4169+
}
4170+
4171+
private Type getBaseType(Type type, int n) {
4172+
n = 0 and
4173+
result = type
4174+
or
4175+
result = this.getBaseType(type.(DerivedType).getBaseType(), n - 1)
42004176
}
42014177

42024178
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
@@ -4209,23 +4185,17 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
42094185
result = this.getInstruction(SizeofVlaDimensionTag(n - 1))
42104186
or
42114187
n - 1 < pointerDerefCount and
4212-
result = this.getInstruction(SizeofVlaDimensionTag(-1))
4188+
result = this.getInstruction(SizeofVlaBaseSizeTag())
42134189
)
42144190
or
42154191
operandTag instanceof RightOperandTag and
42164192
result =
4217-
getTranslatedExpr(this.getVlaDimension(vlaDeclStmt, n).getDimensionExpr()).getResult()
4193+
getTranslatedExpr(vlaDeclStmt.getTransitiveVlaDimensionStmt(n).getDimensionExpr())
4194+
.getResult()
42184195
)
42194196
)
42204197
}
42214198

4222-
private VlaDimensionStmt getVlaDimension(VlaDeclStmt v, int n) {
4223-
n < v.getNumberOfVlaDimensionStmts() and
4224-
result = v.getVlaDimensionStmt(n)
4225-
or
4226-
result = this.getVlaDimension(getParentVlaDecl(v), n - v.getNumberOfVlaDimensionStmts())
4227-
}
4228-
42294199
final override Instruction getResult() {
42304200
result = this.getInstruction(SizeofVlaDimensionTag(vlaDimensions - 1))
42314201
}

cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,6 +2355,20 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl {
23552355
)
23562356
}
23572357

2358+
/**
2359+
* Gets the number of VLA dimension statements in this VLA declaration
2360+
* statement and transitively of the VLA declaration used to define its
2361+
* base type. if any.
2362+
*/
2363+
int getTransitiveNumberOfVlaDimensionStmts() {
2364+
not exists(this.getParentVlaDecl()) and
2365+
result = this.getNumberOfVlaDimensionStmts()
2366+
or
2367+
result =
2368+
this.getNumberOfVlaDimensionStmts() +
2369+
this.getParentVlaDecl().getTransitiveNumberOfVlaDimensionStmts()
2370+
}
2371+
23582372
/**
23592373
* Gets the `i`th VLA dimension statement in this VLA
23602374
* declaration statement.
@@ -2367,6 +2381,19 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl {
23672381
)
23682382
}
23692383

2384+
/**
2385+
* Gets the `i`th VLA dimension statement in this VLA declaration
2386+
* statement or transitively of the VLA declaration used to define
2387+
* its base type.
2388+
*/
2389+
VlaDimensionStmt getTransitiveVlaDimensionStmt(int i) {
2390+
i < this.getNumberOfVlaDimensionStmts() and
2391+
result = this.getVlaDimensionStmt(i)
2392+
or
2393+
result =
2394+
this.getParentVlaDecl().getTransitiveVlaDimensionStmt(i - this.getNumberOfVlaDimensionStmts())
2395+
}
2396+
23702397
/**
23712398
* Gets the type that this VLA declaration statement relates to,
23722399
* if any.
@@ -2378,4 +2405,31 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl {
23782405
* if any.
23792406
*/
23802407
Variable getVariable() { variable_vla(unresolveElement(result), underlyingElement(this)) }
2408+
2409+
/**
2410+
* Get the VLA declaration used to define the base type of
2411+
* this VLA declaration, if any.
2412+
*/
2413+
VlaDeclStmt getParentVlaDecl() {
2414+
exists(Variable v, Type baseType |
2415+
v = this.getVariable() and
2416+
baseType = this.getBaseType(v.getType(), this.getNumberOfVlaDimensionStmts())
2417+
|
2418+
result.getType() = baseType
2419+
)
2420+
or
2421+
exists(Type t, Type baseType |
2422+
t = this.getType().(TypedefType).getBaseType() and
2423+
baseType = this.getBaseType(t, this.getNumberOfVlaDimensionStmts())
2424+
|
2425+
result.getType() = baseType
2426+
)
2427+
}
2428+
2429+
private Type getBaseType(Type type, int n) {
2430+
n = 0 and
2431+
result = type
2432+
or
2433+
result = this.getBaseType(type.(DerivedType).getBaseType(), n - 1)
2434+
}
23812435
}

0 commit comments

Comments
 (0)