Skip to content

Commit 07d51a5

Browse files
committed
C++: Assign a meaningful definition location to the address of an SSA variable when it's available.
1 parent 41b95a1 commit 07d51a5

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private import semmle.code.cpp.models.interfaces.PartialFlow as PartialFlow
99
private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO
1010
private import semmle.code.cpp.ir.internal.IRCppLanguage
1111
private import semmle.code.cpp.ir.dataflow.internal.ModelUtil
12+
private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedInitialization
1213
private import DataFlowPrivate
1314
import SsaInternalsCommon
1415

@@ -329,6 +330,17 @@ private predicate sourceVariableHasBaseAndIndex(SourceVariable v, BaseSourceVari
329330
v.getIndirection() = ind
330331
}
331332

333+
/**
334+
* Gets the instruction that computes the address that's used to
335+
* initialize `v`.
336+
*/
337+
private Instruction getInitializationTargetAddress(IRVariable v) {
338+
exists(TranslatedVariableInitialization init |
339+
init.getIRVariable() = v and
340+
result = init.getTargetAddress()
341+
)
342+
}
343+
332344
/** An initial definition of an `IRVariable`'s address. */
333345
private class DefAddressImpl extends DefImpl, TDefAddressImpl {
334346
BaseIRVariable v;
@@ -347,8 +359,15 @@ private class DefAddressImpl extends DefImpl, TDefAddressImpl {
347359
final override Node0Impl getValue() { none() }
348360

349361
final override predicate hasIndexInBlock(IRBlock block, int index) {
350-
block = v.getIRVariable().getEnclosingIRFunction().getEntryBlock() and
351-
index = 0
362+
exists(IRVariable var | var = v.getIRVariable() |
363+
block.getInstruction(index) = getInitializationTargetAddress(var)
364+
or
365+
// If there is no translatated element that does initialization of the
366+
// variable we place the SSA definition at the entry block of the function.
367+
not exists(getInitializationTargetAddress(var)) and
368+
block = var.getEnclosingIRFunction().getEntryBlock() and
369+
index = 0
370+
)
352371
}
353372

354373
override Cpp::Location getLocation() { result = v.getIRVariable().getLocation() }

0 commit comments

Comments
 (0)