JavaScript: Lift call graph library to data flow graph.

This commit is contained in:
Max Schaefer
2018-07-09 09:07:42 +01:00
parent d91218e248
commit 9ba3d80bad
53 changed files with 761 additions and 115 deletions

View File

@@ -1,4 +0,0 @@
import javascript
from CallSite c
select c, c.getACallee()

View File

@@ -26,4 +26,11 @@ class OtherSub extends PseudoClass {
super();
console.log(this.x);
}
}
}
function sum(x, y, z) {
return x+y+z;
}
sum(...[1, 2, 3]);
sum(1, ...[2, 3]);
sum(1, ...[2], 3);

View File

@@ -9,10 +9,16 @@
| es2015.js:10:5:10:22 | arguments.callee() | es2015.js:8:2:12:1 | functio ... \\n };\\n} |
| es2015.js:16:5:16:11 | super() | es2015.js:2:14:4:3 | () {\\n ... ");\\n } |
| es2015.js:26:5:26:11 | super() | es2015.js:20:1:22:1 | functio ... = 42;\\n} |
| es2015.js:34:1:34:17 | sum(...[1, 2, 3]) | es2015.js:31:1:33:1 | functio ... +y+z;\\n} |
| es2015.js:35:1:35:17 | sum(1, ...[2, 3]) | es2015.js:31:1:33:1 | functio ... +y+z;\\n} |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | es2015.js:31:1:33:1 | functio ... +y+z;\\n} |
| m.js:2:1:2:11 | exports.f() | m.js:1:13:1:25 | function() {} |
| m.js:3:1:3:18 | module.exports.f() | m.js:1:13:1:25 | function() {} |
| n.js:2:1:2:5 | m.f() | m.js:1:13:1:25 | function() {} |
| n.js:5:1:5:6 | m2.f() | m2.js:2:6:2:18 | function() {} |
| reflection.js:7:1:7:22 | reflective call | reflection.js:1:1:3:1 | functio ... x+y;\\n} |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | reflection.js:5:15:5:39 | functio ... n 56; } |
| reflection.js:8:1:8:25 | reflective call | reflection.js:1:1:3:1 | functio ... x+y;\\n} |
| tst.js:6:1:6:3 | f() | tst.js:1:1:1:15 | function f() {} |
| tst.js:7:1:7:3 | g() | tst.js:2:9:2:21 | function() {} |
| tst.js:8:1:8:3 | h() | tst.js:3:5:3:17 | function() {} |
@@ -38,3 +44,5 @@
| tst.js:60:15:60:21 | new A() | tst.js:44:1:44:15 | function A() {} |
| tst.js:64:13:64:19 | new B() | tst.js:50:1:50:15 | function B() {} |
| tst.js:66:5:66:9 | b.f() | tst.js:65:11:65:23 | function() {} |
| tst.js:69:1:69:10 | globalfn() | tst3.js:1:1:1:22 | functio ... fn() {} |
| tst.js:70:1:70:11 | globalfn2() | tst3.js:2:1:2:23 | functio ... n2() {} |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode c
select c, c.getACallee()

View File

@@ -0,0 +1,18 @@
| classes.js:4:7:4:26 | console.log("Hello") | classes.js:4:19:4:25 | "Hello" |
| classes.js:14:7:14:27 | console ... ello!") | classes.js:14:19:14:26 | "Hello!" |
| es2015.js:3:5:3:21 | console.log("hi") | es2015.js:3:17:3:20 | "hi" |
| es2015.js:27:5:27:23 | console.log(this.x) | es2015.js:27:17:27:22 | this.x |
| es2015.js:35:1:35:17 | sum(1, ...[2, 3]) | es2015.js:35:5:35:5 | 1 |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | es2015.js:36:5:36:5 | 1 |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | es2015.js:36:16:36:16 | 3 |
| n.js:1:9:1:22 | require('./m') | n.js:1:17:1:21 | './m' |
| n.js:4:10:4:24 | require('./m2') | n.js:4:18:4:23 | './m2' |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | reflection.js:7:10:7:13 | null |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | reflection.js:7:16:7:17 | 23 |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | reflection.js:7:20:7:21 | 19 |
| reflection.js:7:1:7:22 | reflective call | reflection.js:7:16:7:17 | 23 |
| reflection.js:7:1:7:22 | reflective call | reflection.js:7:20:7:21 | 19 |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | reflection.js:8:11:8:14 | null |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | reflection.js:8:17:8:24 | [23, 19] |
| tst.js:22:1:22:4 | l(k) | tst.js:22:3:22:3 | k |
| tst.js:42:2:42:29 | functio ... x; }(o) | tst.js:42:28:42:28 | o |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk
select invk, invk.getAnArgument()

