@@ -10,6 +10,8 @@ private import semmle.code.powershell.dataflow.DataFlow
10
10
private import semmle.code.powershell.typetracking.ApiGraphShared
11
11
private import semmle.code.powershell.typetracking.internal.TypeTrackingImpl
12
12
private import semmle.code.powershell.controlflow.Cfg
13
+ private import frameworks.data.internal.ApiGraphModelsExtensions as Extensions
14
+ private import frameworks.data.internal.ApiGraphModelsSpecific as Specific
13
15
private import semmle.code.powershell.dataflow.internal.DataFlowPrivate as DataFlowPrivate
14
16
private import semmle.code.powershell.dataflow.internal.DataFlowDispatch as DataFlowDispatch
15
17
@@ -514,12 +516,48 @@ module API {
514
516
)
515
517
}
516
518
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
+
517
546
cached
518
547
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 )
523
561
)
524
562
or
525
563
exists ( DataFlow:: QualifiedTypeNameNode typeName |
@@ -528,12 +566,6 @@ module API {
528
566
succ = getForwardStartNode ( typeName )
529
567
)
530
568
or
531
- pred = MkRoot ( ) and
532
- exists ( DataFlow:: AutomaticVariableNode automatic |
533
- automatic .getName ( ) = name and
534
- succ = getForwardStartNode ( automatic )
535
- )
536
- or
537
569
exists ( MemberExprReadAccess read |
538
570
read .getMemberName ( ) .toLowerCase ( ) = name and
539
571
pred = getForwardEndNode ( getALocalSourceStrict ( getNodeFromExpr ( read .getQualifier ( ) ) ) ) and
@@ -548,6 +580,9 @@ module API {
548
580
|
549
581
pred = getForwardEndNode ( getALocalSourceStrict ( call .getQualifier ( ) ) )
550
582
)
583
+ or
584
+ pred = API:: root ( ) and
585
+ succ = getAnImplicitRootMember ( name )
551
586
}
552
587
553
588
cached
0 commit comments