mirror of
https://github.com/github/codeql.git
synced 2026-05-02 04:05:14 +02:00
JavaScript: Teach API graphs to handle promisify.
Following a suggestion by Asger, we track use nodes through calls to `promisify`. When we see a call to a promisified function, we introduce a new synthetic API-graph node representing the callback argument synthesised by the promisification, and track the result of the call to an `await` (or other promise resolution), which is then considered to be a use of the first parameter of the synthetic callback (the zeroth parameter being an error code, which we do not model yet).
This commit is contained in:
@@ -0,0 +1 @@
|
||||
import ApiGraphs.VerifyAssertions
|
||||
28
javascript/ql/test/ApiGraphs/promisify/index.js
Normal file
28
javascript/ql/test/ApiGraphs/promisify/index.js
Normal file
@@ -0,0 +1,28 @@
|
||||
var bluebird = require("bluebird");
|
||||
var readFile = require("fs").readFile;
|
||||
|
||||
var readFileAsync = bluebird.promisify(readFile);
|
||||
|
||||
readFile(
|
||||
"tst.txt", // def (parameter 0 (member readFile (member exports (module fs))))
|
||||
"utf8", // def (parameter 1 (member readFile (member exports (module fs))))
|
||||
function (
|
||||
err, // use (parameter 0 (parameter 2 (member readFile (member exports (module fs)))))
|
||||
contents // use (parameter 1 (parameter 2 (member readFile (member exports (module fs)))))
|
||||
) { });
|
||||
|
||||
readFileAsync(
|
||||
"tst.txt" // def (parameter 0 (member readFile (member exports (module fs))))
|
||||
).then(
|
||||
function (buf) { } // use (parameter 1 (parameter 1 (member readFile (member exports (module fs)))))
|
||||
).catch(
|
||||
function (err) { } // not yet modelled: (parameter 0 (parameter 1 (member readFile (member exports (module fs)))))
|
||||
);
|
||||
|
||||
try {
|
||||
let p = readFileAsync(
|
||||
"tst.txt", // def (parameter 0 (member readFile (member exports (module fs))))
|
||||
"utf8" // def (parameter 1 (member readFile (member exports (module fs))))
|
||||
);
|
||||
let data = await p; // use (parameter 1 (parameter 2 (member readFile (member exports (module fs)))))
|
||||
} catch (e) { } // not yet modelled: (parameter 0 (parameter 2 (member readFile (member exports (module fs)))))
|
||||
6
javascript/ql/test/ApiGraphs/promisify/package.json
Normal file
6
javascript/ql/test/ApiGraphs/promisify/package.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "promisify-test",
|
||||
"dependencies": {
|
||||
"bluebird": "*"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user