diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index d31d9229c49..4b83b029c78 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -138,18 +138,22 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { summaryModel(path, input_, output_, kind, p, madId) and f.getCanonicalPath() = path | - this = f and isExact_ = true and p_ = p + this = f and + isExact_ = true and + p_ = p and + // Do not apply generated models where there is a neutral model + not ( + p_.isGenerated() and + neutralModel(path, "summary", _, _) + ) or this.implements(f) and isExact_ = false and // making inherited models generated means that source code definitions and // exact generated models take precedence p_ = "hq-generated" and - // Only apply generated models (including inherited models) when no neutral model exists - not ( - p_.isGenerated() and - neutralModel(path, "summary", _, _) - ) + // Do not apply inherited models where there is a neutral model + not neutralModel(path, "summary", _, _) ) } diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index fdf79c95281..61e5928636d 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -426,7 +426,7 @@ fn test_neutrals() { 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_generated_summary(source(8))); sink(neutral_manual_summary(source(9))); // $ hasValueFlow=9 } diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index ddbf7a594f4..e5ea563eaef 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -18,20 +18,19 @@ models | 17 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 18 | Summary: main::coerce; Argument[0]; ReturnValue; taint | | 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 | +| 20 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 21 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 22 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 23 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 24 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 25 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 26 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 27 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 28 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 29 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 30 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 31 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 32 | 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 | | @@ -46,8 +45,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:33 | -| 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:32 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:32 | | 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 | | @@ -58,8 +57,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:27 | -| 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:26 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:26 | | 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 | | @@ -68,8 +67,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:32 | -| 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:31 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:31 | | 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 | | @@ -86,8 +85,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:26 | -| 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:25 | +| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:25 | | 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 | | @@ -96,8 +95,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:31 | -| 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:30 | +| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:30 | | 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 | | @@ -114,8 +113,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: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:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:23 | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:23 | | 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 | | @@ -124,16 +123,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:29 | -| 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:28 | +| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:28 | | 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:22 | -| 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:21 | +| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:21 | | 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 | | @@ -144,8 +143,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:28 | -| 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:27 | +| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:27 | | 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 | | @@ -158,8 +157,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:25 | -| 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:24 | +| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:24 | | 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 | | @@ -168,8 +167,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:30 | -| 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:29 | +| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:29 | | 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 | | @@ -220,8 +219,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:23 | -| 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:22 | +| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:22 | | 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 | @@ -336,10 +335,8 @@ edges | 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 | +| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:20 | +| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:20 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -713,10 +710,6 @@ nodes | 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(...) | @@ -802,7 +795,5 @@ invalidSpecComponent | 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(...) |