From 08174d7ec9d0067430c57c9ca2754f6cbbd1ff98 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 6 Feb 2026 17:41:14 +0000 Subject: [PATCH] Rust: Add test cases for summaries as well. --- rust/ql/lib/codeql/files/FileSystem.qll | 9 + .../dataflow/models/external_file.rs | 30 +++ .../library-tests/dataflow/models/main.rs | 27 +-- .../dataflow/models/models.expected | 171 ++++++++++-------- .../dataflow/models/models.ext.yml | 30 ++- 5 files changed, 166 insertions(+), 101 deletions(-) create mode 100644 rust/ql/test/library-tests/dataflow/models/external_file.rs diff --git a/rust/ql/lib/codeql/files/FileSystem.qll b/rust/ql/lib/codeql/files/FileSystem.qll index ebc4085fbbb..c6237775252 100644 --- a/rust/ql/lib/codeql/files/FileSystem.qll +++ b/rust/ql/lib/codeql/files/FileSystem.qll @@ -36,6 +36,13 @@ class Folder = Impl::Folder; module Folder = Impl::Folder; +/** + * Holds if the file identified by `relativePath` should be treated as though it is external + * to the target project, even though it is within the source code directory. This is used for + * testing. + */ +extensible predicate additionalExternalFile(string relativePath); + /** A file. */ class File extends Container, Impl::File { /** @@ -44,6 +51,8 @@ class File extends Container, Impl::File { */ predicate fromSource() { exists(ExtractorStep s | s.getAction() = "Extract" and s.getFile() = this) + and + not additionalExternalFile(this.getRelativePath()) } /** diff --git a/rust/ql/test/library-tests/dataflow/models/external_file.rs b/rust/ql/test/library-tests/dataflow/models/external_file.rs new file mode 100644 index 00000000000..0e351a475d3 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/models/external_file.rs @@ -0,0 +1,30 @@ + +pub fn generated_source(i: i64) -> i64 { + 0 +} + +pub fn neutral_generated_source(i: i64) -> i64 { + 0 +} + +pub fn neutral_manual_source(i: i64) -> i64 { + 0 +} + +pub fn generated_sink(i: i64) {} + +pub fn neutral_generated_sink(i: i64) {} + +pub fn neutral_manual_sink(i: i64) {} + +pub fn generated_summary(i: i64) -> i64 { + 0 +} + +pub fn neutral_generated_summary(i: i64) -> i64 { + 0 +} + +pub fn neutral_manual_summary(i: i64) -> i64 { + 0 +} diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 34b7b9188f2..fdf79c95281 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -410,28 +410,14 @@ fn test_trait_model(x: T) { sink(x7); } -pub fn generated_source(i: i64) -> i64 { - 0 -} - -pub fn neutral_generated_source(i: i64) -> i64 { - 0 -} - -pub fn neutral_manual_source(i: i64) -> i64 { - 0 -} - -pub fn generated_sink(i: i64) {} - -pub fn neutral_generated_sink(i: i64) {} - -pub fn neutral_manual_sink(i: i64) {} +mod external_file; +use external_file::*; fn test_neutrals() { // neutral models should cause corresponding generated models to be ignored. - // Thus, the `neutral_generated_source` and `neutral_generated_sink`, which - // have both a generated and a neutral model, should not have flow. + // Thus the `neutral_generated_source`, `neutral_generated_sink` and + // `neutral_generated_summary`, which have both a generated and a neutral + // model, should not have flow. sink(generated_source(1)); // $ hasValueFlow=1 sink(neutral_generated_source(2)); @@ -439,6 +425,9 @@ fn test_neutrals() { generated_sink(source(4)); // $ hasValueFlow=4 neutral_generated_sink(source(5)); neutral_manual_sink(source(6)); // $ hasValueFlow=6 + sink(generated_summary(source(7))); // $ hasValueFlow=7 + sink(neutral_generated_summary(source(8))); // $ SPURIOUS: hasValueFlow=8 + sink(neutral_manual_summary(source(9))); // $ hasValueFlow=9 } #[tokio::main] diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 74e89ea1acd..ddbf7a594f4 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -1,14 +1,14 @@ models | 1 | Sink: ::sink; Argument[self].Field[main::MyFieldEnum::D::field_d]; test-sink | | 2 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | -| 3 | Sink: main::generated_sink; Argument[0]; test-sink | -| 4 | Sink: main::neutral_manual_sink; Argument[0]; test-sink | +| 3 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | +| 4 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | | 5 | Sink: main::simple_sink; Argument[0]; test-sink | | 6 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | | 7 | Source: main::arg_source; Argument[0]; test-source | | 8 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | -| 9 | Source: main::generated_source; ReturnValue; test-source | -| 10 | Source: main::neutral_manual_source; ReturnValue; test-source | +| 9 | Source: main::external_file::generated_source; ReturnValue; test-source | +| 10 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | | 11 | Source: main::simple_source; ReturnValue; test-source | | 12 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 13 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | @@ -17,18 +17,21 @@ models | 16 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 17 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 18 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 19 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 20 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 21 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 22 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 23 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 24 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 25 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 26 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 27 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 28 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 29 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 30 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 19 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 20 | Summary: main::external_file::neutral_generated_summary; Argument[0]; ReturnValue; value | +| 21 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 22 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 23 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 24 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 25 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 26 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 27 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 28 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 29 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 30 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 31 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 32 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 33 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -43,8 +46,8 @@ edges | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:30 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:30 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:33 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:33 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -55,8 +58,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:24 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:24 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:27 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:27 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -65,8 +68,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:29 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:29 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:32 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:32 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -83,8 +86,8 @@ edges | main.rs:87:14:87:42 | ...::C {...} [C] | main.rs:87:9:87:10 | e1 [C] | provenance | | | main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | | main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | -| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:23 | -| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:23 | +| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:26 | +| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:26 | | main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | | main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | | main.rs:99:13:99:21 | source(...) | main.rs:99:9:99:9 | s | provenance | | @@ -93,8 +96,8 @@ edges | main.rs:100:9:100:10 | e1 [D] | main.rs:101:11:101:12 | e1 [D] | provenance | | | main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | | main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | -| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:28 | -| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:28 | +| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:31 | +| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:31 | | main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | | main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | | main.rs:103:9:103:37 | ...::D {...} [D] | main.rs:103:35:103:35 | i | provenance | | @@ -111,8 +114,8 @@ edges | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | main.rs:119:9:119:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:21 | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:21 | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:24 | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:24 | | main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | | main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | | main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | s | provenance | | @@ -121,16 +124,16 @@ edges | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:26 | -| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:26 | +| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:29 | +| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:29 | | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | | main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | | main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | | main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | | main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | -| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:19 | -| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:19 | +| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:22 | +| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:22 | | main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | | main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | | main.rs:162:9:162:9 | s | main.rs:163:33:163:33 | s | provenance | | @@ -141,8 +144,8 @@ edges | main.rs:163:9:163:11 | arr [element] | main.rs:164:10:164:12 | arr [element] | provenance | | | main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | | main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | -| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:25 | -| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:25 | +| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:28 | +| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:28 | | main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:15 | | main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:15 | | main.rs:173:9:173:9 | s | main.rs:174:14:174:14 | s | provenance | | @@ -155,8 +158,8 @@ edges | main.rs:174:13:174:18 | TupleExpr [tuple.0] | main.rs:174:9:174:9 | t [tuple.0] | provenance | | | main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | | main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:22 | -| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:22 | +| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:25 | +| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:25 | | main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | | main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | | main.rs:186:13:186:22 | source(...) | main.rs:186:9:186:9 | s | provenance | | @@ -165,8 +168,8 @@ edges | main.rs:187:9:187:9 | t [tuple.1] | main.rs:189:10:189:10 | t [tuple.1] | provenance | | | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | -| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:27 | -| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:27 | +| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:30 | +| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:30 | | main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | | main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | | main.rs:201:9:201:9 | s | main.rs:206:11:206:11 | s | provenance | | @@ -217,8 +220,8 @@ edges | main.rs:230:13:230:31 | get_async_number(...) [future] | main.rs:230:13:230:37 | await ... | provenance | | | main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | | main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | -| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:20 | -| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:20 | +| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:23 | +| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:23 | | main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | | main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | | main.rs:250:13:250:23 | enum_source | main.rs:250:13:250:27 | enum_source(...) [D] | provenance | Src:MaD:8 | @@ -323,14 +326,20 @@ edges | main.rs:406:9:406:10 | x6 | main.rs:407:10:407:11 | x6 | provenance | | | main.rs:406:14:406:23 | source(...) | main.rs:406:14:406:27 | ... < ... | provenance | MaD:14 | | main.rs:406:14:406:27 | ... < ... | main.rs:406:9:406:10 | x6 | provenance | | -| main.rs:436:10:436:25 | generated_source | main.rs:436:10:436:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | -| main.rs:436:10:436:25 | generated_source | main.rs:436:10:436:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | -| main.rs:438:10:438:30 | neutral_manual_source | main.rs:438:10:438:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | -| main.rs:438:10:438:30 | neutral_manual_source | main.rs:438:10:438:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | -| main.rs:439:20:439:28 | source(...) | main.rs:439:5:439:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:439:20:439:28 | source(...) | main.rs:439:5:439:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:441:25:441:33 | source(...) | main.rs:441:5:441:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | -| main.rs:441:25:441:33 | source(...) | main.rs:441:5:441:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | +| main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | +| main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | +| main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | +| main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | +| main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | +| main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | +| main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | provenance | MaD:19 | +| main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | provenance | MaD:19 | +| main.rs:429:36:429:44 | source(...) | main.rs:429:10:429:45 | neutral_generated_summary(...) | provenance | MaD:20 | +| main.rs:429:36:429:44 | source(...) | main.rs:429:10:429:45 | neutral_generated_summary(...) | provenance | MaD:20 | +| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:21 | +| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:21 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -684,22 +693,34 @@ nodes | main.rs:406:14:406:23 | source(...) | semmle.label | source(...) | | main.rs:406:14:406:27 | ... < ... | semmle.label | ... < ... | | main.rs:407:10:407:11 | x6 | semmle.label | x6 | -| main.rs:436:10:436:25 | generated_source | semmle.label | generated_source | -| main.rs:436:10:436:25 | generated_source | semmle.label | generated_source | -| main.rs:436:10:436:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:436:10:436:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:438:10:438:30 | neutral_manual_source | semmle.label | neutral_manual_source | -| main.rs:438:10:438:30 | neutral_manual_source | semmle.label | neutral_manual_source | -| main.rs:438:10:438:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:438:10:438:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:439:5:439:18 | generated_sink | semmle.label | generated_sink | -| main.rs:439:5:439:18 | generated_sink | semmle.label | generated_sink | -| main.rs:439:20:439:28 | source(...) | semmle.label | source(...) | -| main.rs:439:20:439:28 | source(...) | semmle.label | source(...) | -| main.rs:441:5:441:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | -| main.rs:441:5:441:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | -| main.rs:441:25:441:33 | source(...) | semmle.label | source(...) | -| main.rs:441:25:441:33 | source(...) | semmle.label | source(...) | +| main.rs:422:10:422:25 | generated_source | semmle.label | generated_source | +| main.rs:422:10:422:25 | generated_source | semmle.label | generated_source | +| main.rs:422:10:422:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:422:10:422:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:424:10:424:30 | neutral_manual_source | semmle.label | neutral_manual_source | +| main.rs:424:10:424:30 | neutral_manual_source | semmle.label | neutral_manual_source | +| main.rs:424:10:424:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:424:10:424:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:425:5:425:18 | generated_sink | semmle.label | generated_sink | +| main.rs:425:5:425:18 | generated_sink | semmle.label | generated_sink | +| main.rs:425:20:425:28 | source(...) | semmle.label | source(...) | +| main.rs:425:20:425:28 | source(...) | semmle.label | source(...) | +| main.rs:427:5:427:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | +| main.rs:427:5:427:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | +| main.rs:427:25:427:33 | source(...) | semmle.label | source(...) | +| main.rs:427:25:427:33 | source(...) | semmle.label | source(...) | +| main.rs:428:10:428:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:428:10:428:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:428:28:428:36 | source(...) | semmle.label | source(...) | +| main.rs:428:28:428:36 | source(...) | semmle.label | source(...) | +| main.rs:429:10:429:45 | neutral_generated_summary(...) | semmle.label | neutral_generated_summary(...) | +| main.rs:429:10:429:45 | neutral_generated_summary(...) | semmle.label | neutral_generated_summary(...) | +| main.rs:429:36:429:44 | source(...) | semmle.label | source(...) | +| main.rs:429:36:429:44 | source(...) | semmle.label | source(...) | +| main.rs:430:10:430:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:430:10:430:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:430:33:430:41 | source(...) | semmle.label | source(...) | +| main.rs:430:33:430:41 | source(...) | semmle.label | source(...) | subpaths | main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | | main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | @@ -771,11 +792,17 @@ invalidSpecComponent | main.rs:401:10:401:11 | x4 | main.rs:400:14:400:23 | source(...) | main.rs:401:10:401:11 | x4 | $@ | main.rs:400:14:400:23 | source(...) | source(...) | | main.rs:404:10:404:11 | x5 | main.rs:403:14:403:23 | source(...) | main.rs:404:10:404:11 | x5 | $@ | main.rs:403:14:403:23 | source(...) | source(...) | | main.rs:407:10:407:11 | x6 | main.rs:406:14:406:23 | source(...) | main.rs:407:10:407:11 | x6 | $@ | main.rs:406:14:406:23 | source(...) | source(...) | -| main.rs:436:10:436:28 | generated_source(...) | main.rs:436:10:436:25 | generated_source | main.rs:436:10:436:28 | generated_source(...) | $@ | main.rs:436:10:436:25 | generated_source | generated_source | -| main.rs:436:10:436:28 | generated_source(...) | main.rs:436:10:436:25 | generated_source | main.rs:436:10:436:28 | generated_source(...) | $@ | main.rs:436:10:436:25 | generated_source | generated_source | -| main.rs:438:10:438:33 | neutral_manual_source(...) | main.rs:438:10:438:30 | neutral_manual_source | main.rs:438:10:438:33 | neutral_manual_source(...) | $@ | main.rs:438:10:438:30 | neutral_manual_source | neutral_manual_source | -| main.rs:438:10:438:33 | neutral_manual_source(...) | main.rs:438:10:438:30 | neutral_manual_source | main.rs:438:10:438:33 | neutral_manual_source(...) | $@ | main.rs:438:10:438:30 | neutral_manual_source | neutral_manual_source | -| main.rs:439:5:439:18 | generated_sink | main.rs:439:20:439:28 | source(...) | main.rs:439:5:439:18 | generated_sink | $@ | main.rs:439:20:439:28 | source(...) | source(...) | -| main.rs:439:5:439:18 | generated_sink | main.rs:439:20:439:28 | source(...) | main.rs:439:5:439:18 | generated_sink | $@ | main.rs:439:20:439:28 | source(...) | source(...) | -| main.rs:441:5:441:23 | neutral_manual_sink | main.rs:441:25:441:33 | source(...) | main.rs:441:5:441:23 | neutral_manual_sink | $@ | main.rs:441:25:441:33 | source(...) | source(...) | -| main.rs:441:5:441:23 | neutral_manual_sink | main.rs:441:25:441:33 | source(...) | main.rs:441:5:441:23 | neutral_manual_sink | $@ | main.rs:441:25:441:33 | source(...) | source(...) | +| main.rs:422:10:422:28 | generated_source(...) | main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | $@ | main.rs:422:10:422:25 | generated_source | generated_source | +| main.rs:422:10:422:28 | generated_source(...) | main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | $@ | main.rs:422:10:422:25 | generated_source | generated_source | +| main.rs:424:10:424:33 | neutral_manual_source(...) | main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | $@ | main.rs:424:10:424:30 | neutral_manual_source | neutral_manual_source | +| main.rs:424:10:424:33 | neutral_manual_source(...) | main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | $@ | main.rs:424:10:424:30 | neutral_manual_source | neutral_manual_source | +| main.rs:425:5:425:18 | generated_sink | main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | $@ | main.rs:425:20:425:28 | source(...) | source(...) | +| main.rs:425:5:425:18 | generated_sink | main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | $@ | main.rs:425:20:425:28 | source(...) | source(...) | +| main.rs:427:5:427:23 | neutral_manual_sink | main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | $@ | main.rs:427:25:427:33 | source(...) | source(...) | +| main.rs:427:5:427:23 | neutral_manual_sink | main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | $@ | main.rs:427:25:427:33 | source(...) | source(...) | +| main.rs:428:10:428:37 | generated_summary(...) | main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | $@ | main.rs:428:28:428:36 | source(...) | source(...) | +| main.rs:428:10:428:37 | generated_summary(...) | main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | $@ | main.rs:428:28:428:36 | source(...) | source(...) | +| main.rs:429:10:429:45 | neutral_generated_summary(...) | main.rs:429:36:429:44 | source(...) | main.rs:429:10:429:45 | neutral_generated_summary(...) | $@ | main.rs:429:36:429:44 | source(...) | source(...) | +| main.rs:429:10:429:45 | neutral_generated_summary(...) | main.rs:429:36:429:44 | source(...) | main.rs:429:10:429:45 | neutral_generated_summary(...) | $@ | main.rs:429:36:429:44 | source(...) | source(...) | +| main.rs:430:10:430:42 | neutral_manual_summary(...) | main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | $@ | main.rs:430:33:430:41 | source(...) | source(...) | +| main.rs:430:10:430:42 | neutral_manual_summary(...) | main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | $@ | main.rs:430:33:430:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index de84c6d1497..4e3377881a3 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -8,9 +8,9 @@ extensions: - ["::source", "ReturnValue.Field[main::MyFieldEnum::C::field_c]", "test-source", "manual"] - ["main::arg_source", "Argument[0]", "test-source", "manual"] - ["main::source_into_function::pass_source", "Argument[1].Parameter[0]", "test-source", "manual"] - - ["main::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. - - ["main::neutral_generated_source", "ReturnValue", "test-source", "dfc-generated"] - - ["main::neutral_manual_source", "ReturnValue", "test-source", "manual"] + - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. + - ["main::external_file::neutral_generated_source", "ReturnValue", "test-source", "dfc-generated"] + - ["main::external_file::neutral_manual_source", "ReturnValue", "test-source", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel @@ -18,9 +18,9 @@ extensions: - ["main::simple_sink", "Argument[0]", "test-sink", "manual"] - ["main::enum_sink", "Argument[0].Field[main::MyFieldEnum::C::field_c]", "test-sink", "manual"] - ["::sink", "Argument[self].Field[main::MyFieldEnum::D::field_d]", "test-sink", "manual"] - - ["main::generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - - ["main::neutral_generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - - ["main::neutral_manual_sink", "Argument[0]", "test-sink", "manual"] + - ["main::external_file::generated_sink", "Argument[0]", "test-sink", "dfc-generated"] + - ["main::external_file::neutral_generated_sink", "Argument[0]", "test-sink", "dfc-generated"] + - ["main::external_file::neutral_manual_sink", "Argument[0]", "test-sink", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel @@ -45,11 +45,21 @@ extensions: - ["<_ as core::cmp::PartialOrd>::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrites the generic trait model for i32 - ["::lt", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] + - ["main::external_file::neutral_generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] + - ["main::external_file::neutral_manual_summary", "Argument[0]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel data: - - ["main::neutral_generated_source", "source", "manual"] - - ["main::neutral_manual_source", "source", "manual"] - - ["main::neutral_generated_sink", "sink", "manual"] - - ["main::neutral_manual_sink", "sink", "manual"] + - ["main::external_file::neutral_generated_source", "source", "manual"] + - ["main::external_file::neutral_manual_source", "source", "manual"] + - ["main::external_file::neutral_generated_sink", "sink", "manual"] + - ["main::external_file::neutral_manual_sink", "sink", "manual"] + - ["main::external_file::neutral_generated_summary", "summary", "manual"] + - ["main::external_file::neutral_manual_summary", "summary", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: additionalExternalFile + data: + - ["external_file.rs"]