From 52b35ef08e222d8545ad687402b604189e94ad1a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 10:08:22 +0000 Subject: [PATCH] Commit 2: Adapt Ruby regex library to compile against C++ Changes from verbatim Ruby baseline (Commit 1) to compilable C++: ParseRegExp.qll: - Remove: private import codeql.ruby.AST as Ast - Remove: private import codeql.Locations - Add: private import semmle.code.cpp.exprs.Literal - Change RegExp base: Ast::StringlikeLiteral -> StringLiteral - Replace getText(): removes getConstantValue() Ruby accessor, uses getValue() (C++ StringLiteral.getValue() returns the string content, analogous to Ruby's getConstantValue().getString()) RegexTreeView.qll: - Remove Ruby-specific imports (codeql.ruby.AST, codeql.Locations, codeql.regex.nfa.NfaUtils) - Add: private import semmle.code.cpp.exprs.Literal - Keep: codeql.util.Numbers (for parseHexInt in RegExpEscape.getUnicode()) - Keep: codeql.regex.RegexTreeView (satisfies RegexTreeViewSig) - Change getParsedRegExp: Ast::RegExpLiteral -> StringLiteral - Simplify hasLocationInfo to use re.getLocation() directly with +1 offset for opening quote (approximate; fixed in commits 8-9) - Replace isExcluded: remove hasFreeSpacingFlag(), use none() - Ruby dialect features preserved unchanged (\\A, \\z, \\G, \\h, etc.); dialect shift is commit 5 Test queries: - parse.ql, regexp.ql: replace codeql.ruby.Regexp with semmle.code.cpp.regex.RegexTreeView - .expected cleared (no test.cpp until commit 3) Verified: both queries compile successfully with codeql query compile. --- .../semmle/code/cpp/regex/RegexTreeView.qll | 51 +- .../code/cpp/regex/internal/ParseRegExp.qll | 20 +- .../test/library-tests/regex/parse.expected | 489 ------------------ cpp/ql/test/library-tests/regex/parse.ql | 4 +- .../test/library-tests/regex/regexp.expected | 270 ---------- cpp/ql/test/library-tests/regex/regexp.ql | 11 +- 6 files changed, 33 insertions(+), 812 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 1c9caca4b06..7b41d663ab2 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1,22 +1,17 @@ /** * Provides a class hierarchy corresponding to a parse tree of C++ regular expressions. - * - * This file is a verbatim copy of the Ruby RegExpTreeView.qll, with only the - * file-header comment updated. It does not yet compile against C++. */ private import internal.ParseRegExp private import codeql.util.Numbers -private import codeql.ruby.ast.Literal as Ast -private import codeql.Locations -private import codeql.regex.nfa.NfaUtils as NfaUtils +private import semmle.code.cpp.exprs.Literal private import codeql.regex.RegexTreeView // exporting as RegexTreeView, and in the top-level scope. import Impl as RegexTreeView import Impl /** Gets the parse tree resulting from parsing `re`, if such has been constructed. */ -RegExpTerm getParsedRegExp(Ast::RegExpLiteral re) { +RegExpTerm getParsedRegExp(StringLiteral re) { result.getRegExp() = re and result.isRootTerm() } @@ -60,7 +55,7 @@ private newtype TRegExpParent = re.namedCharacterProperty(start, end, _) } -/** An implementation that statisfies the RegexTreeView signature. */ +/** An implementation that satisfies the RegexTreeView signature. */ private module Impl implements RegexTreeViewSig { /** * An element containing a regular expression term, that is, either @@ -216,24 +211,18 @@ private module Impl implements RegexTreeViewSig { */ Location getLocation() { result = re.getLocation() } - pragma[noinline] - private predicate componentHasLocationInfo( - int i, string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - re.getComponent(i) - .getLocation() - .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Holds if this term is found at the specified location offsets. */ + /** Holds if this term is found at the specified location offsets. + * + * Note: for commit 2, this uses an approximate offset of 1 for the + * opening delimiter. Commits 8-9 fix this for all string literal forms. + */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn ) { exists(int re_start | - this.componentHasLocationInfo(0, filepath, startline, re_start, _, _) and - this.componentHasLocationInfo(re.getNumberOfComponents() - 1, filepath, _, _, endline, _) and - startcolumn = re_start + start and - endcolumn = re_start + end - 1 + re.getLocation().hasLocationInfo(filepath, startline, re_start, endline, _) and + startcolumn = re_start + 1 + start and + endcolumn = re_start + 1 + end - 1 ) } @@ -317,7 +306,7 @@ private module Impl implements RegexTreeViewSig { result.getEnd() = part_end } - /** Hols if this term may match an unlimited number of times. */ + /** Holds if this term may match an unlimited number of times. */ predicate mayRepeatForever() { may_repeat_forever = true } /** Gets the qualifier for this term. That is e.g "?" for "a?". */ @@ -665,9 +654,9 @@ private module Impl implements RegexTreeViewSig { * * Examples: * - * ```rb - * /[a-fA-F0-9]/ - * /[^abc]/ + * ```cpp + * "[a-fA-F0-9]" + * "[^abc]" * ``` */ class RegExpCharacterClass extends RegExpTerm, TRegExpCharacterClass { @@ -1119,7 +1108,7 @@ private module Impl implements RegexTreeViewSig { * * ``` * \1 - * (?P=quote) + * \k * ``` */ class RegExpBackRef extends RegExpTerm, TRegExpBackRef { @@ -1200,9 +1189,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if the regular expression should not be considered. */ - predicate isExcluded(RegExpParent parent) { - parent.(RegExpTerm).getRegExp().(Ast::RegExpLiteral).hasFreeSpacingFlag() // exclude free-spacing mode regexes - } + predicate isExcluded(RegExpParent parent) { none() } /** * Holds if `term` is a possessive quantifier. @@ -1212,13 +1199,13 @@ private module Impl implements RegexTreeViewSig { /** * Holds if the regex that `term` is part of is used in a way that ignores any leading prefix of the input it's matched against. - * Not yet implemented for Ruby. + * Not yet implemented for C++. */ predicate matchesAnyPrefix(RegExpTerm term) { any() } /** * Holds if the regex that `term` is part of is used in a way that ignores any trailing suffix of the input it's matched against. - * Not yet implemented for Ruby. + * Not yet implemented for C++. */ predicate matchesAnySuffix(RegExpTerm term) { any() } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 2fe643307a4..d34ec10eb53 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -3,20 +3,16 @@ * * N.B. does not yet handle stripping whitespace and comments in regexes with * the `x` (free-spacing) flag. - * - * This file is a verbatim copy of the Ruby ParseRegExp.qll, with only the - * file-header comment updated. It does not yet compile against C++. */ -private import codeql.ruby.AST as Ast -private import codeql.Locations +private import semmle.code.cpp.exprs.Literal /** - * A `StringlikeLiteral` containing a regular expression term, that is, either + * A C++ string literal that contains a regular expression term, that is, either * a regular expression literal, or a string literal used in a context where - * it is parsed as regular expression. + * it is parsed as a regular expression. */ -abstract class RegExp extends Ast::StringlikeLiteral { +abstract class RegExp extends StringLiteral { /** * Holds if this `RegExp` has the `s` flag for multi-line matching. */ @@ -256,12 +252,8 @@ abstract class RegExp extends Ast::StringlikeLiteral { this.getChar(pos) != "\\" and result = false } - /** Gets the text of this regex */ - string getText() { - exists(Ast::ConstantValue c | c = this.getConstantValue() | - result = [this.getConstantValue().getString(), this.getConstantValue().getRegExp()] - ) - } + /** Gets the text of this regex (the value of the string literal). */ + string getText() { result = this.getValue() } /** Gets the `i`th character of this regex */ string getChar(int i) { result = this.getText().charAt(i) } diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 3df78cdb4fb..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,489 +0,0 @@ -regexp.rb: -# 5| [RegExpConstant, RegExpNormalChar] abc - -# 8| [RegExpConstant, RegExpNormalChar] a - -# 8| [RegExpStar] a* -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 8| [RegExpSequence] a*b+c?d -#-----| 0 -> [RegExpStar] a* -#-----| 1 -> [RegExpPlus] b+ -#-----| 2 -> [RegExpOpt] c? -#-----| 3 -> [RegExpConstant, RegExpNormalChar] d - -# 8| [RegExpConstant, RegExpNormalChar] b - -# 8| [RegExpPlus] b+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b - -# 8| [RegExpConstant, RegExpNormalChar] c - -# 8| [RegExpOpt] c? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] c - -# 8| [RegExpConstant, RegExpNormalChar] d - -# 9| [RegExpConstant, RegExpNormalChar] a - -# 9| [RegExpRange] a{4,8} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 10| [RegExpConstant, RegExpNormalChar] a - -# 10| [RegExpRange] a{,8} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 11| [RegExpConstant, RegExpNormalChar] a - -# 11| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 12| [RegExpConstant, RegExpNormalChar] a - -# 12| [RegExpRange] a{7} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 15| [RegExpConstant, RegExpNormalChar] foo - -# 15| [RegExpAlt] foo|bar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar - -# 15| [RegExpConstant, RegExpNormalChar] bar - -# 18| [RegExpCharacterClass] [abc] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 18| [RegExpConstant, RegExpNormalChar] a - -# 18| [RegExpConstant, RegExpNormalChar] b - -# 18| [RegExpConstant, RegExpNormalChar] c - -# 19| [RegExpCharacterClass] [a-fA-F0-9_] -#-----| 0 -> [RegExpCharacterRange] a-f -#-----| 1 -> [RegExpCharacterRange] A-F -#-----| 2 -> [RegExpCharacterRange] 0-9 -#-----| 3 -> [RegExpConstant, RegExpNormalChar] _ - -# 19| [RegExpConstant, RegExpNormalChar] a - -# 19| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f - -# 19| [RegExpConstant, RegExpNormalChar] f - -# 19| [RegExpConstant, RegExpNormalChar] A - -# 19| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F - -# 19| [RegExpConstant, RegExpNormalChar] F - -# 19| [RegExpConstant, RegExpNormalChar] 0 - -# 19| [RegExpCharacterRange] 0-9 -#-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 -#-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 - -# 19| [RegExpConstant, RegExpNormalChar] 9 - -# 19| [RegExpConstant, RegExpNormalChar] _ - -# 20| [RegExpCaret] \A - -# 20| [RegExpSequence] \A[+-]?\d+ -#-----| 0 -> [RegExpCaret] \A -#-----| 1 -> [RegExpOpt] [+-]? -#-----| 2 -> [RegExpPlus] \d+ - -# 20| [RegExpCharacterClass] [+-] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] + -#-----| 1 -> [RegExpConstant, RegExpNormalChar] - - -# 20| [RegExpOpt] [+-]? -#-----| 0 -> [RegExpCharacterClass] [+-] - -# 20| [RegExpConstant, RegExpNormalChar] + - -# 20| [RegExpConstant, RegExpNormalChar] - - -# 20| [RegExpCharacterClassEscape] \d - -# 20| [RegExpPlus] \d+ -#-----| 0 -> [RegExpCharacterClassEscape] \d - -# 21| [RegExpCharacterClass] [\w] -#-----| 0 -> [RegExpCharacterClassEscape] \w - -# 21| [RegExpPlus] [\w]+ -#-----| 0 -> [RegExpCharacterClass] [\w] - -# 21| [RegExpCharacterClassEscape] \w - -# 22| [RegExpConstant, RegExpEscape] \[ - -# 22| [RegExpSequence] \[\][123] -#-----| 0 -> [RegExpConstant, RegExpEscape] \[ -#-----| 1 -> [RegExpConstant, RegExpEscape] \] -#-----| 2 -> [RegExpCharacterClass] [123] - -# 22| [RegExpConstant, RegExpEscape] \] - -# 22| [RegExpCharacterClass] [123] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 -#-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 -#-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 - -# 22| [RegExpConstant, RegExpNormalChar] 1 - -# 22| [RegExpConstant, RegExpNormalChar] 2 - -# 22| [RegExpConstant, RegExpNormalChar] 3 - -# 23| [RegExpCharacterClass] [^A-Z] -#-----| 0 -> [RegExpCharacterRange] A-Z - -# 23| [RegExpConstant, RegExpNormalChar] A - -# 23| [RegExpCharacterRange] A-Z -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] Z - -# 23| [RegExpConstant, RegExpNormalChar] Z - -# 24| [RegExpCharacterClass] []] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] - -# 24| [RegExpConstant, RegExpNormalChar] ] - -# 25| [RegExpCharacterClass] [^]] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] - -# 25| [RegExpConstant, RegExpNormalChar] ] - -# 26| [RegExpCharacterClass] [^-] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] - - -# 26| [RegExpConstant, RegExpNormalChar] - - -# 27| [RegExpCharacterClass] [|] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] | - -# 27| [RegExpConstant, RegExpNormalChar] | - -# 30| [RegExpCharacterClass] [[a-f] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] [ -#-----| 1 -> [RegExpCharacterRange] a-f - -# 30| [RegExpSequence] [[a-f]A-F] -#-----| 0 -> [RegExpCharacterClass] [[a-f] -#-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] - -# 30| [RegExpConstant, RegExpNormalChar] [ - -# 30| [RegExpConstant, RegExpNormalChar] a - -# 30| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f - -# 30| [RegExpConstant, RegExpNormalChar] f - -# 30| [RegExpConstant, RegExpNormalChar] A-F] - -# 33| [RegExpDot] . - -# 33| [RegExpStar] .* -#-----| 0 -> [RegExpDot] . - -# 34| [RegExpDot] . - -# 34| [RegExpStar] .* -#-----| 0 -> [RegExpDot] . - -# 35| [RegExpCharacterClassEscape] \w - -# 35| [RegExpPlus] \w+ -#-----| 0 -> [RegExpCharacterClassEscape] \w - -# 35| [RegExpSequence] \w+\W -#-----| 0 -> [RegExpPlus] \w+ -#-----| 1 -> [RegExpCharacterClassEscape] \W - -# 35| [RegExpCharacterClassEscape] \W - -# 36| [RegExpCharacterClassEscape] \s - -# 36| [RegExpSequence] \s\S -#-----| 0 -> [RegExpCharacterClassEscape] \s -#-----| 1 -> [RegExpCharacterClassEscape] \S - -# 36| [RegExpCharacterClassEscape] \S - -# 37| [RegExpCharacterClassEscape] \d - -# 37| [RegExpSequence] \d\D -#-----| 0 -> [RegExpCharacterClassEscape] \d -#-----| 1 -> [RegExpCharacterClassEscape] \D - -# 37| [RegExpCharacterClassEscape] \D - -# 38| [RegExpCharacterClassEscape] \h - -# 38| [RegExpSequence] \h\H -#-----| 0 -> [RegExpCharacterClassEscape] \h -#-----| 1 -> [RegExpCharacterClassEscape] \H - -# 38| [RegExpCharacterClassEscape] \H - -# 39| [RegExpConstant, RegExpEscape] \n - -# 39| [RegExpSequence] \n\r\t -#-----| 0 -> [RegExpConstant, RegExpEscape] \n -#-----| 1 -> [RegExpConstant, RegExpEscape] \r -#-----| 2 -> [RegExpConstant, RegExpEscape] \t - -# 39| [RegExpConstant, RegExpEscape] \r - -# 39| [RegExpConstant, RegExpEscape] \t - -# 42| [RegExpSpecialChar] \G - -# 42| [RegExpSequence] \Gabc -#-----| 0 -> [RegExpSpecialChar] \G -#-----| 1 -> [RegExpConstant, RegExpNormalChar] abc - -# 42| [RegExpConstant, RegExpNormalChar] abc - -# 43| [RegExpSpecialChar] \b - -# 43| [RegExpSequence] \b!a\B -#-----| 0 -> [RegExpSpecialChar] \b -#-----| 1 -> [RegExpConstant, RegExpNormalChar] !a -#-----| 2 -> [RegExpNonWordBoundary] \B - -# 43| [RegExpConstant, RegExpNormalChar] !a - -# 43| [RegExpNonWordBoundary] \B - -# 46| [RegExpGroup] (foo) -#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo - -# 46| [RegExpStar] (foo)* -#-----| 0 -> [RegExpGroup] (foo) - -# 46| [RegExpSequence] (foo)*bar -#-----| 0 -> [RegExpStar] (foo)* -#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar - -# 46| [RegExpConstant, RegExpNormalChar] foo - -# 46| [RegExpConstant, RegExpNormalChar] bar - -# 47| [RegExpConstant, RegExpNormalChar] fo - -# 47| [RegExpSequence] fo(o|b)ar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] fo -#-----| 1 -> [RegExpGroup] (o|b) -#-----| 2 -> [RegExpConstant, RegExpNormalChar] ar - -# 47| [RegExpGroup] (o|b) -#-----| 0 -> [RegExpAlt] o|b - -# 47| [RegExpConstant, RegExpNormalChar] o - -# 47| [RegExpAlt] o|b -#-----| 0 -> [RegExpConstant, RegExpNormalChar] o -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b - -# 47| [RegExpConstant, RegExpNormalChar] b - -# 47| [RegExpConstant, RegExpNormalChar] ar - -# 48| [RegExpGroup] (a|b|cd) -#-----| 0 -> [RegExpAlt] a|b|cd - -# 48| [RegExpSequence] (a|b|cd)e -#-----| 0 -> [RegExpGroup] (a|b|cd) -#-----| 1 -> [RegExpConstant, RegExpNormalChar] e - -# 48| [RegExpConstant, RegExpNormalChar] a - -# 48| [RegExpAlt] a|b|cd -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] cd - -# 48| [RegExpConstant, RegExpNormalChar] b - -# 48| [RegExpConstant, RegExpNormalChar] cd - -# 48| [RegExpConstant, RegExpNormalChar] e - -# 49| [RegExpGroup] (?::+) -#-----| 0 -> [RegExpPlus] :+ - -# 49| [RegExpSequence] (?::+)\w -#-----| 0 -> [RegExpGroup] (?::+) -#-----| 1 -> [RegExpCharacterClassEscape] \w - -# 49| [RegExpConstant, RegExpNormalChar] : - -# 49| [RegExpPlus] :+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] : - -# 49| [RegExpCharacterClassEscape] \w - -# 52| [RegExpGroup] (?\w+) -#-----| 0 -> [RegExpPlus] \w+ - -# 52| [RegExpCharacterClassEscape] \w - -# 52| [RegExpPlus] \w+ -#-----| 0 -> [RegExpCharacterClassEscape] \w - -# 53| [RegExpGroup] (?'foo'fo+) -#-----| 0 -> [RegExpSequence] fo+ - -# 53| [RegExpConstant, RegExpNormalChar] f - -# 53| [RegExpSequence] fo+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] f -#-----| 1 -> [RegExpPlus] o+ - -# 53| [RegExpConstant, RegExpNormalChar] o - -# 53| [RegExpPlus] o+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] o - -# 56| [RegExpGroup] (a+) -#-----| 0 -> [RegExpPlus] a+ - -# 56| [RegExpSequence] (a+)b+\1 -#-----| 0 -> [RegExpGroup] (a+) -#-----| 1 -> [RegExpPlus] b+ -#-----| 2 -> [RegExpBackRef] \1 - -# 56| [RegExpConstant, RegExpNormalChar] a - -# 56| [RegExpPlus] a+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - -# 56| [RegExpConstant, RegExpNormalChar] b - -# 56| [RegExpPlus] b+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b - -# 56| [RegExpBackRef] \1 - -# 57| [RegExpGroup] (?q+) -#-----| 0 -> [RegExpPlus] q+ - -# 57| [RegExpSequence] (?q+)\s+\k+ -#-----| 0 -> [RegExpGroup] (?q+) -#-----| 1 -> [RegExpPlus] \s+ -#-----| 2 -> [RegExpPlus] \k+ - -# 57| [RegExpConstant, RegExpNormalChar] q - -# 57| [RegExpPlus] q+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] q - -# 57| [RegExpCharacterClassEscape] \s - -# 57| [RegExpPlus] \s+ -#-----| 0 -> [RegExpCharacterClassEscape] \s - -# 57| [RegExpBackRef] \k - -# 57| [RegExpPlus] \k+ -#-----| 0 -> [RegExpBackRef] \k - -# 60| [RegExpNamedCharacterProperty] \p{Word} - -# 60| [RegExpStar] \p{Word}* -#-----| 0 -> [RegExpNamedCharacterProperty] \p{Word} - -# 61| [RegExpNamedCharacterProperty] \P{Digit} - -# 61| [RegExpPlus] \P{Digit}+ -#-----| 0 -> [RegExpNamedCharacterProperty] \P{Digit} - -# 62| [RegExpNamedCharacterProperty] \p{^Alnum} - -# 62| [RegExpRange] \p{^Alnum}{2,3} -#-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} - -# 63| [RegExpCharacterClass] [a-f\p{Digit}] -#-----| 0 -> [RegExpCharacterRange] a-f -#-----| 1 -> [RegExpNamedCharacterProperty] \p{Digit} - -# 63| [RegExpPlus] [a-f\p{Digit}]+ -#-----| 0 -> [RegExpCharacterClass] [a-f\p{Digit}] - -# 63| [RegExpConstant, RegExpNormalChar] a - -# 63| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f - -# 63| [RegExpConstant, RegExpNormalChar] f - -# 63| [RegExpNamedCharacterProperty] \p{Digit} - -# 66| [RegExpCharacterClass] [[:alpha:]] -#-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] - -# 66| [RegExpSequence] [[:alpha:]][[:digit:]] -#-----| 0 -> [RegExpCharacterClass] [[:alpha:]] -#-----| 1 -> [RegExpCharacterClass] [[:digit:]] - -# 66| [RegExpNamedCharacterProperty] [:alpha:] - -# 66| [RegExpCharacterClass] [[:digit:]] -#-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] - -# 66| [RegExpNamedCharacterProperty] [:digit:] - -# 69| [RegExpCharacterClass] [[:alpha:][:digit:]] -#-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -#-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] - -# 69| [RegExpNamedCharacterProperty] [:alpha:] - -# 69| [RegExpNamedCharacterProperty] [:digit:] - -# 72| [RegExpCharacterClass] [A-F[:digit:]a-f] -#-----| 0 -> [RegExpCharacterRange] A-F -#-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -#-----| 2 -> [RegExpCharacterRange] a-f - -# 72| [RegExpConstant, RegExpNormalChar] A - -# 72| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F - -# 72| [RegExpConstant, RegExpNormalChar] F - -# 72| [RegExpNamedCharacterProperty] [:digit:] - -# 72| [RegExpConstant, RegExpNormalChar] a - -# 72| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f - -# 72| [RegExpConstant, RegExpNormalChar] f - -# 75| [RegExpNamedCharacterProperty] [:digit:] - -# 79| [RegExpConstant, RegExpNormalChar] abc - -# 82| [RegExpConstant, RegExpEscape] \u{987 diff --git a/cpp/ql/test/library-tests/regex/parse.ql b/cpp/ql/test/library-tests/regex/parse.ql index 9bc804ada4d..0f0ec152132 100644 --- a/cpp/ql/test/library-tests/regex/parse.ql +++ b/cpp/ql/test/library-tests/regex/parse.ql @@ -2,8 +2,8 @@ * @kind graph */ -import codeql.Locations -import codeql.ruby.Regexp as RE +import cpp +import semmle.code.cpp.regex.RegexTreeView as RE query predicate nodes(RE::RegExpTerm n, string attr, string val) { attr = "semmle.label" and diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e464b5ce5ea..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,270 +0,0 @@ -groupName -| regexp.rb:52:2:52:11 | (?\\w+) | id | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | foo | -| regexp.rb:57:2:57:11 | (?q+) | qux | -groupNumber -| regexp.rb:46:2:46:6 | (foo) | 1 | -| regexp.rb:47:4:47:8 | (o\|b) | 1 | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | 1 | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | 1 | -| regexp.rb:56:2:56:5 | (a+) | 1 | -term -| regexp.rb:5:2:5:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:3 | a* | RegExpStar | -| regexp.rb:8:2:8:8 | a*b+c?d | RegExpSequence | -| regexp.rb:8:4:8:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:4:8:5 | b+ | RegExpPlus | -| regexp.rb:8:6:8:6 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:6:8:7 | c? | RegExpOpt | -| regexp.rb:8:8:8:8 | d | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:7 | a{4,8} | RegExpRange | -| regexp.rb:10:2:10:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:10:2:10:6 | a{,8} | RegExpRange | -| regexp.rb:11:2:11:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:11:2:11:6 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | -| regexp.rb:12:2:12:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:12:2:12:5 | a{7} | RegExpRange | -| regexp.rb:15:2:15:4 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:15:2:15:8 | foo\|bar | RegExpAlt | -| regexp.rb:15:6:15:8 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:2:18:6 | [abc] | RegExpCharacterClass | -| regexp.rb:18:3:18:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:4:18:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:5:18:5 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:2:19:13 | [a-fA-F0-9_] | RegExpCharacterClass | -| regexp.rb:19:3:19:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:3:19:5 | a-f | RegExpCharacterRange | -| regexp.rb:19:5:19:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:6 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:8 | A-F | RegExpCharacterRange | -| regexp.rb:19:8:19:8 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:9 | 0 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:11 | 0-9 | RegExpCharacterRange | -| regexp.rb:19:11:19:11 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:12:19:12 | _ | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:2:20:3 | \\A | RegExpCaret | -| regexp.rb:20:2:20:11 | \\A[+-]?\\d+ | RegExpSequence | -| regexp.rb:20:4:20:7 | [+-] | RegExpCharacterClass | -| regexp.rb:20:4:20:8 | [+-]? | RegExpOpt | -| regexp.rb:20:5:20:5 | + | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:6:20:6 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:9:20:10 | \\d | RegExpCharacterClassEscape | -| regexp.rb:20:9:20:11 | \\d+ | RegExpPlus | -| regexp.rb:21:2:21:5 | [\\w] | RegExpCharacterClass | -| regexp.rb:21:2:21:6 | [\\w]+ | RegExpPlus | -| regexp.rb:21:3:21:4 | \\w | RegExpCharacterClassEscape | -| regexp.rb:22:2:22:3 | \\[ | RegExpConstant,RegExpEscape | -| regexp.rb:22:2:22:10 | \\[\\][123] | RegExpSequence | -| regexp.rb:22:4:22:5 | \\] | RegExpConstant,RegExpEscape | -| regexp.rb:22:6:22:10 | [123] | RegExpCharacterClass | -| regexp.rb:22:7:22:7 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:8:22:8 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:9:22:9 | 3 | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:2:23:7 | [^A-Z] | RegExpCharacterClass | -| regexp.rb:23:4:23:4 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:4:23:6 | A-Z | RegExpCharacterRange | -| regexp.rb:23:6:23:6 | Z | RegExpConstant,RegExpNormalChar | -| regexp.rb:24:2:24:4 | []] | RegExpCharacterClass | -| regexp.rb:24:3:24:3 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:25:2:25:5 | [^]] | RegExpCharacterClass | -| regexp.rb:25:4:25:4 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:26:2:26:5 | [^-] | RegExpCharacterClass | -| regexp.rb:26:4:26:4 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:27:2:27:4 | [\|] | RegExpCharacterClass | -| regexp.rb:27:3:27:3 | \| | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:2:30:7 | [[a-f] | RegExpCharacterClass | -| regexp.rb:30:2:30:11 | [[a-f]A-F] | RegExpSequence | -| regexp.rb:30:3:30:3 | [ | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:4 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:6 | a-f | RegExpCharacterRange | -| regexp.rb:30:6:30:6 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:8:30:11 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.rb:33:2:33:2 | . | RegExpDot | -| regexp.rb:33:2:33:3 | .* | RegExpStar | -| regexp.rb:34:2:34:2 | . | RegExpDot | -| regexp.rb:34:2:34:3 | .* | RegExpStar | -| regexp.rb:35:2:35:3 | \\w | RegExpCharacterClassEscape | -| regexp.rb:35:2:35:4 | \\w+ | RegExpPlus | -| regexp.rb:35:2:35:6 | \\w+\\W | RegExpSequence | -| regexp.rb:35:5:35:6 | \\W | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:3 | \\s | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:5 | \\s\\S | RegExpSequence | -| regexp.rb:36:4:36:5 | \\S | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:3 | \\d | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:5 | \\d\\D | RegExpSequence | -| regexp.rb:37:4:37:5 | \\D | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:3 | \\h | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:5 | \\h\\H | RegExpSequence | -| regexp.rb:38:4:38:5 | \\H | RegExpCharacterClassEscape | -| regexp.rb:39:2:39:3 | \\n | RegExpConstant,RegExpEscape | -| regexp.rb:39:2:39:7 | \\n\\r\\t | RegExpSequence | -| regexp.rb:39:4:39:5 | \\r | RegExpConstant,RegExpEscape | -| regexp.rb:39:6:39:7 | \\t | RegExpConstant,RegExpEscape | -| regexp.rb:42:2:42:3 | \\G | RegExpSpecialChar | -| regexp.rb:42:2:42:6 | \\Gabc | RegExpSequence | -| regexp.rb:42:4:42:6 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:2:43:3 | \\b | RegExpSpecialChar | -| regexp.rb:43:2:43:7 | \\b!a\\B | RegExpSequence | -| regexp.rb:43:4:43:5 | !a | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:6:43:7 | \\B | RegExpNonWordBoundary | -| regexp.rb:46:2:46:6 | (foo) | RegExpGroup | -| regexp.rb:46:2:46:7 | (foo)* | RegExpStar | -| regexp.rb:46:2:46:10 | (foo)*bar | RegExpSequence | -| regexp.rb:46:3:46:5 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:46:8:46:10 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:3 | fo | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:10 | fo(o\|b)ar | RegExpSequence | -| regexp.rb:47:4:47:8 | (o\|b) | RegExpGroup | -| regexp.rb:47:5:47:5 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:5:47:7 | o\|b | RegExpAlt | -| regexp.rb:47:7:47:7 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:9:47:10 | ar | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | RegExpGroup | -| regexp.rb:48:2:48:10 | (a\|b\|cd)e | RegExpSequence | -| regexp.rb:48:3:48:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:3:48:8 | a\|b\|cd | RegExpAlt | -| regexp.rb:48:5:48:5 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:7:48:8 | cd | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:10:48:10 | e | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:2:49:7 | (?::+) | RegExpGroup | -| regexp.rb:49:2:49:9 | (?::+)\\w | RegExpSequence | -| regexp.rb:49:5:49:5 | : | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:5:49:6 | :+ | RegExpPlus | -| regexp.rb:49:8:49:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:2:52:11 | (?\\w+) | RegExpGroup | -| regexp.rb:52:8:52:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:8:52:10 | \\w+ | RegExpPlus | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | RegExpGroup | -| regexp.rb:53:9:53:9 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:9:53:11 | fo+ | RegExpSequence | -| regexp.rb:53:10:53:10 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:10:53:11 | o+ | RegExpPlus | -| regexp.rb:56:2:56:5 | (a+) | RegExpGroup | -| regexp.rb:56:2:56:9 | (a+)b+\\1 | RegExpSequence | -| regexp.rb:56:3:56:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:3:56:4 | a+ | RegExpPlus | -| regexp.rb:56:6:56:6 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:6:56:7 | b+ | RegExpPlus | -| regexp.rb:56:8:56:9 | \\1 | RegExpBackRef | -| regexp.rb:57:2:57:11 | (?q+) | RegExpGroup | -| regexp.rb:57:2:57:22 | (?q+)\\s+\\k+ | RegExpSequence | -| regexp.rb:57:9:57:9 | q | RegExpConstant,RegExpNormalChar | -| regexp.rb:57:9:57:10 | q+ | RegExpPlus | -| regexp.rb:57:12:57:13 | \\s | RegExpCharacterClassEscape | -| regexp.rb:57:12:57:14 | \\s+ | RegExpPlus | -| regexp.rb:57:15:57:21 | \\k | RegExpBackRef | -| regexp.rb:57:15:57:22 | \\k+ | RegExpPlus | -| regexp.rb:60:2:60:9 | \\p{Word} | RegExpNamedCharacterProperty | -| regexp.rb:60:2:60:10 | \\p{Word}* | RegExpStar | -| regexp.rb:61:2:61:10 | \\P{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:61:2:61:11 | \\P{Digit}+ | RegExpPlus | -| regexp.rb:62:2:62:11 | \\p{^Alnum} | RegExpNamedCharacterProperty | -| regexp.rb:62:2:62:16 | \\p{^Alnum}{2,3} | RegExpRange | -| regexp.rb:63:2:63:15 | [a-f\\p{Digit}] | RegExpCharacterClass | -| regexp.rb:63:2:63:16 | [a-f\\p{Digit}]+ | RegExpPlus | -| regexp.rb:63:3:63:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:3:63:5 | a-f | RegExpCharacterRange | -| regexp.rb:63:5:63:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:6:63:14 | \\p{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:66:2:66:12 | [[:alpha:]] | RegExpCharacterClass | -| regexp.rb:66:2:66:23 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.rb:66:3:66:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:66:13:66:23 | [[:digit:]] | RegExpCharacterClass | -| regexp.rb:66:14:66:22 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:69:2:69:21 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.rb:69:3:69:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:69:12:69:20 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:2:72:18 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.rb:72:3:72:3 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:3:72:5 | A-F | RegExpCharacterRange | -| regexp.rb:72:5:72:5 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:6:72:14 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:15:72:15 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:15:72:17 | a-f | RegExpCharacterRange | -| regexp.rb:72:17:72:17 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:75:2:75:10 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:79:2:79:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:82:2:82:7 | \\u{987 | RegExpConstant,RegExpEscape | -regExpNormalCharValue -| regexp.rb:5:2:5:4 | abc | abc | -| regexp.rb:8:2:8:2 | a | a | -| regexp.rb:8:4:8:4 | b | b | -| regexp.rb:8:6:8:6 | c | c | -| regexp.rb:8:8:8:8 | d | d | -| regexp.rb:9:2:9:2 | a | a | -| regexp.rb:10:2:10:2 | a | a | -| regexp.rb:11:2:11:2 | a | a | -| regexp.rb:12:2:12:2 | a | a | -| regexp.rb:15:2:15:4 | foo | foo | -| regexp.rb:15:6:15:8 | bar | bar | -| regexp.rb:18:3:18:3 | a | a | -| regexp.rb:18:4:18:4 | b | b | -| regexp.rb:18:5:18:5 | c | c | -| regexp.rb:19:3:19:3 | a | a | -| regexp.rb:19:5:19:5 | f | f | -| regexp.rb:19:6:19:6 | A | A | -| regexp.rb:19:8:19:8 | F | F | -| regexp.rb:19:9:19:9 | 0 | 0 | -| regexp.rb:19:11:19:11 | 9 | 9 | -| regexp.rb:19:12:19:12 | _ | _ | -| regexp.rb:20:5:20:5 | + | + | -| regexp.rb:20:6:20:6 | - | - | -| regexp.rb:20:9:20:10 | \\d | d | -| regexp.rb:21:3:21:4 | \\w | w | -| regexp.rb:22:2:22:3 | \\[ | [ | -| regexp.rb:22:4:22:5 | \\] | ] | -| regexp.rb:22:7:22:7 | 1 | 1 | -| regexp.rb:22:8:22:8 | 2 | 2 | -| regexp.rb:22:9:22:9 | 3 | 3 | -| regexp.rb:23:4:23:4 | A | A | -| regexp.rb:23:6:23:6 | Z | Z | -| regexp.rb:24:3:24:3 | ] | ] | -| regexp.rb:25:4:25:4 | ] | ] | -| regexp.rb:26:4:26:4 | - | - | -| regexp.rb:27:3:27:3 | \| | \| | -| regexp.rb:30:3:30:3 | [ | [ | -| regexp.rb:30:4:30:4 | a | a | -| regexp.rb:30:6:30:6 | f | f | -| regexp.rb:30:8:30:11 | A-F] | A-F] | -| regexp.rb:35:2:35:3 | \\w | w | -| regexp.rb:35:5:35:6 | \\W | W | -| regexp.rb:36:2:36:3 | \\s | s | -| regexp.rb:36:4:36:5 | \\S | S | -| regexp.rb:37:2:37:3 | \\d | d | -| regexp.rb:37:4:37:5 | \\D | D | -| regexp.rb:38:2:38:3 | \\h | h | -| regexp.rb:38:4:38:5 | \\H | H | -| regexp.rb:39:2:39:3 | \\n | \n | -| regexp.rb:39:4:39:5 | \\r | \r | -| regexp.rb:39:6:39:7 | \\t | \t | -| regexp.rb:42:4:42:6 | abc | abc | -| regexp.rb:43:4:43:5 | !a | !a | -| regexp.rb:46:3:46:5 | foo | foo | -| regexp.rb:46:8:46:10 | bar | bar | -| regexp.rb:47:2:47:3 | fo | fo | -| regexp.rb:47:5:47:5 | o | o | -| regexp.rb:47:7:47:7 | b | b | -| regexp.rb:47:9:47:10 | ar | ar | -| regexp.rb:48:3:48:3 | a | a | -| regexp.rb:48:5:48:5 | b | b | -| regexp.rb:48:7:48:8 | cd | cd | -| regexp.rb:48:10:48:10 | e | e | -| regexp.rb:49:5:49:5 | : | : | -| regexp.rb:49:8:49:9 | \\w | w | -| regexp.rb:52:8:52:9 | \\w | w | -| regexp.rb:53:9:53:9 | f | f | -| regexp.rb:53:10:53:10 | o | o | -| regexp.rb:56:3:56:3 | a | a | -| regexp.rb:56:6:56:6 | b | b | -| regexp.rb:57:9:57:9 | q | q | -| regexp.rb:57:12:57:13 | \\s | s | -| regexp.rb:63:3:63:3 | a | a | -| regexp.rb:63:5:63:5 | f | f | -| regexp.rb:72:3:72:3 | A | A | -| regexp.rb:72:5:72:5 | F | F | -| regexp.rb:72:15:72:15 | a | a | -| regexp.rb:72:17:72:17 | f | f | -| regexp.rb:79:2:79:4 | abc | abc | -| regexp.rb:82:2:82:7 | \\u{987 | \u0987 | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index 90fd09ab1be..0b56d2f10b8 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -1,11 +1,12 @@ -import codeql.ruby.Regexp +import cpp +import semmle.code.cpp.regex.RegexTreeView as RE -query predicate groupName(RegExpGroup g, string name) { name = g.getName() } +query predicate groupName(RE::RegExpGroup g, string name) { name = g.getName() } -query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() } +query predicate groupNumber(RE::RegExpGroup g, int number) { number = g.getNumber() } -query predicate term(RegExpTerm term, string c) { c = term.getPrimaryQlClasses() } +query predicate term(RE::RegExpTerm term, string c) { c = term.getPrimaryQlClasses() } -query predicate regExpNormalCharValue(RegExpNormalChar term, string value) { +query predicate regExpNormalCharValue(RE::RegExpNormalChar term, string value) { value = term.getValue() }