View File

@@ -0,0 +1,17 @@
| classes.js:4:7:4:26 | console.log("Hello") | 0 | classes.js:4:19:4:25 | "Hello" |
| classes.js:14:7:14:27 | console ... ello!") | 0 | classes.js:14:19:14:26 | "Hello!" |
| es2015.js:3:5:3:21 | console.log("hi") | 0 | es2015.js:3:17:3:20 | "hi" |
| es2015.js:27:5:27:23 | console.log(this.x) | 0 | es2015.js:27:17:27:22 | this.x |
| es2015.js:35:1:35:17 | sum(1, ...[2, 3]) | 0 | es2015.js:35:5:35:5 | 1 |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | 0 | es2015.js:36:5:36:5 | 1 |
| n.js:1:9:1:22 | require('./m') | 0 | n.js:1:17:1:21 | './m' |
| n.js:4:10:4:24 | require('./m2') | 0 | n.js:4:18:4:23 | './m2' |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | 0 | reflection.js:7:10:7:13 | null |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | 1 | reflection.js:7:16:7:17 | 23 |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | 2 | reflection.js:7:20:7:21 | 19 |
| reflection.js:7:1:7:22 | reflective call | 0 | reflection.js:7:16:7:17 | 23 |
| reflection.js:7:1:7:22 | reflective call | 1 | reflection.js:7:20:7:21 | 19 |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | 0 | reflection.js:8:11:8:14 | null |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | 1 | reflection.js:8:17:8:24 | [23, 19] |
| tst.js:22:1:22:4 | l(k) | 0 | tst.js:22:3:22:3 | k |
| tst.js:42:2:42:29 | functio ... x; }(o) | 0 | tst.js:42:28:42:28 | o |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk, int i
select invk, i, invk.getArgument(i)

View File

@@ -0,0 +1,49 @@
| a.js:2:1:2:5 | foo() | foo |
| a.js:3:1:3:5 | bar() | bar |
| a.js:4:1:4:5 | qux() | qux |
| a.js:7:1:7:5 | baz() | baz |
| classes.js:4:7:4:26 | console.log("Hello") | log |
| classes.js:8:7:8:18 | this.hello() | hello |
| classes.js:14:7:14:27 | console ... ello!") | log |
| classes.js:18:3:18:9 | new B() | B |
| classes.js:18:3:18:17 | new B().hello() | hello |
| es2015.js:3:5:3:21 | console.log("hi") | log |
| es2015.js:6:1:6:18 | new ExampleClass() | ExampleClass |
| es2015.js:10:5:10:22 | arguments.callee() | callee |
| es2015.js:27:5:27:23 | console.log(this.x) | log |
| es2015.js:34:1:34:17 | sum(...[1, 2, 3]) | sum |
| es2015.js:35:1:35:17 | sum(1, ...[2, 3]) | sum |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | sum |
| m.js:2:1:2:11 | exports.f() | f |
| m.js:3:1:3:18 | module.exports.f() | f |
| n.js:1:9:1:22 | require('./m') | require |
| n.js:2:1:2:5 | m.f() | f |
| n.js:4:10:4:24 | require('./m2') | require |
| n.js:5:1:5:6 | m2.f() | f |
| reflection.js:4:5:4:12 | sneaky() | sneaky |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | call |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | apply |
| tst.js:6:1:6:3 | f() | f |
| tst.js:7:1:7:3 | g() | g |
| tst.js:8:1:8:3 | h() | h |
| tst.js:9:1:9:3 | k() | k |
| tst.js:14:2:14:4 | m() | m |
| tst.js:15:2:15:4 | l() | l |
| tst.js:16:2:16:19 | arguments.callee() | callee |
| tst.js:17:2:17:4 | n() | n |
| tst.js:18:2:18:4 | p() | p |
| tst.js:19:2:19:4 | f() | f |
| tst.js:22:1:22:4 | l(k) | l |
| tst.js:24:1:24:7 | new f() | f |
| tst.js:25:1:25:5 | new g | g |
| tst.js:33:4:33:11 | this.g() | g |
| tst.js:41:1:41:5 | o.f() | f |
| tst.js:42:1:42:34 | (functi ... o)).f() | f |
| tst.js:46:2:46:9 | this.g() | g |
| tst.js:53:3:53:10 | this.g() | g |
| tst.js:56:17:56:29 | Math.random() | random |
| tst.js:60:15:60:21 | new A() | A |
| tst.js:64:13:64:19 | new B() | B |
| tst.js:66:5:66:9 | b.f() | f |
| tst.js:69:1:69:10 | globalfn() | globalfn |
| tst.js:70:1:70:11 | globalfn2() | globalfn2 |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk
select invk, invk.getCalleeName()

