77
88import javascript
99private import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps
10+ private import semmle.javascript.dataflow.internal.PreCallGraphStep
1011private import internal.CachedStages
1112
1213/**
@@ -782,6 +783,13 @@ module API {
782783 rhs = m .getAnExportedValue ( prop )
783784 )
784785 or
786+ // In general, turn store steps into member steps for def-nodes
787+ exists ( string prop |
788+ PreCallGraphStep:: storeStep ( rhs , pred , prop ) and
789+ lbl = Label:: member ( prop ) and
790+ not DataFlow:: PseudoProperties:: isPseudoProperty ( prop )
791+ )
792+ or
785793 exists ( DataFlow:: FunctionNode fn |
786794 fn = pred and
787795 lbl = Label:: return ( )
@@ -947,7 +955,6 @@ module API {
947955 ( base instanceof TNonModuleDef or base instanceof TUse )
948956 )
949957 or
950- // invocations
951958 exists ( DataFlow:: SourceNode src , DataFlow:: SourceNode pred |
952959 use ( base , src ) and pred = trackUseNode ( src )
953960 |
@@ -968,6 +975,13 @@ module API {
968975 or
969976 ref = cls .getAClassReference ( ) .getAnInstantiation ( )
970977 )
978+ or
979+ exists ( string prop |
980+ PreCallGraphStep:: loadStep ( pred .getALocalUse ( ) , ref , prop ) and
981+ lbl = Label:: member ( prop ) and
982+ // avoid generating member edges like "$arrayElement$"
983+ not DataFlow:: PseudoProperties:: isPseudoProperty ( prop )
984+ )
971985 )
972986 or
973987 exists ( DataFlow:: Node def , DataFlow:: FunctionNode fn |
@@ -1535,7 +1549,9 @@ module API {
15351549 prop = any ( CanonicalName c ) .getName ( ) or
15361550 prop = any ( DataFlow:: PropRef p ) .getPropertyName ( ) or
15371551 exists ( Impl:: MkTypeUse ( _, prop ) ) or
1538- exists ( any ( Module m ) .getAnExportedValue ( prop ) )
1552+ exists ( any ( Module m ) .getAnExportedValue ( prop ) ) or
1553+ PreCallGraphStep:: loadStep ( _, _, prop ) or
1554+ PreCallGraphStep:: storeStep ( _, _, prop )
15391555 } or
15401556 MkLabelUnknownMember ( ) or
15411557 MkLabelParameter ( int i ) {
0 commit comments