@@ -167,24 +167,6 @@ predicate sinkHasPrimaryName(API::Node sink, string package, string name) {
167
167
sinkHasPrimaryName ( sink , package , name , _)
168
168
}
169
169
170
- /**
171
- * Holds if `(package, name)` is an alias for `node`.
172
- *
173
- * This means it is a valid name for it, but was not chosen as the primary name.
174
- */
175
- private predicate sinkHasAlias ( API:: Node sink , string package , string name ) {
176
- not sinkHasPrimaryName ( sink , package , name ) and
177
- (
178
- exists ( string baseName , string step |
179
- sinkHasPrimaryName ( getAPredecessor ( sink , step , _) , package , baseName ) and
180
- name = join ( baseName , step )
181
- )
182
- or
183
- sink = API:: moduleExport ( package ) and
184
- name = ""
185
- )
186
- }
187
-
188
170
/** Gets a source node that can flow to `sink` without using a return step. */
189
171
private DataFlow:: SourceNode nodeReachingSink ( API:: Node sink , DataFlow:: TypeBackTracker t ) {
190
172
t .start ( ) and
@@ -243,49 +225,8 @@ private predicate classObjectHasNameCandidate(
243
225
)
244
226
or
245
227
nameFromExterns ( cls , package , name , badness )
246
- }
247
-
248
- private predicate classObjectHasPrimaryName (
249
- DataFlow:: ClassNode cls , string package , string name , int badness
250
- ) {
251
- badness = min ( int b | classObjectHasNameCandidate ( cls , _, _, b ) | b ) and
252
- package = min ( string p | classObjectHasNameCandidate ( cls , p , _, badness ) | p ) and
253
- name = min ( string n | classObjectHasNameCandidate ( cls , package , n , badness ) | n )
254
- }
255
-
256
- /** Holds if `(package, name)` is the primary name for the class object of `cls`. */
257
- predicate classObjectHasPrimaryName ( DataFlow:: ClassNode cls , string package , string name ) {
258
- classObjectHasPrimaryName ( cls , package , name , _)
259
- }
260
-
261
- /** Holds if an instance of `cls` can be exposed to client code. */
262
- private predicate hasEscapingInstance ( DataFlow:: ClassNode cls ) {
263
- cls .getAnInstanceReference ( ) .flowsTo ( any ( API:: Node n ) .asSink ( ) )
264
- }
265
-
266
- /**
267
- * Holds if `(package, name)` is a potential name to use for instances of `cls`, with the given `badness`.
268
- */
269
- private predicate classInstanceHasNameCandidate (
270
- DataFlow:: ClassNode cls , string package , string name , int badness
271
- ) {
272
- exists ( string baseName |
273
- classObjectHasPrimaryName ( cls , package , baseName , badness ) and
274
- name = join ( baseName , "prototype" )
275
- )
276
228
or
277
- // In case the class itself is unaccessible, but an instance is exposed via an access path,
278
- // consider using that access path. For example:
279
- //
280
- // class InternalClass {}
281
- // module.exports.foo = new InternalClass();
282
- //
283
- exists ( int baseBadness |
284
- sinkHasPrimaryName ( getASinkNode ( cls .getAnInstanceReference ( ) ) , package , name , baseBadness ) and
285
- badness = baseBadness + 30 // add penalty, as we prefer to base this on the class name
286
- )
287
- or
288
- // If neither the class nor its instances are accessible via an access path, but instances of the
229
+ // If the class is not accessible via an access path, but instances of the
289
230
// class can still escape via more complex access patterns, resort to a synthesized name.
290
231
// For example:
291
232
//
@@ -297,62 +238,21 @@ private predicate classInstanceHasNameCandidate(
297
238
hasEscapingInstance ( cls ) and
298
239
exists ( string baseName |
299
240
InternalModuleNaming:: fallbackModuleName ( cls .getTopLevel ( ) , package , baseName , badness - 100 ) and
300
- name = join ( baseName , cls .getName ( ) ) + ".prototype"
241
+ name = join ( baseName , cls .getName ( ) )
301
242
)
302
243
}
303
244
304
- private predicate classInstanceHasPrimaryName (
305
- DataFlow:: ClassNode cls , string package , string name , int badness
306
- ) {
307
- badness = min ( int b | classInstanceHasNameCandidate ( cls , _, _, b ) | b ) and
308
- package = min ( string p | classInstanceHasNameCandidate ( cls , p , _, badness ) | p ) and
309
- name =
310
- min ( string n |
311
- classInstanceHasNameCandidate ( cls , package , n , badness )
312
- |
313
- n order by n .length ( ) , n
314
- )
315
- }
316
-
317
- /** Holds if `(package, name)` is the primary name to use for instances of `cls`. */
318
- predicate classInstanceHasPrimaryName ( DataFlow:: ClassNode cls , string package , string name ) {
319
- classInstanceHasPrimaryName ( cls , package , name , _)
320
- }
321
-
322
- /** Holds if `(package, name)` is an alias referring to some instance of `cls`. */
323
- predicate classInstanceHasAlias ( DataFlow:: ClassNode cls , string package , string name ) {
324
- not classInstanceHasPrimaryName ( cls , package , name ) and
325
- exists ( int badness |
326
- classInstanceHasNameCandidate ( cls , package , name , badness ) and
327
- badness < 100 // Badness 100 is when we start to synthesize names. Do not suggest these as aliases.
328
- )
329
- }
330
-
331
- private predicate functionHasNameCandidate (
332
- DataFlow:: FunctionNode function , string package , string name , int badness
333
- ) {
334
- sinkHasPrimaryName ( getASinkNode ( function ) , package , name , badness )
335
- or
336
- exists ( DataFlow:: ClassNode cls |
337
- function = cls .getConstructor ( ) and
338
- classObjectHasPrimaryName ( cls , package , name , badness )
339
- or
340
- exists ( string baseName , string memberName |
341
- function = cls .getStaticMethod ( memberName ) and
342
- classObjectHasPrimaryName ( cls , package , baseName , badness ) and
343
- name = join ( baseName , memberName )
344
- )
345
- )
346
- or
347
- nameFromExterns ( function , package , name , badness )
245
+ /** Holds if an instance of `cls` can be exposed to client code. */
246
+ private predicate hasEscapingInstance ( DataFlow:: ClassNode cls ) {
247
+ cls .getAnInstanceReference ( ) .flowsTo ( any ( API:: Node n ) .asSink ( ) )
348
248
}
349
249
350
250
private predicate sourceNodeHasNameCandidate (
351
251
DataFlow:: SourceNode node , string package , string name , int badness
352
252
) {
353
253
sinkHasPrimaryName ( getASinkNode ( node ) , package , name , badness )
354
254
or
355
- functionHasNameCandidate ( node , package , name , badness )
255
+ nameFromExterns ( node , package , name , badness )
356
256
or
357
257
classObjectHasNameCandidate ( node , package , name , badness )
358
258
}
@@ -371,13 +271,18 @@ private predicate sourceNodeHasPrimaryName(
371
271
* Holds if `node` is a function or a call that returns a function.
372
272
*/
373
273
private predicate isFunctionSource ( DataFlow:: SourceNode node ) {
374
- node instanceof DataFlow:: FunctionNode
375
- or
376
- node instanceof DataFlow:: InvokeNode and
377
- exists ( node .getABoundFunctionValue ( _) ) and
378
- // `getASinkNode` steps through imports (but not other calls) so exclude calls that are imports (i.e. require calls)
379
- // as we want to get as close to the source as possible.
380
- not node instanceof DataFlow:: ModuleImportNode
274
+ exists ( getASinkNode ( node ) ) and
275
+ (
276
+ node instanceof DataFlow:: FunctionNode
277
+ or
278
+ node instanceof DataFlow:: ClassNode
279
+ or
280
+ node instanceof DataFlow:: InvokeNode and
281
+ exists ( node .getABoundFunctionValue ( _) ) and
282
+ // `getASinkNode` steps through imports (but not other calls) so exclude calls that are imports (i.e. require calls)
283
+ // as we want to get as close to the source as possible.
284
+ not node instanceof DataFlow:: ModuleImportNode
285
+ )
381
286
}
382
287
383
288
/**
@@ -528,28 +433,6 @@ module Debug {
528
433
)
529
434
}
530
435
531
- /** Holds if the given `node` has multiple primary names. */
532
- query string ambiguousClassObjectName ( DataFlow:: ClassNode node ) {
533
- strictcount ( string package , string name | classObjectHasPrimaryName ( node , package , name ) ) > 1 and
534
- result =
535
- concat ( string package , string name |
536
- classObjectHasPrimaryName ( node , package , name )
537
- |
538
- renderName ( package , name ) , ", "
539
- )
540
- }
541
-
542
- /** Holds if the given `node` has multiple primary names. */
543
- query string ambiguousClassInstanceName ( DataFlow:: ClassNode node ) {
544
- strictcount ( string package , string name | classInstanceHasPrimaryName ( node , package , name ) ) > 1 and
545
- result =
546
- concat ( string package , string name |
547
- classInstanceHasPrimaryName ( node , package , name )
548
- |
549
- renderName ( package , name ) , ", "
550
- )
551
- }
552
-
553
436
/** Holds if the given `node` has multiple primary names. */
554
437
query string ambiguousFunctionName ( DataFlow:: FunctionNode node ) {
555
438
strictcount ( string package , string name | functionHasPrimaryName ( node , package , name ) ) > 1 and
0 commit comments