Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7eb47f3

Browse files
C++: A few more IR dataflow tweaks
Made `Node::getType()`, `Node::asParameter()`, and `Node::asUninitialized()` operate directly on the IR. This actually fixed several diffs compared to the AST dataflow, because `getType()` wasn't holding for nodes that weren't `Exprs`. Made `Uninitialized` a `VariableInstruction`. This makes it consistent with `InitializeParameter`.
1 parent 309b703 commit 7eb47f3

9 files changed

Lines changed: 183 additions & 163 deletions

File tree

cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,21 @@ class Node extends Instruction {
2121

2222
/** Gets the type of this node. */
2323
Type getType() {
24-
result = this.asExpr().getType()
25-
or
26-
result = this.getAST().(Variable).getType()
24+
result = this.getResultType()
2725
}
2826

2927
/** Gets the expression corresponding to this node, if any. */
3028
Expr asExpr() { result = this.getUnconvertedResultExpression() }
3129

3230
/** Gets the parameter corresponding to this node, if any. */
33-
Parameter asParameter() { result = this.(ParameterNode).getParameter() }
31+
Parameter asParameter() { result = this.(InitializeParameterInstruction).getParameter() }
3432

3533
/**
3634
* Gets the uninitialized local variable corresponding to this node, if
3735
* any.
3836
*/
3937
LocalVariable asUninitialized() {
40-
result = this.(UninitializedNode).getLocalVariable()
38+
result = this.(UninitializedInstruction).getLocalVariable()
4139
}
4240

4341
/**
@@ -73,8 +71,6 @@ class ParameterNode extends Node, InitializeParameterInstruction {
7371
* flow graph.
7472
*/
7573
class UninitializedNode extends Node, UninitializedInstruction {
76-
/** Gets the uninitialized local variable corresponding to this node. */
77-
LocalVariable getLocalVariable() { result = this.getAST().(VariableDeclarationEntry).getDeclaration()}
7874
}
7975

8076
/**

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,21 @@ class FieldAddressInstruction extends FieldInstruction {
595595
}
596596
}
597597

598-
class UninitializedInstruction extends Instruction {
598+
class UninitializedInstruction extends VariableInstruction {
599599
UninitializedInstruction() {
600600
opcode instanceof Opcode::Uninitialized
601601
}
602602

603603
override final MemoryAccessKind getResultMemoryAccess() {
604604
result instanceof IndirectMemoryAccess
605605
}
606+
607+
/**
608+
* Gets the `LocalVariable` that is uninitialized.
609+
*/
610+
final LocalVariable getLocalVariable() {
611+
result = var.(IRUserVariable).getVariable()
612+
}
606613
}
607614

608615
class NoOpInstruction extends Instruction {

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,21 @@ class FieldAddressInstruction extends FieldInstruction {
595595
}
596596
}
597597

598-
class UninitializedInstruction extends Instruction {
598+
class UninitializedInstruction extends VariableInstruction {
599599
UninitializedInstruction() {
600600
opcode instanceof Opcode::Uninitialized
601601
}
602602

603603
override final MemoryAccessKind getResultMemoryAccess() {
604604
result instanceof IndirectMemoryAccess
605605
}
606+
607+
/**
608+
* Gets the `LocalVariable` that is uninitialized.
609+
*/
610+
final LocalVariable getLocalVariable() {
611+
result = var.(IRUserVariable).getVariable()
612+
}
606613
}
607614

608615
class NoOpInstruction extends Instruction {

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ abstract class TranslatedVariableDeclaration extends TranslatedElement, Initiali
142142
}
143143

144144
override IRVariable getInstructionVariable(InstructionTag tag) {
145-
tag = InitializerVariableAddressTag() and
145+
(
146+
tag = InitializerVariableAddressTag() or
147+
hasUninitializedInstruction() and tag = InitializerStoreTag()
148+
) and
146149
result = getIRUserVariable(getFunction(), getVariable())
147150
}
148151

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,21 @@ class FieldAddressInstruction extends FieldInstruction {
595595
}
596596
}
597597

