Skip to content

Commit 13b49d9

Browse files
committed
Add tests for RegExp intersection functionality in ql.
1 parent 181e845 commit 13b49d9

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/[[abc]&&[bcd]]/v; // Valid use of intersection operator, matches b or c
2+
/abc&&bcd/v; //Valid regex, but no intersection operation: Matches the literal string "abc&&bcd"
3+
/[abc]&&[bcd]/v; // Valid regex, but incorrect intersection operation:
4+
// - Matches a single character from [abc]
5+
// - Then the literal "&&"
6+
// - Then a single character from [bcd]
7+
/[abc&&bcd]/v; // Compilation error due to invalid use of intersection operation
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
nodes
2+
| intersection.js:1:1:1:17 | [RegExpLiteral] /[[abc]&&[bcd]]/v | semmle.label | [RegExpLiteral] /[[abc]&&[bcd]]/v |
3+
| intersection.js:1:1:1:18 | [ExprStmt] /[[abc]&&[bcd]]/v; | semmle.label | [ExprStmt] /[[abc]&&[bcd]]/v; |
4+
| intersection.js:1:1:1:18 | [ExprStmt] /[[abc]&&[bcd]]/v; | semmle.order | 1 |
5+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | semmle.label | [RegExpCharacterClass] [[abc] |
6+
| intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | semmle.label | [???] [[abc]&&[bcd]] |
7+
| intersection.js:1:3:1:3 | [RegExpNormalConstant] [ | semmle.label | [RegExpNormalConstant] [ |
8+
| intersection.js:1:4:1:4 | [RegExpNormalConstant] a | semmle.label | [RegExpNormalConstant] a |
9+
| intersection.js:1:5:1:5 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
10+
| intersection.js:1:6:1:6 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
11+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | semmle.label | [RegExpCharacterClass] [bcd] |
12+
| intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | semmle.label | [RegExpSequence] [bcd]] |
13+
| intersection.js:1:11:1:11 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
14+
| intersection.js:1:12:1:12 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
15+
| intersection.js:1:13:1:13 | [RegExpNormalConstant] d | semmle.label | [RegExpNormalConstant] d |
16+
| intersection.js:1:15:1:15 | [RegExpNormalConstant] ] | semmle.label | [RegExpNormalConstant] ] |
17+
| intersection.js:2:1:2:11 | [RegExpLiteral] /abc&&bcd/v | semmle.label | [RegExpLiteral] /abc&&bcd/v |
18+
| intersection.js:2:1:2:12 | [ExprStmt] /abc&&bcd/v; | semmle.label | [ExprStmt] /abc&&bcd/v; |
19+
| intersection.js:2:1:2:12 | [ExprStmt] /abc&&bcd/v; | semmle.order | 2 |
20+
| intersection.js:2:2:2:9 | [RegExpNormalConstant] abc&&bcd | semmle.label | [RegExpNormalConstant] abc&&bcd |
21+
| intersection.js:3:1:3:15 | [RegExpLiteral] /[abc]&&[bcd]/v | semmle.label | [RegExpLiteral] /[abc]&&[bcd]/v |
22+
| intersection.js:3:1:3:16 | [ExprStmt] /[abc]&&[bcd]/v; | semmle.label | [ExprStmt] /[abc]&&[bcd]/v; |
23+
| intersection.js:3:1:3:16 | [ExprStmt] /[abc]&&[bcd]/v; | semmle.order | 3 |
24+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | semmle.label | [RegExpCharacterClass] [abc] |
25+
| intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | semmle.label | [???] [abc]&&[bcd] |
26+
| intersection.js:3:3:3:3 | [RegExpNormalConstant] a | semmle.label | [RegExpNormalConstant] a |
27+
| intersection.js:3:4:3:4 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
28+
| intersection.js:3:5:3:5 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
29+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | semmle.label | [RegExpCharacterClass] [bcd] |
30+
| intersection.js:3:10:3:10 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
31+
| intersection.js:3:11:3:11 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
32+
| intersection.js:3:12:3:12 | [RegExpNormalConstant] d | semmle.label | [RegExpNormalConstant] d |
33+
| intersection.js:7:1:7:13 | [RegExpLiteral] /[abc&&bcd]/v | semmle.label | [RegExpLiteral] /[abc&&bcd]/v |
34+
| intersection.js:7:1:7:14 | [ExprStmt] /[abc&&bcd]/v; | semmle.label | [ExprStmt] /[abc&&bcd]/v; |
35+
| intersection.js:7:1:7:14 | [ExprStmt] /[abc&&bcd]/v; | semmle.order | 4 |
36+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | semmle.label | [RegExpCharacterClass] [abc&&bcd] |
37+
| intersection.js:7:3:7:3 | [RegExpNormalConstant] a | semmle.label | [RegExpNormalConstant] a |
38+
| intersection.js:7:4:7:4 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
39+
| intersection.js:7:5:7:5 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
40+
| intersection.js:7:6:7:6 | [RegExpNormalConstant] & | semmle.label | [RegExpNormalConstant] & |
41+
| intersection.js:7:7:7:7 | [RegExpNormalConstant] & | semmle.label | [RegExpNormalConstant] & |
42+
| intersection.js:7:8:7:8 | [RegExpNormalConstant] b | semmle.label | [RegExpNormalConstant] b |
43+
| intersection.js:7:9:7:9 | [RegExpNormalConstant] c | semmle.label | [RegExpNormalConstant] c |
44+
| intersection.js:7:10:7:10 | [RegExpNormalConstant] d | semmle.label | [RegExpNormalConstant] d |
45+
edges
46+
| intersection.js:1:1:1:17 | [RegExpLiteral] /[[abc]&&[bcd]]/v | intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | semmle.label | 0 |
47+
| intersection.js:1:1:1:17 | [RegExpLiteral] /[[abc]&&[bcd]]/v | intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | semmle.order | 0 |
48+
| intersection.js:1:1:1:18 | [ExprStmt] /[[abc]&&[bcd]]/v; | intersection.js:1:1:1:17 | [RegExpLiteral] /[[abc]&&[bcd]]/v | semmle.label | 1 |
49+
| intersection.js:1:1:1:18 | [ExprStmt] /[[abc]&&[bcd]]/v; | intersection.js:1:1:1:17 | [RegExpLiteral] /[[abc]&&[bcd]]/v | semmle.order | 1 |
50+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:3:1:3 | [RegExpNormalConstant] [ | semmle.label | 0 |
51+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:3:1:3 | [RegExpNormalConstant] [ | semmle.order | 0 |
52+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:4:1:4 | [RegExpNormalConstant] a | semmle.label | 1 |
53+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:4:1:4 | [RegExpNormalConstant] a | semmle.order | 1 |
54+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:5:1:5 | [RegExpNormalConstant] b | semmle.label | 2 |
55+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:5:1:5 | [RegExpNormalConstant] b | semmle.order | 2 |
56+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:6:1:6 | [RegExpNormalConstant] c | semmle.label | 3 |
57+
| intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | intersection.js:1:6:1:6 | [RegExpNormalConstant] c | semmle.order | 3 |
58+
| intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | semmle.label | 0 |
59+
| intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | intersection.js:1:2:1:7 | [RegExpCharacterClass] [[abc] | semmle.order | 0 |
60+
| intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | semmle.label | 1 |
61+
| intersection.js:1:2:1:15 | [???] [[abc]&&[bcd]] | intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | semmle.order | 1 |
62+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:11:1:11 | [RegExpNormalConstant] b | semmle.label | 0 |
63+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:11:1:11 | [RegExpNormalConstant] b | semmle.order | 0 |
64+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:12:1:12 | [RegExpNormalConstant] c | semmle.label | 1 |
65+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:12:1:12 | [RegExpNormalConstant] c | semmle.order | 1 |
66+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:13:1:13 | [RegExpNormalConstant] d | semmle.label | 2 |
67+
| intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | intersection.js:1:13:1:13 | [RegExpNormalConstant] d | semmle.order | 2 |
68+
| intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | semmle.label | 0 |
69+
| intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | intersection.js:1:10:1:14 | [RegExpCharacterClass] [bcd] | semmle.order | 0 |
70+
| intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | intersection.js:1:15:1:15 | [RegExpNormalConstant] ] | semmle.label | 1 |
71+
| intersection.js:1:10:1:15 | [RegExpSequence] [bcd]] | intersection.js:1:15:1:15 | [RegExpNormalConstant] ] | semmle.order | 1 |
72+
| intersection.js:2:1:2:11 | [RegExpLiteral] /abc&&bcd/v | intersection.js:2:2:2:9 | [RegExpNormalConstant] abc&&bcd | semmle.label | 0 |
73+
| intersection.js:2:1:2:11 | [RegExpLiteral] /abc&&bcd/v | intersection.js:2:2:2:9 | [RegExpNormalConstant] abc&&bcd | semmle.order | 0 |
74+
| intersection.js:2:1:2:12 | [ExprStmt] /abc&&bcd/v; | intersection.js:2:1:2:11 | [RegExpLiteral] /abc&&bcd/v | semmle.label | 1 |
75+
| intersection.js:2:1:2:12 | [ExprStmt] /abc&&bcd/v; | intersection.js:2:1:2:11 | [RegExpLiteral] /abc&&bcd/v | semmle.order | 1 |
76+
| intersection.js:3:1:3:15 | [RegExpLiteral] /[abc]&&[bcd]/v | intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | semmle.label | 0 |
77+
| intersection.js:3:1:3:15 | [RegExpLiteral] /[abc]&&[bcd]/v | intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | semmle.order | 0 |
78+
| intersection.js:3:1:3:16 | [ExprStmt] /[abc]&&[bcd]/v; | intersection.js:3:1:3:15 | [RegExpLiteral] /[abc]&&[bcd]/v | semmle.label | 1 |
79+
| intersection.js:3:1:3:16 | [ExprStmt] /[abc]&&[bcd]/v; | intersection.js:3:1:3:15 | [RegExpLiteral] /[abc]&&[bcd]/v | semmle.order | 1 |
80+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:3:3:3 | [RegExpNormalConstant] a | semmle.label | 0 |
81+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:3:3:3 | [RegExpNormalConstant] a | semmle.order | 0 |
82+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:4:3:4 | [RegExpNormalConstant] b | semmle.label | 1 |
83+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:4:3:4 | [RegExpNormalConstant] b | semmle.order | 1 |
84+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:5:3:5 | [RegExpNormalConstant] c | semmle.label | 2 |
85+
| intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | intersection.js:3:5:3:5 | [RegExpNormalConstant] c | semmle.order | 2 |
86+
| intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | semmle.label | 0 |
87+
| intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | intersection.js:3:2:3:6 | [RegExpCharacterClass] [abc] | semmle.order | 0 |
88+
| intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | semmle.label | 1 |
89+
| intersection.js:3:2:3:13 | [???] [abc]&&[bcd] | intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | semmle.order | 1 |
90+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:10:3:10 | [RegExpNormalConstant] b | semmle.label | 0 |
91+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:10:3:10 | [RegExpNormalConstant] b | semmle.order | 0 |
92+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:11:3:11 | [RegExpNormalConstant] c | semmle.label | 1 |
93+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:11:3:11 | [RegExpNormalConstant] c | semmle.order | 1 |
94+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:12:3:12 | [RegExpNormalConstant] d | semmle.label | 2 |
95+
| intersection.js:3:9:3:13 | [RegExpCharacterClass] [bcd] | intersection.js:3:12:3:12 | [RegExpNormalConstant] d | semmle.order | 2 |
96+
| intersection.js:7:1:7:13 | [RegExpLiteral] /[abc&&bcd]/v | intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | semmle.label | 0 |
97+
| intersection.js:7:1:7:13 | [RegExpLiteral] /[abc&&bcd]/v | intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | semmle.order | 0 |
98+
| intersection.js:7:1:7:14 | [ExprStmt] /[abc&&bcd]/v; | intersection.js:7:1:7:13 | [RegExpLiteral] /[abc&&bcd]/v | semmle.label | 1 |
99+
| intersection.js:7:1:7:14 | [ExprStmt] /[abc&&bcd]/v; | intersection.js:7:1:7:13 | [RegExpLiteral] /[abc&&bcd]/v | semmle.order | 1 |
100+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:3:7:3 | [RegExpNormalConstant] a | semmle.label | 0 |
101+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:3:7:3 | [RegExpNormalConstant] a | semmle.order | 0 |
102+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:4:7:4 | [RegExpNormalConstant] b | semmle.label | 1 |
103+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:4:7:4 | [RegExpNormalConstant] b | semmle.order | 1 |
104+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:5:7:5 | [RegExpNormalConstant] c | semmle.label | 2 |
105+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:5:7:5 | [RegExpNormalConstant] c | semmle.order | 2 |
106+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:6:7:6 | [RegExpNormalConstant] & | semmle.label | 3 |
107+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:6:7:6 | [RegExpNormalConstant] & | semmle.order | 3 |
108+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:7:7:7 | [RegExpNormalConstant] & | semmle.label | 4 |
109+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:7:7:7 | [RegExpNormalConstant] & | semmle.order | 4 |
110+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:8:7:8 | [RegExpNormalConstant] b | semmle.label | 5 |
111+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:8:7:8 | [RegExpNormalConstant] b | semmle.order | 5 |
112+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:9:7:9 | [RegExpNormalConstant] c | semmle.label | 6 |
113+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:9:7:9 | [RegExpNormalConstant] c | semmle.order | 6 |
114+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:10:7:10 | [RegExpNormalConstant] d | semmle.label | 7 |
115+
| intersection.js:7:2:7:11 | [RegExpCharacterClass] [abc&&bcd] | intersection.js:7:10:7:10 | [RegExpNormalConstant] d | semmle.order | 7 |
116+
graphProperties
117+
| semmle.graphKind | tree |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import semmle.javascript.PrintAst

0 commit comments

Comments
 (0)