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

Skip to content

Commit 9e88c67

Browse files
Add more test cases; make some fixes
1 parent aa1337d commit 9e88c67

4 files changed

Lines changed: 74 additions & 7 deletions

File tree

java/ql/lib/semmle/code/java/regex/RegexTreeView.qll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -725,9 +725,6 @@ class RegExpConstant extends RegExpTerm {
725725
not this instanceof RegExpCharacterClassEscape and
726726
// exclude chars in quantifiers
727727
// TODO: push this into regex library
728-
not exists(int qstart, int qend | re.quantifiedPart(_, qstart, qend, _, _) |
729-
qstart <= start and end <= qend
730-
) and
731728
(value = this.(RegExpNormalChar).getValue() or value = this.(RegExpQuote).getValue())
732729
}
733730

java/ql/lib/semmle/code/java/regex/regex.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ abstract class RegexString extends StringLiteral {
174174
}
175175

176176
/**
177-
* Helper predicate for `quoteSequence`.
177+
* Helper predicate for `quote`.
178178
* Holds if the char at `pos` could be the beginning of a quote delimiter, i.e. `\Q` (non-escaped) or `\E` (escaping not checked, as quote sequences turn off escapes).
179179
* Result is `true` for `\Q` and `false` for `\E`.
180180
*/
@@ -189,7 +189,7 @@ abstract class RegexString extends StringLiteral {
189189
}
190190

191191
/**
192-
* Helper predicate for `quoteSequence`.
192+
* Helper predicate for `quote`.
193193
* Holds if the char at `pos` is the one-based `index`th occourence of a quote delimiter (`\Q` or `\E`)
194194
* Result is `true` for `\Q` and `false` for `\E`.
195195
*/
@@ -343,7 +343,10 @@ abstract class RegexString extends StringLiteral {
343343
not c = "[" and
344344
not c = ")" and
345345
not c = "|" and
346-
not this.quantifier(start, _, _, _)
346+
not c = "{" and
347+
not exists(int qstart, int qend | this.quantifier(qstart, qend, _, _) |
348+
qstart <= start and start < qend
349+
)
347350
)
348351
}
349352

