@@ -176,6 +176,18 @@ predicate sinkHasAlias(API::Node sink, string package, string name) {
176
176
bindingset [ node]
177
177
private API:: Node getASinkNode ( DataFlow:: SourceNode node ) { result .getAValueReachingSink ( ) = node }
178
178
179
+ /**
180
+ * Holds if `node` is a declaration in an externs file.
181
+ *
182
+ * This is to ensure that functions/classes in externs are not named after a re-export in a package.
183
+ */
184
+ private predicate nameFromExterns ( DataFlow:: Node node , string package , string name , int badness ) {
185
+ node .getTopLevel ( ) .isExterns ( ) and
186
+ package = "global" and
187
+ node = AccessPath:: getAnAssignmentTo ( name ) and
188
+ badness = - 10
189
+ }
190
+
179
191
bindingset [ qualifiedName]
180
192
private int getBadnessOfClassName ( string qualifiedName ) {
181
193
if qualifiedName .matches ( "%.constructor" )
@@ -201,6 +213,8 @@ private predicate classObjectHasNameCandidate(
201
213
sinkHasPrimaryName ( getASinkNode ( cls ) , package , name , baseBadness ) and
202
214
badness = baseBadness + getBadnessOfClassName ( name )
203
215
)
216
+ or
217
+ nameFromExterns ( cls , package , name , badness )
204
218
}
205
219
206
220
private predicate classObjectHasPrimaryName (
@@ -314,6 +328,8 @@ private predicate functionHasNameCandidate(
314
328
name = join ( baseName , memberName )
315
329
)
316
330
)
331
+ or
332
+ nameFromExterns ( function , package , name , badness )
317
333
}
318
334
319
335
private predicate functionHasPrimaryName (
0 commit comments