View File

@@ -0,0 +1,57 @@
| a.js:2:1:2:5 | foo() | a.js:2:1:2:3 | foo |
| a.js:3:1:3:5 | bar() | a.js:3:1:3:3 | bar |
| a.js:4:1:4:5 | qux() | a.js:4:1:4:3 | qux |
| a.js:7:1:7:5 | baz() | a.js:7:1:7:3 | baz |
| classes.js:4:7:4:26 | console.log("Hello") | classes.js:4:7:4:17 | console.log |
| classes.js:8:7:8:18 | this.hello() | classes.js:8:7:8:16 | this.hello |
| classes.js:12:21:12:20 | super(...args) | classes.js:12:21:12:20 | super |
| classes.js:14:7:14:27 | console ... ello!") | classes.js:14:7:14:17 | console.log |
| classes.js:18:3:18:9 | new B() | classes.js:18:7:18:7 | B |
| classes.js:18:3:18:17 | new B().hello() | classes.js:18:3:18:15 | new B().hello |
| es2015.js:3:5:3:21 | console.log("hi") | es2015.js:3:5:3:15 | console.log |
| es2015.js:6:1:6:18 | new ExampleClass() | es2015.js:6:5:6:16 | ExampleClass |
| es2015.js:10:5:10:22 | arguments.callee() | es2015.js:10:5:10:20 | arguments.callee |
| es2015.js:16:5:16:11 | super() | es2015.js:16:5:16:9 | super |
| es2015.js:26:5:26:11 | super() | es2015.js:26:5:26:9 | super |
| es2015.js:27:5:27:23 | console.log(this.x) | es2015.js:27:5:27:15 | console.log |
| es2015.js:34:1:34:17 | sum(...[1, 2, 3]) | es2015.js:34:1:34:3 | sum |
| es2015.js:35:1:35:17 | sum(1, ...[2, 3]) | es2015.js:35:1:35:3 | sum |
| es2015.js:36:1:36:17 | sum(1, ...[2], 3) | es2015.js:36:1:36:3 | sum |
| m.js:2:1:2:11 | exports.f() | m.js:2:1:2:9 | exports.f |
| m.js:3:1:3:18 | module.exports.f() | m.js:3:1:3:16 | module.exports.f |
| n.js:1:9:1:22 | require('./m') | n.js:1:9:1:15 | require |
| n.js:2:1:2:5 | m.f() | n.js:2:1:2:3 | m.f |
| n.js:4:10:4:24 | require('./m2') | n.js:4:10:4:16 | require |
| n.js:5:1:5:6 | m2.f() | n.js:5:1:5:4 | m2.f |
| reflection.js:4:5:4:12 | sneaky() | reflection.js:4:5:4:10 | sneaky |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | reflection.js:7:1:7:8 | add.call |
| reflection.js:7:1:7:22 | reflective call | reflection.js:7:1:7:3 | add |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | reflection.js:8:1:8:9 | add.apply |
| reflection.js:8:1:8:25 | reflective call | reflection.js:8:1:8:3 | add |
| tst.js:6:1:6:3 | f() | tst.js:6:1:6:1 | f |
| tst.js:7:1:7:3 | g() | tst.js:7:1:7:1 | g |
| tst.js:8:1:8:3 | h() | tst.js:8:1:8:1 | h |
| tst.js:9:1:9:3 | k() | tst.js:9:1:9:1 | k |
| tst.js:14:2:14:4 | m() | tst.js:14:2:14:2 | m |
| tst.js:15:2:15:4 | l() | tst.js:15:2:15:2 | l |
| tst.js:16:2:16:19 | arguments.callee() | tst.js:16:2:16:17 | arguments.callee |
| tst.js:17:2:17:4 | n() | tst.js:17:2:17:2 | n |
| tst.js:18:2:18:4 | p() | tst.js:18:2:18:2 | p |
| tst.js:19:2:19:4 | f() | tst.js:19:2:19:2 | f |
| tst.js:22:1:22:4 | l(k) | tst.js:22:1:22:1 | l |
| tst.js:24:1:24:7 | new f() | tst.js:24:5:24:5 | f |
| tst.js:25:1:25:5 | new g | tst.js:25:5:25:5 | g |
| tst.js:27:1:27:16 | (function(){})() | tst.js:27:1:27:14 | (function(){}) |
| tst.js:28:2:28:15 | function(){}() | tst.js:28:2:28:13 | function(){} |
| tst.js:33:4:33:11 | this.g() | tst.js:33:4:33:9 | this.g |
| tst.js:41:1:41:5 | o.f() | tst.js:41:1:41:3 | o.f |
| tst.js:42:1:42:34 | (functi ... o)).f() | tst.js:42:1:42:32 | (functi ... }(o)).f |
| tst.js:42:2:42:29 | functio ... x; }(o) | tst.js:42:2:42:26 | functio ... rn x; } |
| tst.js:46:2:46:9 | this.g() | tst.js:46:2:46:7 | this.g |
| tst.js:53:3:53:10 | this.g() | tst.js:53:3:53:8 | this.g |
| tst.js:56:17:56:29 | Math.random() | tst.js:56:17:56:27 | Math.random |
| tst.js:60:15:60:21 | new A() | tst.js:60:19:60:19 | A |
| tst.js:64:13:64:19 | new B() | tst.js:64:17:64:17 | B |
| tst.js:66:5:66:9 | b.f() | tst.js:66:5:66:7 | b.f |
| tst.js:69:1:69:10 | globalfn() | tst.js:69:1:69:8 | globalfn |
| tst.js:70:1:70:11 | globalfn2() | tst.js:70:1:70:9 | globalfn2 |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk
select invk, invk.getCalleeNode()

