@@ -10,6 +10,8 @@ private import semmle.code.powershell.dataflow.DataFlow
1010private import semmle.code.powershell.typetracking.ApiGraphShared
1111private import semmle.code.powershell.typetracking.internal.TypeTrackingImpl
1212private import semmle.code.powershell.controlflow.Cfg
13+ private import frameworks.data.internal.ApiGraphModelsExtensions as Extensions
14+ private import frameworks.data.internal.ApiGraphModelsSpecific as Specific
1315private import semmle.code.powershell.dataflow.internal.DataFlowPrivate as DataFlowPrivate
1416private import semmle.code.powershell.dataflow.internal.DataFlowDispatch as DataFlowDispatch
1517
@@ -514,12 +516,48 @@ module API {
514516 )
515517 }
516518
519+ bindingset [ name]
520+ private string memberOrMethodReturnValue ( string name ) {
521+ // This predicate is a bit ad-hoc, but it's okay for now.
522+ // We can delete it once we no longer use the typeModel and summaryModel
523+ // tables to represent implicit root members.
524+ result = "Method[" + name + "]"
525+ or
526+ result = "Method[" + name + "].ReturnValue"
527+ or
528+ result = "Member[" + name + "]"
529+ }
530+
531+ private Node getAnImplicitRootMember ( string name ) {
532+ exists ( DataFlow:: CallNode call |
533+ Extensions:: typeModel ( _, Specific:: getAnImplicitImport ( ) , memberOrMethodReturnValue ( name ) )
534+ or
535+ Extensions:: summaryModel ( Specific:: getAnImplicitImport ( ) , memberOrMethodReturnValue ( name ) ,
536+ _, _, _, _)
537+ or
538+ Extensions:: sourceModel ( Specific:: getAnImplicitImport ( ) , memberOrMethodReturnValue ( name ) , _,
539+ _)
540+ |
541+ result = MkMethodAccessNode ( call ) and
542+ name = call .getName ( ) .toLowerCase ( )
543+ )
544+ }
545+
517546 cached
518547 predicate memberEdge ( Node pred , string name , Node succ ) {
519- exists ( StringConstExpr read |
520- succ = getForwardStartNode ( getNodeFromExpr ( read ) ) and
521- pred = MkRoot ( ) and
522- name = read .getValueString ( )
548+ pred = API:: root ( ) and
549+ (
550+ exists ( StringConstExpr read |
551+ succ = getForwardStartNode ( getNodeFromExpr ( read ) ) and
552+ name = read .getValueString ( )
553+ )
554+ or
555+ exists ( DataFlow:: AutomaticVariableNode automatic |
556+ automatic .getName ( ) = name and
557+ succ = getForwardStartNode ( automatic )
558+ )
559+ or
560+ succ = getAnImplicitRootMember ( name )
523561 )
524562 or
525563 exists ( DataFlow:: QualifiedTypeNameNode typeName |
@@ -528,12 +566,6 @@ module API {
528566 succ = getForwardStartNode ( typeName )
529567 )
530568 or
531- pred = MkRoot ( ) and
532- exists ( DataFlow:: AutomaticVariableNode automatic |
533- automatic .getName ( ) = name and
534- succ = getForwardStartNode ( automatic )
535- )
536- or
537569 exists ( MemberExprReadAccess read |
538570 read .getMemberName ( ) .toLowerCase ( ) = name and
539571 pred = getForwardEndNode ( getALocalSourceStrict ( getNodeFromExpr ( read .getQualifier ( ) ) ) ) and
@@ -548,6 +580,9 @@ module API {
548580 |
549581 pred = getForwardEndNode ( getALocalSourceStrict ( call .getQualifier ( ) ) )
550582 )
583+ or
584+ pred = API:: root ( ) and
585+ succ = getAnImplicitRootMember ( name )
551586 }
552587
553588 cached
0 commit comments