@@ -556,6 +556,32 @@ module API {
556
556
nd = MkDef ( rhs )
557
557
}
558
558
559
+ /**
560
+ * Holds if `ref` is a read of a property described by `lbl` on `pred`, and
561
+ * `propDesc` is compatible with that property, meaning it is either the
562
+ * name of the property itself or the empty string.
563
+ */
564
+ pragma [ noinline]
565
+ private predicate propertyRead (
566
+ DataFlow:: SourceNode pred , string propDesc , string lbl , DataFlow:: Node ref
567
+ ) {
568
+ ref = pred .getAPropertyRead ( ) and
569
+ lbl = Label:: memberFromRef ( ref ) and
570
+ (
571
+ lbl = Label:: member ( propDesc )
572
+ or
573
+ propDesc = ""
574
+ )
575
+ or
576
+ PromiseFlow:: loadStep ( pred .getALocalUse ( ) , ref , Promises:: valueProp ( ) ) and
577
+ lbl = Label:: promised ( ) and
578
+ ( propDesc = Promises:: valueProp ( ) or propDesc = "" )
579
+ or
580
+ PromiseFlow:: loadStep ( pred .getALocalUse ( ) , ref , Promises:: errorProp ( ) ) and
581
+ lbl = Label:: promisedError ( ) and
582
+ ( propDesc = Promises:: errorProp ( ) or propDesc = "" )
583
+ }
584
+
559
585
/**
560
586
* Holds if `ref` is a use of a node that should have an incoming edge from `base` labeled
561
587
* `lbl` in the API graph.
@@ -567,37 +593,25 @@ module API {
567
593
base = MkRoot ( ) and
568
594
ref = lbl .( EntryPoint ) .getAUse ( )
569
595
or
570
- exists ( DataFlow:: SourceNode src , DataFlow:: SourceNode pred , string prop |
571
- use ( base , src ) and pred = trackUseNode ( src , false , 0 , prop )
572
- |
596
+ // property reads
597
+ exists ( DataFlow:: SourceNode src , DataFlow:: SourceNode pred , string propDesc |
598
+ use ( base , src ) and
599
+ pred = trackUseNode ( src , false , 0 , propDesc ) and
600
+ propertyRead ( pred , propDesc , lbl , ref ) and
573
601
// `module.exports` is special: it is a use of a def-node, not a use-node,
574
602
// so we want to exclude it here
575
- ( base instanceof TNonModuleDef or base instanceof TUse ) and
576
- lbl = Label:: memberFromRef ( ref ) and
577
- (
578
- lbl = Label:: member ( prop )
579
- or
580
- prop = ""
581
- ) and
582
- ref = pred .getAPropertyRead ( )
583
- or
603
+ ( base instanceof TNonModuleDef or base instanceof TUse )
604
+ )
605
+ or
606
+ // invocations
607
+ exists ( DataFlow:: SourceNode src , DataFlow:: SourceNode pred |
608
+ use ( base , src ) and pred = trackUseNode ( src )
609
+ |
584
610
lbl = Label:: instance ( ) and
585
- prop = "" and
586
611
ref = pred .getAnInstantiation ( )
587
612
or
588
613
lbl = Label:: return ( ) and
589
- prop = "" and
590
614
ref = pred .getAnInvocation ( )
591
- or
592
- (
593
- lbl = Label:: promised ( ) and
594
- ( prop = Promises:: valueProp ( ) or prop = "" ) and
595
- PromiseFlow:: loadStep ( pred .getALocalUse ( ) , ref , Promises:: valueProp ( ) )
596
- or
597
- lbl = Label:: promisedError ( ) and
598
- ( prop = Promises:: errorProp ( ) or prop = "" ) and
599
- PromiseFlow:: loadStep ( pred .getALocalUse ( ) , ref , Promises:: errorProp ( ) )
600
- )
601
615
)
602
616
or
603
617
exists ( DataFlow:: Node def , DataFlow:: FunctionNode fn |
0 commit comments