java/ql/test/library-tests/regex/RegexParseTests.expected

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,67 @@ parseFailures
6666
| Test.java:15:35:15:35 | 2 | [RegExpConstant,RegExpNormalChar] |
6767
| Test.java:15:36:15:36 | 3 | [RegExpConstant,RegExpNormalChar] |
6868
| Test.java:15:37:15:44 | \\k<name> | [RegExpBackRef] |
69+
| Test.java:16:10:16:10 | a | [RegExpConstant,RegExpNormalChar] |
70+
| Test.java:16:10:16:11 | a+ | [RegExpPlus] |
71+
| Test.java:16:10:16:108 | a+b*c?d{2}e{3,4}f{,5}g{6,}h+?i*?j??k{7}?l{8,9}?m{,10}?n{11,}?o++p*+q?+r{12}+s{13,14}+t{,15}+u{16,}+ | [RegExpSequence] |
72+
| Test.java:16:12:16:12 | b | [RegExpConstant,RegExpNormalChar] |
73+
| Test.java:16:12:16:13 | b* | [RegExpStar] |
74+
| Test.java:16:14:16:14 | c | [RegExpConstant,RegExpNormalChar] |
75+
| Test.java:16:14:16:15 | c? | [RegExpOpt] |
76+
| Test.java:16:16:16:16 | d | [RegExpConstant,RegExpNormalChar] |
77+
| Test.java:16:16:16:19 | d{2} | [RegExpRange] |
78+
| Test.java:16:20:16:20 | e | [RegExpConstant,RegExpNormalChar] |
79+
| Test.java:16:20:16:25 | e{3,4} | [RegExpRange] |
80+
| Test.java:16:26:16:26 | f | [RegExpConstant,RegExpNormalChar] |
81+
| Test.java:16:26:16:30 | f{,5} | [RegExpRange] |
82+
| Test.java:16:31:16:31 | g | [RegExpConstant,RegExpNormalChar] |
83+
| Test.java:16:31:16:35 | g{6,} | [RegExpRange] |
84+
| Test.java:16:36:16:36 | h | [RegExpConstant,RegExpNormalChar] |
85+
| Test.java:16:36:16:38 | h+? | [RegExpPlus] |
86+
| Test.java:16:39:16:39 | i | [RegExpConstant,RegExpNormalChar] |
87+
| Test.java:16:39:16:41 | i*? | [RegExpStar] |
88+
| Test.java:16:42:16:42 | j | [RegExpConstant,RegExpNormalChar] |
89+
| Test.java:16:42:16:44 | j?? | [RegExpOpt] |
90+
| Test.java:16:45:16:45 | k | [RegExpConstant,RegExpNormalChar] |
91+
| Test.java:16:45:16:49 | k{7}? | [RegExpQuantifier] |
92+
| Test.java:16:50:16:50 | l | [RegExpConstant,RegExpNormalChar] |
93+
| Test.java:16:50:16:56 | l{8,9}? | [RegExpQuantifier] |
94+
| Test.java:16:57:16:57 | m | [RegExpConstant,RegExpNormalChar] |
95+
| Test.java:16:57:16:63 | m{,10}? | [RegExpQuantifier] |
96+
| Test.java:16:64:16:64 | n | [RegExpConstant,RegExpNormalChar] |
97+
| Test.java:16:64:16:70 | n{11,}? | [RegExpQuantifier] |
98+
| Test.java:16:71:16:71 | o | [RegExpConstant,RegExpNormalChar] |
99+
| Test.java:16:71:16:73 | o++ | [RegExpPlus] |
100+
| Test.java:16:74:16:74 | p | [RegExpConstant,RegExpNormalChar] |
101+
| Test.java:16:74:16:76 | p*+ | [RegExpStar] |
102+
| Test.java:16:77:16:77 | q | [RegExpConstant,RegExpNormalChar] |
103+
| Test.java:16:77:16:79 | q?+ | [RegExpOpt] |
104+
| Test.java:16:80:16:80 | r | [RegExpConstant,RegExpNormalChar] |
105+
| Test.java:16:80:16:85 | r{12}+ | [RegExpQuantifier] |
106+
| Test.java:16:86:16:86 | s | [RegExpConstant,RegExpNormalChar] |
107+
| Test.java:16:86:16:94 | s{13,14}+ | [RegExpQuantifier] |
108+
| Test.java:16:95:16:95 | t | [RegExpConstant,RegExpNormalChar] |
109+
| Test.java:16:95:16:101 | t{,15}+ | [RegExpQuantifier] |
110+
| Test.java:16:102:16:102 | u | [RegExpConstant,RegExpNormalChar] |
111+
| Test.java:16:102:16:108 | u{16,}+ | [RegExpQuantifier] |
112+
| Test.java:17:10:17:13 | (?i) | [RegExpZeroWidthMatch] |
113+
| Test.java:17:10:17:35 | (?i)(?=a)(?!b)(?<=c)(?<!d) | [RegExpSequence] |
114+
| Test.java:17:14:17:18 | (?=a) | [RegExpPositiveLookahead] |
115+
| Test.java:17:17:17:17 | a | [RegExpConstant,RegExpNormalChar] |
116+
| Test.java:17:19:17:23 | (?!b) | [RegExpNegativeLookahead] |
117+
| Test.java:17:22:17:22 | b | [RegExpConstant,RegExpNormalChar] |
118+
| Test.java:17:24:17:29 | (?<=c) | [RegExpPositiveLookbehind] |
119+
| Test.java:17:28:17:28 | c | [RegExpConstant,RegExpNormalChar] |
120+
| Test.java:17:30:17:35 | (?<!d) | [RegExpNegativeLookbehind] |
121+
| Test.java:17:34:17:34 | d | [RegExpConstant,RegExpNormalChar] |
122+
| Test.java:18:10:18:10 | a | [RegExpConstant,RegExpNormalChar] |
123+
| Test.java:18:10:18:22 | a\|b\|c(d\|e)f\|g | [RegExpAlt] |
124+
| Test.java:18:12:18:12 | b | [RegExpConstant,RegExpNormalChar] |
125+
| Test.java:18:14:18:14 | c | [RegExpConstant,RegExpNormalChar] |
126+
| Test.java:18:14:18:20 | c(d\|e)f | [RegExpSequence] |
127+
| Test.java:18:15:18:19 | (d\|e) | [RegExpGroup] |
128+
| Test.java:18:16:18:16 | d | [RegExpConstant,RegExpNormalChar] |
129+
| Test.java:18:16:18:18 | d\|e | [RegExpAlt] |
130+
| Test.java:18:18:18:18 | e | [RegExpConstant,RegExpNormalChar] |
131+
| Test.java:18:20:18:20 | f | [RegExpConstant,RegExpNormalChar] |
132+
| Test.java:18:22:18:22 | g | [RegExpConstant,RegExpNormalChar] |

java/ql/test/library-tests/regex/Test.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ class Test {
1212
"\\cA",
1313
"\\c(",
1414
"\\c\\(ab)",
15-
"(?>hi)(?<name>hell*?o*+)123\\k<name>"
15+
"(?>hi)(?<name>hell*?o*+)123\\k<name>",
16+
"a+b*c?d{2}e{3,4}f{,5}g{6,}h+?i*?j??k{7}?l{8,9}?m{,10}?n{11,}?o++p*+q?+r{12}+s{13,14}+t{,15}+u{16,}+",
17+
"(?i)(?=a)(?!b)(?<=c)(?<!d)",
18+
"a|b|c(d|e)f|g"
1619
};
1720

1821
void test() {

0 commit comments

Comments
 (0)