Skip to content

Commit 3907ef9

Browse files
author
Robert Marsh
committed
C++: value number string constants
1 parent 09d0548 commit 3907ef9

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ newtype TValueNumber =
3131
TConstantValueNumber(IRFunction irFunc, Type type, string value) {
3232
constantValueNumber(_, irFunc, type, value)
3333
} or
34+
TStringConstantValueNumber(IRFunction irFunc, Type type, string value) {
35+
stringConstantValueNumber(_, irFunc, type, value)
36+
} or
3437
TFieldAddressValueNumber(IRFunction irFunc, Field field, ValueNumber objectAddress) {
3538
fieldAddressValueNumber(_, irFunc, field, objectAddress)
3639
} or
@@ -127,6 +130,7 @@ private predicate numberableInstruction(Instruction instr) {
127130
instr instanceof InitializeParameterInstruction or
128131
instr instanceof InitializeThisInstruction or
129132
instr instanceof ConstantInstruction or
133+
instr instanceof StringConstantInstruction or
130134
instr instanceof FieldAddressInstruction or
131135
instr instanceof BinaryInstruction or
132136
instr instanceof UnaryInstruction or
@@ -157,6 +161,13 @@ private predicate constantValueNumber(ConstantInstruction instr, IRFunction irFu
157161
instr.getValue() = value
158162
}
159163

164+
private predicate stringConstantValueNumber(StringConstantInstruction instr, IRFunction irFunc, Type type,
165+
string value) {
166+
instr.getEnclosingIRFunction() = irFunc and
167+
instr.getResultType() = type and
168+
instr.getValue().getValue() = value
169+
}
170+
160171
private predicate fieldAddressValueNumber(FieldAddressInstruction instr, IRFunction irFunc,
161172
Field field, ValueNumber objectAddress) {
162173
instr.getEnclosingIRFunction() = irFunc and
@@ -255,6 +266,10 @@ private ValueNumber nonUniqueValueNumber(Instruction instr) {
255266
constantValueNumber(instr, irFunc, type, value) and
256267
result = TConstantValueNumber(irFunc, type, value)
257268
) or
269+
exists(Type type, string value |
270+
stringConstantValueNumber(instr, irFunc, type, value) and
271+
result = TStringConstantValueNumber(irFunc, type, value)
272+
) or
258273
exists(Field field, ValueNumber objectAddress |
259274
fieldAddressValueNumber(instr, irFunc, field, objectAddress) and
260275
result = TFieldAddressValueNumber(irFunc, field, objectAddress)

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ newtype TValueNumber =
3131
TConstantValueNumber(IRFunction irFunc, Type type, string value) {
3232
constantValueNumber(_, irFunc, type, value)
3333
} or
34+
TStringConstantValueNumber(IRFunction irFunc, Type type, string value) {
35+
stringConstantValueNumber(_, irFunc, type, value)
36+
} or
3437
TFieldAddressValueNumber(IRFunction irFunc, Field field, ValueNumber objectAddress) {
3538
fieldAddressValueNumber(_, irFunc, field, objectAddress)
3639
} or
@@ -127,6 +130,7 @@ private predicate numberableInstruction(Instruction instr) {
127130
instr instanceof InitializeParameterInstruction or
128131
instr instanceof InitializeThisInstruction or
129132
instr instanceof ConstantInstruction or
133+
instr instanceof StringConstantInstruction or
130134
instr instanceof FieldAddressInstruction or
131135
instr instanceof BinaryInstruction or
132136
instr instanceof UnaryInstruction or
@@ -157,6 +161,13 @@ private predicate constantValueNumber(ConstantInstruction instr, IRFunction irFu
157161
instr.getValue() = value
158162
}
159163

164+
private predicate stringConstantValueNumber(StringConstantInstruction instr, IRFunction irFunc, Type type,
165+
string value) {
166+
instr.getEnclosingIRFunction() = irFunc and
167+
instr.getResultType() = type and
168+
instr.getValue().getValue() = value
169+
}
170+
160171
private predicate fieldAddressValueNumber(FieldAddressInstruction instr, IRFunction irFunc,
161172
Field field, ValueNumber objectAddress) {
162173
instr.getEnclosingIRFunction() = irFunc and
@@ -255,6 +266,10 @@ private ValueNumber nonUniqueValueNumber(Instruction instr) {
255266
constantValueNumber(instr, irFunc, type, value) and
256267
result = TConstantValueNumber(irFunc, type, value)
257268
) or
269+
exists(Type type, string value |
270+
stringConstantValueNumber(instr, irFunc, type, value) and
271+
result = TStringConstantValueNumber(irFunc, type, value)
272+
) or
258273
exists(Field field, ValueNumber objectAddress |
259274
fieldAddressValueNumber(instr, irFunc, field, objectAddress) and
260275
result = TFieldAddressValueNumber(irFunc, field, objectAddress)

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ newtype TValueNumber =
3131
TConstantValueNumber(IRFunction irFunc, Type type, string value) {
3232
constantValueNumber(_, irFunc, type, value)
3333
} or
34+
TStringConstantValueNumber(IRFunction irFunc, Type type, string value) {
35+
stringConstantValueNumber(_, irFunc, type, value)
36+
} or
3437
TFieldAddressValueNumber(IRFunction irFunc, Field field, ValueNumber objectAddress) {
3538
fieldAddressValueNumber(_, irFunc, field, objectAddress)
3639
} or
@@ -127,6 +130,7 @@ private predicate numberableInstruction(Instruction instr) {
127130
instr instanceof InitializeParameterInstruction or
128131
instr instanceof InitializeThisInstruction or
129132
instr instanceof ConstantInstruction or
133+
instr instanceof StringConstantInstruction or
130134
instr instanceof FieldAddressInstruction or
131135
instr instanceof BinaryInstruction or
132136
instr instanceof UnaryInstruction or
@@ -157,6 +161,13 @@ private predicate constantValueNumber(ConstantInstruction instr, IRFunction irFu
157161
instr.getValue() = value
158162
}
159163

164+
private predicate stringConstantValueNumber(StringConstantInstruction instr, IRFunction irFunc, Type type,
165+
string value) {
166+
instr.getEnclosingIRFunction() = irFunc and
167+
instr.getResultType() = type and
168+
instr.getValue().getValue() = value
169+
}
170+
160171
private predicate fieldAddressValueNumber(FieldAddressInstruction instr, IRFunction irFunc,
161172
Field field, ValueNumber objectAddress) {
162173
instr.getEnclosingIRFunction() = irFunc and
@@ -255,6 +266,10 @@ private ValueNumber nonUniqueValueNumber(Instruction instr) {
255266
constantValueNumber(instr, irFunc, type, value) and
256267
result = TConstantValueNumber(irFunc, type, value)
257268
) or
269+
exists(Type type, string value |
270+
stringConstantValueNumber(instr, irFunc, type, value) and
271+
result = TStringConstantValueNumber(irFunc, type, value)
272+
) or
258273
exists(Field field, ValueNumber objectAddress |
259274
fieldAddressValueNumber(instr, irFunc, field, objectAddress) and
260275
result = TFieldAddressValueNumber(irFunc, field, objectAddress)

0 commit comments

Comments
 (0)