support basic generators

This commit is contained in:
Erik Krogh Kristensen
2020-08-25 14:13:15 +02:00
parent 592ed8a3a1
commit afaaea8922
3 changed files with 23 additions and 1 deletions

View File

@@ -27,6 +27,7 @@ import semmle.javascript.Extend
import semmle.javascript.Externs
import semmle.javascript.Files
import semmle.javascript.Functions
import semmle.javascript.Generators
import semmle.javascript.GlobalAccessPaths
import semmle.javascript.HTML
import semmle.javascript.HtmlSanitizers

View File

@@ -0,0 +1,21 @@
import javascript
private import semmle.javascript.dataflow.internal.PreCallGraphStep
/**
* Classes and predicates for modelling data-flow for generator functions.
*/
private module GeneratorDataFlow {
private import DataFlow::PseudoProperties
private class ArrayIteration extends PreCallGraphStep {
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
exists(DataFlow::FunctionNode f | f.getFunction().isGenerator() |
prop = iteratorElement() and
exists(YieldExpr yield | yield.getContainer() = f.getFunction() |
pred.asExpr() = yield.getOperand()
) and
succ = f.getReturnNode()
)
}
}
}

View File

@@ -6,7 +6,7 @@
yield source;
}
for (const x of gen1()) {
sink(x); // NOT OK - but not found yet [INCONSISTENCY]
sink(x); // NOT OK
}
function *gen2() {