View File

@@ -0,0 +1,11 @@
| classes.js:4:7:4:26 | console.log("Hello") | classes.js:4:19:4:25 | "Hello" |
| classes.js:14:7:14:27 | console ... ello!") | classes.js:14:19:14:26 | "Hello!" |
| es2015.js:3:5:3:21 | console.log("hi") | es2015.js:3:17:3:20 | "hi" |
| es2015.js:27:5:27:23 | console.log(this.x) | es2015.js:27:17:27:22 | this.x |
| n.js:1:9:1:22 | require('./m') | n.js:1:17:1:21 | './m' |
| n.js:4:10:4:24 | require('./m2') | n.js:4:18:4:23 | './m2' |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | reflection.js:7:20:7:21 | 19 |
| reflection.js:7:1:7:22 | reflective call | reflection.js:7:20:7:21 | 19 |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | reflection.js:8:17:8:24 | [23, 19] |
| tst.js:22:1:22:4 | l(k) | tst.js:22:3:22:3 | k |
| tst.js:42:2:42:29 | functio ... x; }(o) | tst.js:42:28:42:28 | o |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk
select invk, invk.getLastArgument()

View File

@@ -0,0 +1,52 @@
| a.js:2:1:2:5 | foo() | 0 |
| a.js:3:1:3:5 | bar() | 0 |
| a.js:4:1:4:5 | qux() | 0 |
| a.js:7:1:7:5 | baz() | 0 |
| classes.js:4:7:4:26 | console.log("Hello") | 1 |
| classes.js:8:7:8:18 | this.hello() | 0 |
| classes.js:14:7:14:27 | console ... ello!") | 1 |
| classes.js:18:3:18:9 | new B() | 0 |
| classes.js:18:3:18:17 | new B().hello() | 0 |
| es2015.js:3:5:3:21 | console.log("hi") | 1 |
| es2015.js:6:1:6:18 | new ExampleClass() | 0 |
| es2015.js:10:5:10:22 | arguments.callee() | 0 |
| es2015.js:16:5:16:11 | super() | 0 |
| es2015.js:26:5:26:11 | super() | 0 |
| es2015.js:27:5:27:23 | console.log(this.x) | 1 |
| m.js:2:1:2:11 | exports.f() | 0 |
| m.js:3:1:3:18 | module.exports.f() | 0 |
| n.js:1:9:1:22 | require('./m') | 1 |
| n.js:2:1:2:5 | m.f() | 0 |
| n.js:4:10:4:24 | require('./m2') | 1 |
| n.js:5:1:5:6 | m2.f() | 0 |
| reflection.js:4:5:4:12 | sneaky() | 0 |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) | 3 |
| reflection.js:7:1:7:22 | reflective call | 2 |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) | 2 |
| tst.js:6:1:6:3 | f() | 0 |
| tst.js:7:1:7:3 | g() | 0 |
| tst.js:8:1:8:3 | h() | 0 |
| tst.js:9:1:9:3 | k() | 0 |
| tst.js:14:2:14:4 | m() | 0 |
| tst.js:15:2:15:4 | l() | 0 |
| tst.js:16:2:16:19 | arguments.callee() | 0 |
| tst.js:17:2:17:4 | n() | 0 |
| tst.js:18:2:18:4 | p() | 0 |
| tst.js:19:2:19:4 | f() | 0 |
| tst.js:22:1:22:4 | l(k) | 1 |
| tst.js:24:1:24:7 | new f() | 0 |
| tst.js:25:1:25:5 | new g | 0 |
| tst.js:27:1:27:16 | (function(){})() | 0 |
| tst.js:28:2:28:15 | function(){}() | 0 |
| tst.js:33:4:33:11 | this.g() | 0 |
| tst.js:41:1:41:5 | o.f() | 0 |
| tst.js:42:1:42:34 | (functi ... o)).f() | 0 |
| tst.js:42:2:42:29 | functio ... x; }(o) | 1 |
| tst.js:46:2:46:9 | this.g() | 0 |
| tst.js:53:3:53:10 | this.g() | 0 |
| tst.js:56:17:56:29 | Math.random() | 0 |
| tst.js:60:15:60:21 | new A() | 0 |
| tst.js:64:13:64:19 | new B() | 0 |
| tst.js:66:5:66:9 | b.f() | 0 |
| tst.js:69:1:69:10 | globalfn() | 0 |
| tst.js:70:1:70:11 | globalfn2() | 0 |

