Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0e1246c

Browse files
committed
JS: Extract RegExp ASTs from string literals
1 parent 0cf191f commit 0e1246c

4 files changed

Lines changed: 18 additions & 4 deletions

File tree

javascript/extractor/src/com/semmle/js/ast/Literal.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ public boolean isRegExp() {
5959
return tokenType == TokenType.regexp;
6060
}
6161

62+
/** Is this a string literal? */
63+
public boolean isStringLiteral() {
64+
return tokenType == TokenType.string;
65+
}
66+
6267
/** The value of this literal expressed as a string. */
6368
public String getStringValue() {
6469
// regular expressions may have a null value; use the raw value instead

javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,11 @@ public Label visit(Literal nd, Context c) {
516516
String valueString = nd.getStringValue();
517517

518518
trapwriter.addTuple("literals", valueString, source, key);
519-
if (nd.isRegExp()) regexpExtractor.extract(source.substring(1, source.lastIndexOf('/')), nd);
519+
if (nd.isRegExp()) {
520+
regexpExtractor.extract(source.substring(1, source.lastIndexOf('/')), nd, false);
521+
} else if (nd.isStringLiteral()) {
522+
regexpExtractor.extract(valueString, nd, true);
523+
}
520524
return key;
521525
}
522526

javascript/extractor/src/com/semmle/js/extractor/RegExpExtractor.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,14 @@ public void visit(CharacterClassRange nd) {
341341
}
342342
}
343343

344-
public void extract(String src, Node parent) {
345-
this.literalStart = parent.getLoc().getStart();
344+
public void extract(String src, Node parent, boolean isSpeculativeParsing) {
346345
Result res = parser.parse(src);
346+
347+
if (isSpeculativeParsing && res.getErrors().size() > 0) {
348+
return;
349+
}
350+
351+
this.literalStart = parent.getLoc().getStart();
347352
RegExpTerm ast = res.getAST();
348353
new V().visit(ast, trapwriter.localID(parent), 0);
349354

javascript/ql/src/semmlecode.javascript.dbscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ regexpterm (unique int id: @regexpterm,
815815
int idx: int ref,
816816
varchar(900) tostring: string ref);
817817

818-
@regexpparent = @regexpterm | @regexpliteral;
818+
@regexpparent = @regexpterm | @regexpliteral | @stringliteral;
819819

820820
case @regexpterm.kind of
821821
0 = @regexp_alt

0 commit comments

Comments
 (0)