@@ -9,6 +9,7 @@ private import semmle.code.cpp.models.interfaces.PartialFlow as PartialFlow
99private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO
1010private import semmle.code.cpp.ir.internal.IRCppLanguage
1111private import semmle.code.cpp.ir.dataflow.internal.ModelUtil
12+ private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedInitialization
1213private import DataFlowPrivate
1314import 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. */
333345private 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