View File

@@ -0,0 +1,4 @@
import javascript
from DataFlow::InvokeNode invk
select invk, invk.getNumArgument()

View File

@@ -0,0 +1 @@
| tst.js:69:1:69:10 | globalfn() |

View File

@@ -0,0 +1,5 @@
import javascript
from DataFlow::InvokeNode invk
where invk.isImprecise()
select invk

View File

@@ -0,0 +1,30 @@
| a.js:7:1:7:5 | baz() |
| classes.js:4:7:4:26 | console.log("Hello") |
| classes.js:8:7:8:18 | this.hello() |
| classes.js:14:7:14:27 | console ... ello!") |
| classes.js:18:3:18:17 | new B().hello() |
| es2015.js:3:5:3:21 | console.log("hi") |
| es2015.js:27:5:27:23 | console.log(this.x) |
| m.js:2:1:2:11 | exports.f() |
| m.js:3:1:3:18 | module.exports.f() |
| n.js:1:9:1:22 | require('./m') |
| n.js:2:1:2:5 | m.f() |
| n.js:4:10:4:24 | require('./m2') |
| n.js:5:1:5:6 | m2.f() |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) |
| tst.js:6:1:6:3 | f() |
| tst.js:7:1:7:3 | g() |
| tst.js:9:1:9:3 | k() |
| tst.js:14:2:14:4 | m() |
| tst.js:17:2:17:4 | n() |
| tst.js:19:2:19:4 | f() |
| tst.js:24:1:24:7 | new f() |
| tst.js:25:1:25:5 | new g |
| tst.js:33:4:33:11 | this.g() |
| tst.js:41:1:41:5 | o.f() |
| tst.js:42:1:42:34 | (functi ... o)).f() |
| tst.js:46:2:46:9 | this.g() |
| tst.js:53:3:53:10 | this.g() |
| tst.js:56:17:56:29 | Math.random() |
| tst.js:66:5:66:9 | b.f() |

