@@ -11,6 +11,7 @@ private import semmle.javascript.dataflow.internal.PreCallGraphStep
11
11
private import semmle.javascript.dataflow.internal.StepSummary
12
12
private import semmle.javascript.dataflow.internal.sharedlib.SummaryTypeTracker as SummaryTypeTracker
13
13
private import semmle.javascript.dataflow.internal.Contents:: Private as ContentPrivate
14
+ private import semmle.javascript.DynamicPropertyAccess
14
15
private import internal.CachedStages
15
16
16
17
/**
@@ -1516,7 +1517,12 @@ module API {
1516
1517
* Currently this is represented the same way as an unknown array element, but this may
1517
1518
* change in the future.
1518
1519
*/
1519
- LabelContent unknownMember ( ) { result .getContent ( ) .isUnknownArrayElement ( ) }
1520
+ ApiLabel unknownMember ( ) { result = arrayElement ( ) }
1521
+
1522
+ /**
1523
+ * Gets the edge label for an unknown array element.
1524
+ */
1525
+ LabelContent arrayElement ( ) { result .getContent ( ) .isUnknownArrayElement ( ) }
1520
1526
1521
1527
/**
1522
1528
* Gets a property name referred to by the given dynamic property access,
@@ -1539,6 +1545,11 @@ module API {
1539
1545
result = unique( string s | s = getAnIndirectPropName ( ref ) )
1540
1546
}
1541
1547
1548
+ pragma [ nomagic]
1549
+ private predicate isEnumeratedPropName ( DataFlow:: Node node ) {
1550
+ node .getAPredecessor * ( ) instanceof EnumeratedPropName
1551
+ }
1552
+
1542
1553
/** Gets the `member` edge label for the given property reference. */
1543
1554
ApiLabel memberFromRef ( DataFlow:: PropRef pr ) {
1544
1555
exists ( string pn | pn = pr .getPropertyName ( ) or pn = getIndirectPropName ( pr ) |
@@ -1550,7 +1561,9 @@ module API {
1550
1561
or
1551
1562
not exists ( pr .getPropertyName ( ) ) and
1552
1563
not exists ( getIndirectPropName ( pr ) ) and
1553
- result = unknownMember ( )
1564
+ // Avoid assignments in an extend-like pattern
1565
+ not isEnumeratedPropName ( pr .getPropertyNameExpr ( ) .flow ( ) ) and
1566
+ result = arrayElement ( )
1554
1567
}
1555
1568
1556
1569
/** Gets the `instance` edge label. */
0 commit comments