598-
class UninitializedInstruction extends Instruction {
598+
class UninitializedInstruction extends VariableInstruction {
599599
UninitializedInstruction() {
600600
opcode instanceof Opcode::Uninitialized
601601
}
602602

603603
override final MemoryAccessKind getResultMemoryAccess() {
604604
result instanceof IndirectMemoryAccess
605605
}
606+
607+
/**
608+
* Gets the `LocalVariable` that is uninitialized.
609+
*/
610+
final LocalVariable getLocalVariable() {
611+
result = var.(IRUserVariable).getVariable()
612+
}
606613
}
607614

608615
class NoOpInstruction extends Instruction {

cpp/ql/test/library-tests/ir/ir/aliased_ssa_ir.expected

Lines changed: 46 additions & 46 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 46 additions & 46 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/ir/ir/unaliased_ssa_ir.expected

Lines changed: 46 additions & 46 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ test.cpp:
1616
# 1| valnum = m0_6
1717
# 2| r0_7(glval<int>) = VariableAddress[x] :
1818
# 2| valnum = r0_7
19-
# 2| m0_8(int) = Uninitialized : r0_7
19+
# 2| m0_8(int) = Uninitialized[x] : r0_7
2020
# 2| valnum = unique
2121
# 2| r0_9(glval<int>) = VariableAddress[y] :
2222
# 2| valnum = r0_9
23-
# 2| m0_10(int) = Uninitialized : r0_9
23+
# 2| m0_10(int) = Uninitialized[y] : r0_9
2424
# 2| valnum = unique
2525
# 3| r0_11(glval<unsigned char>) = VariableAddress[b] :
2626
# 3| valnum = unique
27-
# 3| m0_12(unsigned char) = Uninitialized : r0_11
27+
# 3| m0_12(unsigned char) = Uninitialized[b] : r0_11
2828
# 3| valnum = unique
2929
# 5| r0_13(glval<int>) = VariableAddress[p0] :
3030
# 5| valnum = r0_3
@@ -86,15 +86,15 @@ test.cpp:
8686
# 12| valnum = m0_6
8787
# 13| r0_7(glval<int>) = VariableAddress[x] :
8888
# 13| valnum = r0_7
89-
# 13| m0_8(int) = Uninitialized : r0_7
89+
# 13| m0_8(int) = Uninitialized[x] : r0_7
9090
# 13| valnum = unique
9191
# 13| r0_9(glval<int>) = VariableAddress[y] :
9292
# 13| valnum = r0_9
93-
# 13| m0_10(int) = Uninitialized : r0_9
93+
# 13| m0_10(int) = Uninitialized[y] : r0_9
9494
# 13| valnum = unique
9595
# 14| r0_11(glval<unsigned char>) = VariableAddress[b] :
9696
# 14| valnum = unique
97-
# 14| m0_12(unsigned char) = Uninitialized : r0_11
97+
# 14| m0_12(unsigned char) = Uninitialized[b] : r0_11
9898
# 14| valnum = unique
9999
# 16| r0_13(glval<int>) = VariableAddress[p0] :
100100
# 16| valnum = r0_3
@@ -168,15 +168,15 @@ test.cpp:
168168
# 25| valnum = m0_6
169169
# 26| r0_7(glval<int>) = VariableAddress[x] :
170170
# 26| valnum = r0_7
171-
# 26| m0_8(int) = Uninitialized : r0_7
171+
# 26| m0_8(int) = Uninitialized[x] : r0_7
172172
# 26| valnum = unique
173173
# 26| r0_9(glval<int>) = VariableAddress[y] :
174174
# 26| valnum = r0_9
175-
# 26| m0_10(int) = Uninitialized : r0_9
175+
# 26| m0_10(int) = Uninitialized[y] : r0_9
176176
# 26| valnum = unique
177177
# 27| r0_11(glval<unsigned char>) = VariableAddress[b] :
178178
# 27| valnum = unique
179-
# 27| m0_12(unsigned char) = Uninitialized : r0_11
179+
# 27| m0_12(unsigned char) = Uninitialized[b] : r0_11
180180
# 27| valnum = unique
181181
# 29| r0_13(glval<int>) = VariableAddress[p0] :
182182
# 29| valnum = r0_3
@@ -261,15 +261,15 @@ test.cpp:
261261
# 39| valnum = m0_8
262262
# 40| r0_9(glval<int>) = VariableAddress[x] :
263263
# 40| valnum = r0_9
264-
# 40| m0_10(int) = Uninitialized : r0_9
264+
# 40| m0_10(int) = Uninitialized[x] : r0_9
265265
# 40| valnum = unique
266266
# 40| r0_11(glval<int>) = VariableAddress[y] :
267267
# 40| valnum = r0_11
268-
# 40| m0_12(int) = Uninitialized : r0_11
268+
# 40| m0_12(int) = Uninitialized[y] : r0_11
269269
# 40| valnum = unique
270270
# 41| r0_13(glval<unsigned char>) = VariableAddress[b] :
271271
# 41| valnum = unique
272-
# 41| m0_14(unsigned char) = Uninitialized : r0_13
272+
# 41| m0_14(unsigned char) = Uninitialized[b] : r0_13
273273
# 41| valnum = unique
274274
# 43| r0_15(glval<int>) = VariableAddress[p0] :
275275
# 43| valnum = r0_3
@@ -353,7 +353,7 @@ test.cpp:
353353
# 49| valnum = m0_6
354354
# 50| r0_7(glval<char *>) = VariableAddress[ptr] :
355355
# 50| valnum = r0_7
356-
# 50| m0_8(char *) = Uninitialized : r0_7
356+
# 50| m0_8(char *) = Uninitialized[ptr] : r0_7
357357
# 50| valnum = unique
358358
# 51| r0_9(glval<unsigned int>) = VariableAddress[result] :
359359
# 51| valnum = r0_9
@@ -601,7 +601,7 @@ test.cpp:
601601
# 84| valnum = m0_8
602602
# 86| r0_9(glval<int>) = VariableAddress[v] :
603603
# 86| valnum = r0_9
604-
# 86| m0_10(int) = Uninitialized : r0_9
604+
# 86| m0_10(int) = Uninitialized[v] : r0_9
605605
# 86| valnum = unique
606606
# 88| r0_11(glval<void *>) = VariableAddress[p] :
607607
# 88| valnum = r0_7

0 commit comments

Comments
 (0)