Skip to content

Commit baa3c35

Browse files
committed
JS: Refactor aliasing relation
1 parent 8d3a19a commit baa3c35

File tree

7 files changed

+42
-23
lines changed

7 files changed

+42
-23
lines changed

javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ predicate sinkHasPrimaryName(API::Node sink, string package, string name) {
168168
*
169169
* This means it is a valid name for it, but was not chosen as the primary name.
170170
*/
171-
predicate sinkHasAlias(API::Node sink, string package, string name) {
171+
private predicate sinkHasAlias(API::Node sink, string package, string name) {
172172
not sinkHasPrimaryName(sink, package, name) and
173173
(
174174
exists(string baseName, string step |
@@ -239,15 +239,6 @@ predicate classObjectHasPrimaryName(DataFlow::ClassNode cls, string package, str
239239
classObjectHasPrimaryName(cls, package, name, _)
240240
}
241241

242-
/** Holds if `(package, name)` is an alias for the class object of `cls`. */
243-
predicate classObjectHasAlias(DataFlow::ClassNode cls, string package, string name) {
244-
not classObjectHasPrimaryName(cls, package, name) and
245-
exists(int badness |
246-
classObjectHasNameCandidate(cls, package, name, badness) and
247-
badness < 100
248-
)
249-
}
250-
251242
/** Holds if an instance of `cls` can be exposed to client code. */
252243
private predicate hasEscapingInstance(DataFlow::ClassNode cls) {
253244
cls.getAnInstanceReference().flowsTo(any(API::Node n).asSink())
@@ -362,14 +353,28 @@ predicate functionHasPrimaryName(DataFlow::FunctionNode function, string package
362353
}
363354

364355
/**
365-
* Holds if `(package, name)` is an alias for the given `function`.
356+
* Holds if `(aliasPackage, aliasName)` is an alias for `(primaryPackage, primaryName)`,
357+
* defined at `aliasDef`.
366358
*/
367-
predicate functionHasAlias(DataFlow::FunctionNode function, string package, string name) {
368-
not functionHasPrimaryName(function, package, name) and
369-
exists(int badness |
370-
functionHasNameCandidate(function, package, name, badness) and
371-
badness < 100
359+
predicate aliasDefinition(
360+
string primaryPackage, string primaryName, string aliasPackage, string aliasName,
361+
API::Node aliasDef
362+
) {
363+
exists(DataFlow::SourceNode source |
364+
classObjectHasPrimaryName(source, primaryPackage, primaryName)
365+
or
366+
functionHasPrimaryName(source, primaryPackage, primaryName)
367+
|
368+
aliasDef.getAValueReachingSink() = source and
369+
sinkHasPrimaryName(aliasDef, aliasPackage, aliasName, _) and
370+
not (
371+
primaryPackage = aliasPackage and
372+
primaryName = aliasName
373+
)
372374
)
375+
or
376+
sinkHasPrimaryName(aliasDef, primaryPackage, primaryName) and
377+
sinkHasAlias(aliasDef, aliasPackage, aliasName)
373378
}
374379

375380
/**

javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.ql

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ module TestConfig implements TestSig {
1212
result = "class"
1313
or
1414
result = "method"
15+
or
16+
result = "alias"
1517
}
1618

1719
predicate hasActualResult(Location location, string element, string tag, string value) {
@@ -27,14 +29,26 @@ module TestConfig implements TestSig {
2729
EndpointNaming::classInstanceHasPrimaryName(cls, package, name)
2830
)
2931
or
30-
element = "" and
3132
exists(DataFlow::FunctionNode function |
3233
not function.getFunction() = any(ConstructorDeclaration decl | decl.isSynthetic()).getBody() and
3334
location = function.getFunction().getLocation() and
3435
tag = "method" and
3536
EndpointNaming::functionHasPrimaryName(function, package, name)
3637
)
3738
)
39+
or
40+
element = "" and
41+
tag = "alias" and
42+
exists(
43+
API::Node aliasDef, string primaryPackage, string primaryName, string aliasPackage,
44+
string aliasName
45+
|
46+
EndpointNaming::aliasDefinition(primaryPackage, primaryName, aliasPackage, aliasName, aliasDef) and
47+
value =
48+
EndpointNaming::renderName(aliasPackage, aliasName) + "==" +
49+
EndpointNaming::renderName(primaryPackage, primaryName) and
50+
location = aliasDef.asSink().asExpr().getLocation()
51+
)
3852
}
3953
}
4054

javascript/ql/test/library-tests/EndpointNaming/pack2/lib.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ class AmbiguousClass {
22
instanceMethod(foo) {} // $ method=(pack2).lib.LibClass.prototype.instanceMethod
33
} // $ class=(pack2).lib.LibClass instance=(pack2).lib.LibClass.prototype
44

5-
export default AmbiguousClass;
5+
export default AmbiguousClass; // $ alias=(pack2).lib.default==(pack2).lib.LibClass
66
export { AmbiguousClass as LibClass }

javascript/ql/test/library-tests/EndpointNaming/pack2/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class AmbiguousClass {
22
instanceMethod() {} // $ method=(pack2).MainClass.prototype.instanceMethod
33
} // $ class=(pack2).MainClass instance=(pack2).MainClass.prototype
44

5-
export default AmbiguousClass;
5+
export default AmbiguousClass; // $ alias=(pack2).default==(pack2).MainClass
66
export { AmbiguousClass as MainClass }
77

88
import * as lib from "./lib";
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export default function(x,y,z) {} // $ method=(pack3).libFunction
1+
export default function(x,y,z) {} // $ method=(pack3).libFunction alias=(pack3).libFunction.default==(pack3).libFunction

javascript/ql/test/library-tests/EndpointNaming/pack3/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
function ambiguousFunction(x, y, z) {} // $ method=(pack3).namedFunction
22

3-
export default ambiguousFunction;
3+
export default ambiguousFunction; // $ alias=(pack3).default==(pack3).namedFunction
44
export { ambiguousFunction as namedFunction };
55

66
import libFunction from "./lib";
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class Foo {} // $ class=(pack8).Foo instance=(pack8).Foo.prototype
22

33
module.exports = Foo;
4-
module.exports.default = Foo;
5-
module.exports.Foo = Foo;
4+
module.exports.default = Foo; // $ alias=(pack8).Foo.default==(pack8).Foo
5+
module.exports.Foo = Foo; // $ alias=(pack8).Foo.Foo==(pack8).Foo

0 commit comments

Comments
 (0)