@@ -371,7 +371,7 @@ private class PrimaryArgumentNode extends ArgumentNode, OperandNode {
371371 PrimaryArgumentNode ( ) { exists ( CallInstruction call | op = call .getAnArgumentOperand ( ) ) }
372372
373373 override predicate argumentOf ( DataFlowCall call , ArgumentPosition pos ) {
374- op = call .getArgumentOperand ( pos .( DirectPosition ) .getIndex ( ) )
374+ op = call .getArgumentOperand ( pos .( DirectPosition ) .getArgumentIndex ( ) )
375375 }
376376}
377377
@@ -410,8 +410,16 @@ class ParameterPosition = Position;
410410class ArgumentPosition = Position ;
411411
412412abstract class Position extends TPosition {
413+ /** Gets a textual representation of this position. */
413414 abstract string toString ( ) ;
414415
416+ /**
417+ * Gets the argument index of this position. The qualifier of a call has
418+ * argument index `-1`.
419+ */
420+ abstract int getArgumentIndex ( ) ;
421+
422+ /** Gets the indirection index of this position. */
415423 abstract int getIndirectionIndex ( ) ;
416424}
417425
@@ -428,7 +436,7 @@ class DirectPosition extends Position, TDirectPosition {
428436 result = index .toString ( )
429437 }
430438
431- int getIndex ( ) { result = index }
439+ override int getArgumentIndex ( ) { result = index }
432440
433441 final override int getIndirectionIndex ( ) { result = 0 }
434442}
@@ -445,16 +453,29 @@ class IndirectionPosition extends Position, TIndirectionPosition {
445453 else result = repeatStars ( indirectionIndex ) + argumentIndex .toString ( )
446454 }
447455
448- int getArgumentIndex ( ) { result = argumentIndex }
456+ override int getArgumentIndex ( ) { result = argumentIndex }
449457
450458 final override int getIndirectionIndex ( ) { result = indirectionIndex }
451459}
452460
453461newtype TPosition =
454- TDirectPosition ( int argumentIndex ) { exists ( any ( CallInstruction c ) .getArgument ( argumentIndex ) ) } or
462+ TDirectPosition ( int argumentIndex ) {
463+ exists ( any ( CallInstruction c ) .getArgument ( argumentIndex ) )
464+ or
465+ // Handle the rare case where there is a function definition but no call to
466+ // the function.
467+ exists ( any ( Cpp:: Function f ) .getParameter ( argumentIndex ) )
468+ } or
455469 TIndirectionPosition ( int argumentIndex , int indirectionIndex ) {
456470 Ssa:: hasIndirectOperand ( any ( CallInstruction call ) .getArgumentOperand ( argumentIndex ) ,
457471 indirectionIndex )
472+ or
473+ // Handle the rare case where there is a function definition but no call to
474+ // the function.
475+ exists ( Cpp:: Function f , Cpp:: Parameter p |
476+ p = f .getParameter ( argumentIndex ) and
477+ indirectionIndex = [ 1 .. Ssa:: getMaxIndirectionsForType ( p .getUnspecifiedType ( ) ) - 1 ]
478+ )
458479 }
459480
460481private newtype TReturnKind =
@@ -501,6 +522,15 @@ class ReturnKind extends TReturnKind {
501522
502523 /** Gets a textual representation of this return kind. */
503524 abstract string toString ( ) ;
525+
526+ /** Holds if this `ReturnKind` is generated from a `return` statement. */
527+ abstract predicate isNormalReturn ( ) ;
528+
529+ /**
530+ * Holds if this `ReturnKind` is generated from a write to the parameter with
531+ * index `argumentIndex`
532+ */
533+ abstract predicate isIndirectReturn ( int argumentIndex ) ;
504534}
505535
506536/**
@@ -514,6 +544,10 @@ class NormalReturnKind extends ReturnKind, TNormalReturnKind {
514544 override int getIndirectionIndex ( ) { result = indirectionIndex }
515545
516546 override string toString ( ) { result = "indirect return" }
547+
548+ override predicate isNormalReturn ( ) { any ( ) }
549+
550+ override predicate isIndirectReturn ( int argumentIndex ) { none ( ) }
517551}
518552
519553/**
@@ -528,6 +562,10 @@ private class IndirectReturnKind extends ReturnKind, TIndirectReturnKind {
528562 override int getIndirectionIndex ( ) { result = indirectionIndex }
529563
530564 override string toString ( ) { result = "indirect outparam[" + argumentIndex .toString ( ) + "]" }
565+
566+ override predicate isNormalReturn ( ) { none ( ) }
567+
568+ override predicate isIndirectReturn ( int argumentIndex_ ) { argumentIndex_ = argumentIndex }
531569}
532570
533571/** A data flow node that occurs as the result of a `ReturnStmt`. */
0 commit comments