Skip to content

Commit 4d9ab7b

Browse files
authored
Merge pull request #20871 from paldepind/rust/string-literal
Rust: Handle string literals with line breaks
2 parents e850a8a + 0e539db commit 4d9ab7b

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ module Impl {
6868
* [1]: https://doc.rust-lang.org/reference/tokens.html#string-literals
6969
*/
7070
class StringLiteralExpr extends LiteralExpr {
71-
StringLiteralExpr() { this.getTextValue().regexpMatch("r?#*\".*\"#*") }
71+
StringLiteralExpr() { this.getTextValue().charAt(0) = ["\"", "r"] }
7272

7373
override string getAPrimaryQlClass() { result = "StringLiteralExpr" }
7474
}

rust/ql/test/extractor-tests/literal/literal.expected

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,32 @@ stringLiteral
1616
| literal.rs:21:5:21:8 | r"R" |
1717
| literal.rs:22:5:22:11 | "\\\\x52" |
1818
| literal.rs:23:5:23:11 | r"\\x52" |
19+
| literal.rs:25:5:29:5 | "\n A normal string literal\n... |
20+
| literal.rs:31:5:34:6 | r#"\n A raw string literal\n ... |
1921
integerLiteral
20-
| literal.rs:28:5:28:7 | 123 | |
21-
| literal.rs:29:5:29:10 | 123i32 | i32 |
22-
| literal.rs:30:5:30:10 | 123u32 | u32 |
23-
| literal.rs:31:5:31:11 | 123_u32 | u32 |
24-
| literal.rs:33:5:33:8 | 0xff | |
25-
| literal.rs:34:5:34:11 | 0xff_u8 | u8 |
26-
| literal.rs:35:5:35:12 | 0x01_f32 | |
27-
| literal.rs:36:5:36:11 | 0x01_e3 | |
28-
| literal.rs:38:5:38:8 | 0o70 | |
29-
| literal.rs:39:5:39:12 | 0o70_i16 | i16 |
30-
| literal.rs:41:5:41:25 | 0b1111_1111_1001_0000 | |
31-
| literal.rs:42:5:42:28 | 0b1111_1111_1001_0000i64 | i64 |
32-
| literal.rs:43:5:43:15 | 0b________1 | |
33-
| literal.rs:45:5:45:10 | 0usize | usize |
34-
| literal.rs:48:5:49:10 | 128_i8 | i8 |
35-
| literal.rs:50:5:51:10 | 256_u8 | u8 |
22+
| literal.rs:39:5:39:7 | 123 | |
23+
| literal.rs:40:5:40:10 | 123i32 | i32 |
24+
| literal.rs:41:5:41:10 | 123u32 | u32 |
25+
| literal.rs:42:5:42:11 | 123_u32 | u32 |
26+
| literal.rs:44:5:44:8 | 0xff | |
27+
| literal.rs:45:5:45:11 | 0xff_u8 | u8 |
28+
| literal.rs:46:5:46:12 | 0x01_f32 | |
29+
| literal.rs:47:5:47:11 | 0x01_e3 | |
30+
| literal.rs:49:5:49:8 | 0o70 | |
31+
| literal.rs:50:5:50:12 | 0o70_i16 | i16 |
32+
| literal.rs:52:5:52:25 | 0b1111_1111_1001_0000 | |
33+
| literal.rs:53:5:53:28 | 0b1111_1111_1001_0000i64 | i64 |
34+
| literal.rs:54:5:54:15 | 0b________1 | |
35+
| literal.rs:56:5:56:10 | 0usize | usize |
36+
| literal.rs:59:5:60:10 | 128_i8 | i8 |
37+
| literal.rs:61:5:62:10 | 256_u8 | u8 |
3638
floatLiteral
37-
| literal.rs:56:5:56:8 | 5f32 | f32 |
38-
| literal.rs:58:5:58:12 | 123.0f64 | f64 |
39-
| literal.rs:59:5:59:10 | 0.1f64 | f64 |
40-
| literal.rs:60:5:60:10 | 0.1f32 | f32 |
41-
| literal.rs:61:5:61:14 | 12E+99_f64 | f64 |
42-
| literal.rs:62:18:62:19 | 2. | |
39+
| literal.rs:67:5:67:8 | 5f32 | f32 |
40+
| literal.rs:69:5:69:12 | 123.0f64 | f64 |
41+
| literal.rs:70:5:70:10 | 0.1f64 | f64 |
42+
| literal.rs:71:5:71:10 | 0.1f32 | f32 |
43+
| literal.rs:72:5:72:14 | 12E+99_f64 | f64 |
44+
| literal.rs:73:18:73:19 | 2. | |
4345
booleanLiteral
44-
| literal.rs:66:5:66:8 | true |
45-
| literal.rs:67:5:67:9 | false |
46+
| literal.rs:77:5:77:8 | true |
47+
| literal.rs:78:5:78:9 | false |

rust/ql/test/extractor-tests/literal/literal.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ fn string_literals() {
2121
r"R"; // R
2222
"\\x52";
2323
r"\x52"; // \x52
24+
25+
"
26+
A normal string literal
27+
across many
28+
lines
29+
";
30+
31+
r#"
32+
A raw string literal
33+
across multiple lines
34+
"#;
2435
}
2536

2637
fn integer_literals() {

0 commit comments

Comments
 (0)