Skip to content

Commit 1516029

Browse files
committed
JS: Avoid generating ArrayElement edges for extend-like patterns
1 parent 125e732 commit 1516029

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import semmle.javascript.dataflow.internal.PreCallGraphStep
1111
private import semmle.javascript.dataflow.internal.StepSummary
1212
private import semmle.javascript.dataflow.internal.sharedlib.SummaryTypeTracker as SummaryTypeTracker
1313
private import semmle.javascript.dataflow.internal.Contents::Private as ContentPrivate
14+
private import semmle.javascript.DynamicPropertyAccess
1415
private import internal.CachedStages
1516

1617
/**
@@ -1516,7 +1517,12 @@ module API {
15161517
* Currently this is represented the same way as an unknown array element, but this may
15171518
* change in the future.
15181519
*/
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() }
15201526

15211527
/**
15221528
* Gets a property name referred to by the given dynamic property access,
@@ -1539,6 +1545,11 @@ module API {
15391545
result = unique(string s | s = getAnIndirectPropName(ref))
15401546
}
15411547

1548+
pragma[nomagic]
1549+
private predicate isEnumeratedPropName(DataFlow::Node node) {
1550+
node.getAPredecessor*() instanceof EnumeratedPropName
1551+
}
1552+
15421553
/** Gets the `member` edge label for the given property reference. */
15431554
ApiLabel memberFromRef(DataFlow::PropRef pr) {
15441555
exists(string pn | pn = pr.getPropertyName() or pn = getIndirectPropName(pr) |
@@ -1550,7 +1561,9 @@ module API {
15501561
or
15511562
not exists(pr.getPropertyName()) and
15521563
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()
15541567
}
15551568

15561569
/** Gets the `instance` edge label. */

0 commit comments

Comments
 (0)