@@ -167,24 +167,6 @@ predicate sinkHasPrimaryName(API::Node sink, string package, string name) {
167167 sinkHasPrimaryName ( sink , package , name , _)
168168}
169169
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-
188170/** Gets a source node that can flow to `sink` without using a return step. */
189171private DataFlow:: SourceNode nodeReachingSink ( API:: Node sink , DataFlow:: TypeBackTracker t ) {
190172 t .start ( ) and
@@ -243,49 +225,8 @@ private predicate classObjectHasNameCandidate(
243225 )
244226 or
245227 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- )
276228 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
289230 // class can still escape via more complex access patterns, resort to a synthesized name.
290231 // For example:
291232 //
@@ -297,62 +238,21 @@ private predicate classInstanceHasNameCandidate(
297238 hasEscapingInstance ( cls ) and
298239 exists ( string baseName |
299240 InternalModuleNaming:: fallbackModuleName ( cls .getTopLevel ( ) , package , baseName , badness - 100 ) and
300- name = join ( baseName , cls .getName ( ) ) + ".prototype"
241+ name = join ( baseName , cls .getName ( ) )
301242 )
302243}
303244
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 ( ) )
348248}
349249
350250private predicate sourceNodeHasNameCandidate (
351251 DataFlow:: SourceNode node , string package , string name , int badness
352252) {
353253 sinkHasPrimaryName ( getASinkNode ( node ) , package , name , badness )
354254 or
355- functionHasNameCandidate ( node , package , name , badness )
255+ nameFromExterns ( node , package , name , badness )
356256 or
357257 classObjectHasNameCandidate ( node , package , name , badness )
358258}
@@ -371,13 +271,18 @@ private predicate sourceNodeHasPrimaryName(
371271 * Holds if `node` is a function or a call that returns a function.
372272 */
373273private 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+ )
381286}
382287
383288/**
@@ -528,28 +433,6 @@ module Debug {
528433 )
529434 }
530435
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-
553436 /** Holds if the given `node` has multiple primary names. */
554437 query string ambiguousFunctionName ( DataFlow:: FunctionNode node ) {
555438 strictcount ( string package , string name | functionHasPrimaryName ( node , package , name ) ) > 1 and
0 commit comments