View File

@@ -0,0 +1,5 @@
import javascript
from DataFlow::InvokeNode invk
where invk.isIncomplete()
select invk

View File

@@ -0,0 +1,31 @@
| a.js:7:1:7:5 | baz() |
| classes.js:4:7:4:26 | console.log("Hello") |
| classes.js:8:7:8:18 | this.hello() |
| classes.js:14:7:14:27 | console ... ello!") |
| classes.js:18:3:18:17 | new B().hello() |
| es2015.js:3:5:3:21 | console.log("hi") |
| es2015.js:27:5:27:23 | console.log(this.x) |
| m.js:2:1:2:11 | exports.f() |
| m.js:3:1:3:18 | module.exports.f() |
| n.js:1:9:1:22 | require('./m') |
| n.js:2:1:2:5 | m.f() |
| n.js:4:10:4:24 | require('./m2') |
| n.js:5:1:5:6 | m2.f() |
| reflection.js:7:1:7:22 | add.cal ... 23, 19) |
| reflection.js:8:1:8:25 | add.app ... 3, 19]) |
| tst.js:6:1:6:3 | f() |
| tst.js:7:1:7:3 | g() |
| tst.js:9:1:9:3 | k() |
| tst.js:14:2:14:4 | m() |
| tst.js:17:2:17:4 | n() |
| tst.js:19:2:19:4 | f() |
| tst.js:24:1:24:7 | new f() |
| tst.js:25:1:25:5 | new g |
| tst.js:33:4:33:11 | this.g() |
| tst.js:41:1:41:5 | o.f() |
| tst.js:42:1:42:34 | (functi ... o)).f() |
| tst.js:46:2:46:9 | this.g() |
| tst.js:53:3:53:10 | this.g() |
| tst.js:56:17:56:29 | Math.random() |
| tst.js:66:5:66:9 | b.f() |
| tst.js:69:1:69:10 | globalfn() |

View File

@@ -0,0 +1,5 @@
import javascript
from DataFlow::InvokeNode invk
where invk.isUncertain()
select invk

View File

@@ -0,0 +1,8 @@
function add(x, y) {
return x+y;
}
if (sneaky())
add.apply = function() { return 56; };
add.call(null, 23, 19);
add.apply(null, [23, 19]);

View File

@@ -64,4 +64,7 @@ C.prototype.g = function() {};
var b = new B();
b.f = function() {};
b.f();
});
});
globalfn();
globalfn2();

View File

@@ -0,0 +1 @@
var globalfn = null;

View File

@@ -0,0 +1,2 @@
function globalfn() {}
function globalfn2() {}

View File

@@ -1,4 +1,4 @@
import javascript
from CallSite call
from DataFlow::InvokeNode call
select call, call.getACallee()

View File

@@ -1,5 +1,5 @@
import javascript
from NewExpr new, ClassDefinition klass
where klass.getConstructor().getInit() = new.(CallSite).getACallee()
from DataFlow::NewNode new, ClassDefinition klass
where klass.getConstructor().getInit() = new.getACallee()
select new.getFile().getBaseName(), new.getCalleeName(), klass.getFile().getBaseName(), klass.getName()