-
Notifications
You must be signed in to change notification settings - Fork 2k
Add IndirectUninitializedNode and related helper predicates
#21458
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 10 commits
6c792e6
8c03136
d3066af
f8a3ce7
3f9ad14
d191d09
dc291ff
356905b
d2fcced
d4fef1c
6ae32f2
ee00b98
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| --- | ||
| category: feature | ||
| --- | ||
| * A new data flow class called `IndirectUninitializedNode` represents uninitialized data of a variable behind some level of indirection. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -617,6 +617,25 @@ module Public { | |
| */ | ||
| LocalVariable asUninitialized() { result = this.(UninitializedNode).getLocalVariable() } | ||
|
|
||
| /** | ||
| * Gets the uninitialized local variable corresponding to this node behind | ||
| * `index` number of indirections, if any. | ||
| */ | ||
| LocalVariable asIndirectUninitialized(int index) { | ||
| exists(IndirectUninitializedNode indirectUninitializedNode | | ||
| this = indirectUninitializedNode and | ||
| indirectUninitializedNode.getIndirectionIndex() = index | ||
| | | ||
| result = indirectUninitializedNode.getLocalVariable() | ||
| ) | ||
| } | ||
|
|
||
| /** | ||
| * Gets the uninitialized local variable corresponding to this node behind | ||
| * a number indirections, if any. | ||
| */ | ||
| LocalVariable asIndirectUninitialized() { result = this.asIndirectUninitialized(_) } | ||
|
|
||
| /** | ||
| * Gets the positional parameter corresponding to the node that represents | ||
| * the value of the parameter after `index` number of loads, if any. For | ||
|
|
@@ -761,16 +780,13 @@ module Public { | |
| final override Type getType() { result = this.getPreUpdateNode().getType() } | ||
| } | ||
|
|
||
| /** | ||
| * The value of an uninitialized local variable, viewed as a node in a data | ||
| * flow graph. | ||
| */ | ||
| class UninitializedNode extends Node { | ||
| abstract private class AbstractUninitializedNode extends Node { | ||
| LocalVariable v; | ||
| int indirectionIndex; | ||
|
||
|
|
||
| UninitializedNode() { | ||
| AbstractUninitializedNode() { | ||
| exists(SsaImpl::Definition def, SsaImpl::SourceVariable sv | | ||
| def.getIndirectionIndex() = 0 and | ||
| def.getIndirectionIndex() = indirectionIndex and | ||
| def.getValue().asInstruction() instanceof UninitializedInstruction and | ||
| SsaImpl::defToNode(this, def, sv) and | ||
| v = sv.getBaseVariable().(SsaImpl::BaseIRVariable).getIRVariable().getAst() | ||
|
|
@@ -781,6 +797,25 @@ module Public { | |
| LocalVariable getLocalVariable() { result = v } | ||
| } | ||
|
|
||
| /** | ||
| * The value of an uninitialized local variable, viewed as a node in a data | ||
| * flow graph. | ||
| */ | ||
| class UninitializedNode extends AbstractUninitializedNode { | ||
| UninitializedNode() { indirectionIndex = 0 } | ||
| } | ||
|
|
||
| /** | ||
| * The value of an uninitialized local variable behind one or more levels of | ||
| * indirection, viewed as a node in a data flow graph. | ||
| */ | ||
| class IndirectUninitializedNode extends AbstractUninitializedNode { | ||
| IndirectUninitializedNode() { indirectionIndex > 0 } | ||
|
|
||
| /** Gets the indirection index of this node. */ | ||
| int getIndirectionIndex() { result = indirectionIndex } | ||
| } | ||
|
|
||
| /** | ||
| * The value of a parameter at function entry, viewed as a node in a data | ||
| * flow graph. This includes both explicit parameters such as `x` in `f(x)` | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.