From 6b7d5d29024788a45b3424c09d649fb5ba909a58 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 29 Sep 2025 09:12:36 +0200 Subject: [PATCH 01/82] Rust: Add models for actix-web --- .../rust/frameworks/actix-web.model.yml | 13 + .../dataflow/sources/InlineFlow.expected | 885 +++++++++--------- .../dataflow/sources/TaintSources.expected | 32 + .../dataflow/sources/web_frameworks.rs | 24 +- 4 files changed, 519 insertions(+), 435 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml new file mode 100644 index 00000000000..8600336651a --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + - ["::to", "Argument[0].Parameter[0..7]", "remote", "manual"] + # Actix attributes such as `get` expand to this `to` call on the handler. + - ["::to", "Argument[0].Parameter[0..7]", "remote", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::into_inner", "Argument[self]", "ReturnValue", "taint", "manual"] \ No newline at end of file diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index e0855a5d854..d97a8d8657b 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -2,144 +2,147 @@ models | 1 | Source: <_ as warp::filter::Filter>::and_then; Argument[0].Parameter[0..7]; remote | | 2 | Source: <_ as warp::filter::Filter>::map; Argument[0].Parameter[0..7]; remote | | 3 | Source: <_ as warp::filter::Filter>::then; Argument[0].Parameter[0..7]; remote | -| 4 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 5 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 6 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 7 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 8 | Source: ::file_name; ReturnValue; file | -| 9 | Source: ::path; ReturnValue; file | -| 10 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 11 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 12 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 13 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 14 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 15 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 16 | Source: ::file_name; ReturnValue; file | -| 17 | Source: ::path; ReturnValue; file | -| 18 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 19 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 20 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 21 | Source: std::env::args; ReturnValue.Element; commandargs | -| 22 | Source: std::env::args_os; ReturnValue.Element; commandargs | -| 23 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | -| 24 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | -| 25 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | -| 26 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 27 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | -| 28 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 29 | Source: std::fs::read; ReturnValue; file | -| 30 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 31 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 32 | Source: std::fs::read_to_string; ReturnValue; file | -| 33 | Source: std::io::stdio::stdin; ReturnValue; stdin | -| 34 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 35 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 36 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 37 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 38 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 40 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 41 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 42 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 43 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | -| 44 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 45 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 46 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 47 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 48 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 49 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 50 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 51 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 52 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 53 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 54 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | -| 55 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | -| 56 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | -| 57 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 58 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | -| 59 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | -| 60 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 61 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 62 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 63 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 64 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 65 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 66 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | -| 67 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 68 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 69 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | -| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | -| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 74 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 75 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 76 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 77 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 78 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 79 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 80 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 81 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 82 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 83 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 84 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | -| 85 | Summary: ::new; Argument[0]; ReturnValue; value | -| 86 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 87 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 88 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 89 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 90 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 91 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 92 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 93 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 94 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 95 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 96 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 97 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 98 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 99 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 100 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 101 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 102 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | -| 103 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 104 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 105 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | -| 106 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 107 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 108 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 109 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 110 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 111 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | -| 112 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | -| 113 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 114 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 115 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 116 | Summary: ::lock; Argument[self]; ReturnValue; taint | -| 117 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 118 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 119 | Summary: ::as_path; Argument[self]; ReturnValue; value | -| 120 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 121 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 122 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 123 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 124 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | -| 125 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | -| 126 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +| 4 | Source: ::to; Argument[0].Parameter[0..7]; remote | +| 5 | Source: ::to; Argument[0].Parameter[0..7]; remote | +| 6 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 7 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 8 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 9 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 10 | Source: ::file_name; ReturnValue; file | +| 11 | Source: ::path; ReturnValue; file | +| 12 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 13 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 14 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 15 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 16 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 17 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 18 | Source: ::file_name; ReturnValue; file | +| 19 | Source: ::path; ReturnValue; file | +| 20 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 21 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 22 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 23 | Source: std::env::args; ReturnValue.Element; commandargs | +| 24 | Source: std::env::args_os; ReturnValue.Element; commandargs | +| 25 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 26 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 27 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | +| 28 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | +| 29 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | +| 30 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 31 | Source: std::fs::read; ReturnValue; file | +| 32 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 33 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 34 | Source: std::fs::read_to_string; ReturnValue; file | +| 35 | Source: std::io::stdio::stdin; ReturnValue; stdin | +| 36 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 37 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 38 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 39 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | +| 40 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 42 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 43 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 44 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 45 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 46 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 47 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 48 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 49 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 50 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 51 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 52 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 53 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 54 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 55 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | +| 56 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | +| 57 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | +| 58 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | +| 59 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | +| 60 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | +| 61 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | +| 62 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | +| 63 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 64 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 65 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 66 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 67 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 68 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | +| 69 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 70 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 71 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | +| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | +| 74 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 75 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 76 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 77 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 78 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 79 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 80 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 81 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | +| 82 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 83 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 84 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 85 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 86 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 87 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | +| 88 | Summary: ::new; Argument[0]; ReturnValue; value | +| 89 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 90 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 91 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 92 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 93 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 94 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 95 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 96 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 97 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 98 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 99 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 100 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 101 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 102 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 103 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 104 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 105 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | +| 106 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 107 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 108 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | +| 109 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 110 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 111 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 112 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 113 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 114 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | +| 115 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | +| 116 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 117 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 118 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 119 | Summary: ::lock; Argument[self]; ReturnValue; taint | +| 120 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 121 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 122 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 123 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 124 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 125 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 126 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 127 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | +| 128 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | +| 129 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | edges -| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:26 | -| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:27 | +| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:28 | +| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:29 | | test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | | -| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:26 | -| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:86 | +| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:28 | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:89 | | test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | | | test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | | -| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:27 | -| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:82 | +| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:29 | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:85 | | test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | | -| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:21 | -| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:41 | +| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:23 | +| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:43 | | test.rs:29:29:29:54 | ... .collect() [element] | test.rs:29:9:29:12 | args [element] | provenance | | | test.rs:30:9:30:15 | my_path [&ref] | test.rs:36:10:36:16 | my_path | provenance | | | test.rs:30:19:30:26 | &... [&ref] | test.rs:30:9:30:15 | my_path [&ref] | provenance | | @@ -150,89 +153,89 @@ edges | test.rs:31:17:31:20 | args [element] | test.rs:31:17:31:23 | args[1] | provenance | | | test.rs:31:17:31:23 | args[1] | test.rs:31:16:31:23 | &... [&ref] | provenance | | | test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | | -| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:21 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:42 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:82 | +| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:23 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:44 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:85 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | | | test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | | -| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:22 | -| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:42 | -| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:82 | +| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:24 | +| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:44 | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:85 | | test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | | | test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | | -| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:21 | -| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:42 | -| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:82 | -| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:90 | -| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:87 | +| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:23 | +| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:44 | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:85 | +| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:93 | +| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:90 | | test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | | | test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | | -| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:21 | +| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:23 | | test.rs:42:16:42:31 | ...::args(...) [element] | test.rs:42:9:42:11 | arg | provenance | | | test.rs:46:9:46:11 | arg | test.rs:47:14:47:16 | arg | provenance | | -| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:22 | +| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:24 | | test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | | | test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | | -| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:23 | -| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:86 | +| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:25 | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:89 | | test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | | | test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | | -| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:24 | -| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:86 | +| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:26 | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:89 | | test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | | | test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | | -| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:25 | -| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:81 | +| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:27 | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:84 | | test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | | | test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | | -| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:19 | +| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | | test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | | -| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:97 | +| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:100 | | test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | | | test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | | | test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | | -| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:19 | -| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:87 | -| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:97 | -| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:87 | +| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:90 | +| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:100 | +| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:90 | | test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | | | test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | | -| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:19 | -| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:87 | -| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:98 | -| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:87 | +| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:90 | +| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:101 | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:90 | | test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | | | test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | | -| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:19 | -| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:87 | -| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:96 | -| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:87 | +| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:90 | +| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:99 | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:90 | | test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | | | test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | | -| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:20 | +| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | | | test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | | -| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:95 | +| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:98 | | test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | | | test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | | | test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | | | test.rs:77:9:77:22 | remote_string6 | test.rs:78:10:78:23 | remote_string6 | provenance | | -| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:20 | +| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | | | test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | | -| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:93 | +| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:96 | | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | | | test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | | | test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | | -| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:94 | -| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:94 | -| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:20 | +| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:97 | +| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:97 | +| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | | | test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | | | test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | | | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | | | test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | | -| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:82 | +| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:85 | | test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | | | test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | | | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | | @@ -243,129 +246,129 @@ edges | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | test.rs:114:24:114:57 | await ... [Ok] | provenance | | | test.rs:114:24:114:57 | await ... [Ok] | test.rs:114:24:114:58 | TryExpr | provenance | | | test.rs:114:24:114:58 | TryExpr | test.rs:114:13:114:20 | response | provenance | | -| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:7 | +| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:9 | | test.rs:115:15:115:22 | response | test.rs:115:14:115:22 | &response | provenance | | | test.rs:121:9:121:20 | mut response | test.rs:122:11:122:18 | response | provenance | | | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | test.rs:121:24:121:57 | await ... [Ok] | provenance | | | test.rs:121:24:121:57 | await ... [Ok] | test.rs:121:24:121:58 | TryExpr | provenance | | | test.rs:121:24:121:58 | TryExpr | test.rs:121:9:121:20 | mut response | provenance | | -| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:7 | +| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:9 | | test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | | -| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:110 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:109 | +| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:113 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:112 | | test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | | | test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | | -| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:113 | +| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:64 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:116 | | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | | | test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | | | test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | | -| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:115 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:114 | +| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:118 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:117 | | test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | | | test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | | -| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:116 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:117 | +| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:119 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:120 | | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | | | test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | | | test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | | -| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:112 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:61 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:111 | +| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:115 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:114 | | test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | | | test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:236:15:236:20 | buffer | test.rs:236:14:236:20 | &buffer | provenance | | -| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:57 | +| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:59 | | test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | | -| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:106 | +| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:109 | | test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | | -| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:108 | +| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:111 | | test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | | | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | | | test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | | | test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | | -| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:107 | +| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:110 | | test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | | -| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:108 | +| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:111 | | test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | | | test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | | | test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | | -| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:54 | +| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:56 | | test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | | -| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:108 | +| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:111 | | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | | | test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | | | test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | | -| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:57 | | test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | | -| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:108 | +| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:111 | | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | | | test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | | -| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:105 | -| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:105 | -| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:56 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:108 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:108 | +| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:58 | | test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | | -| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:108 | -| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:82 | -| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:87 | +| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:111 | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:85 | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:90 | | test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | | -| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:87 | +| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:90 | | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:53 | +| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:55 | | test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | | -| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:33 MaD:33 | -| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:108 | +| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | +| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:111 | | test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | | -| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:70 | -| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:72 | +| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:309:25:309:42 | ...::stdin(...) | test.rs:309:13:309:21 | mut stdin | provenance | | | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | test.rs:311:38:311:43 | [post] buffer | provenance | | | test.rs:311:38:311:43 | [post] buffer | test.rs:312:15:312:20 | buffer | provenance | | | test.rs:312:15:312:20 | buffer | test.rs:312:14:312:20 | &buffer | provenance | | -| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:76 | -| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:78 | +| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:316:25:316:42 | ...::stdin(...) | test.rs:316:13:316:21 | mut stdin | provenance | | | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | test.rs:318:45:318:50 | [post] buffer | provenance | | | test.rs:318:45:318:50 | [post] buffer | test.rs:319:15:319:20 | buffer | provenance | | | test.rs:319:15:319:20 | buffer | test.rs:319:14:319:20 | &buffer | provenance | | -| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:77 | -| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:79 | +| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:323:25:323:42 | ...::stdin(...) | test.rs:323:13:323:21 | mut stdin | provenance | | | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | test.rs:325:48:325:53 | [post] buffer | provenance | | | test.rs:325:48:325:53 | [post] buffer | test.rs:326:15:326:20 | buffer | provenance | | | test.rs:326:15:326:20 | buffer | test.rs:326:14:326:20 | &buffer | provenance | | -| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:72 | -| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:74 | +| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:330:25:330:42 | ...::stdin(...) | test.rs:330:13:330:21 | mut stdin | provenance | | | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | test.rs:332:31:332:36 | [post] buffer | provenance | | | test.rs:332:31:332:36 | [post] buffer | test.rs:333:15:333:20 | buffer | provenance | | | test.rs:333:15:333:20 | buffer | test.rs:333:14:333:20 | &buffer | provenance | | -| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:78 | -| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:74 | -| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:73 | -| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:75 | -| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:80 | +| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:76 | +| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:75 | +| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:77 | +| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:337:25:337:42 | ...::stdin(...) | test.rs:337:13:337:21 | mut stdin | provenance | | | test.rs:338:13:338:14 | v1 | test.rs:342:14:342:15 | v1 | provenance | | | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | test.rs:338:18:338:38 | await ... [Ok] | provenance | | @@ -383,150 +386,150 @@ edges | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | test.rs:341:18:341:42 | await ... [Ok] | provenance | | | test.rs:341:18:341:42 | await ... [Ok] | test.rs:341:18:341:43 | TryExpr | provenance | | | test.rs:341:18:341:43 | TryExpr | test.rs:341:13:341:14 | v4 | provenance | | -| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:71 | -| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | +| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:73 | +| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | | test.rs:349:25:349:42 | ...::stdin(...) | test.rs:349:13:349:21 | mut stdin | provenance | | | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | test.rs:351:29:351:34 | [post] buffer | provenance | | | test.rs:351:29:351:34 | [post] buffer | test.rs:352:15:352:20 | buffer | provenance | | | test.rs:352:15:352:20 | buffer | test.rs:352:14:352:20 | &buffer | provenance | | -| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:65 | +| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:67 | | test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | | -| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:121 | +| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:124 | | test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | | | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | | | test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | | | test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | | | test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | | -| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:120 | +| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:123 | | test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | | -| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:121 | +| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:124 | | test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | | | test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | | | test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | | -| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:67 | +| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:69 | | test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | | -| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:121 | +| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:124 | | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | | | test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | | | test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | | -| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:68 | +| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:70 | | test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | | -| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:121 | +| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:124 | | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | | | test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | | -| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:123 | -| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:123 | -| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:69 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:126 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:126 | +| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:71 | | test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | | -| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:121 | +| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:124 | | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | | | test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | | -| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:82 | +| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:85 | | test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | | | test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | | | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | | | test.rs:387:33:387:65 | await ... [Ok, Some] | test.rs:387:33:387:66 | TryExpr [Some] | provenance | | | test.rs:387:33:387:66 | TryExpr [Some] | test.rs:387:19:387:29 | Some(...) [Some] | provenance | | -| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:66 | +| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:68 | | test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | | -| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:37 MaD:37 | -| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:121 | -| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:122 | -| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:122 | +| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | +| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:124 | +| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:125 | +| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:125 | | test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | | | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | | | test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | | -| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:82 | +| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:85 | | test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | | | test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | | | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | | | test.rs:396:32:396:54 | await ... [Ok, Some] | test.rs:396:32:396:55 | TryExpr [Some] | provenance | | | test.rs:396:32:396:55 | TryExpr [Some] | test.rs:396:19:396:28 | Some(...) [Some] | provenance | | | test.rs:408:13:408:18 | buffer | test.rs:409:14:409:19 | buffer | provenance | | -| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:28 | -| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:28 | -| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:29 | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:30 | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:30 | +| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:31 | | test.rs:408:31:408:55 | ...::read(...) [Ok] | test.rs:408:31:408:56 | TryExpr | provenance | | | test.rs:408:31:408:56 | TryExpr | test.rs:408:13:408:18 | buffer | provenance | | | test.rs:413:13:413:18 | buffer | test.rs:414:14:414:19 | buffer | provenance | | -| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:28 | -| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:28 | -| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:29 | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:30 | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:30 | +| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:31 | | test.rs:413:31:413:50 | ...::read(...) [Ok] | test.rs:413:31:413:51 | TryExpr | provenance | | | test.rs:413:31:413:51 | TryExpr | test.rs:413:13:413:18 | buffer | provenance | | | test.rs:418:13:418:18 | buffer | test.rs:419:14:419:19 | buffer | provenance | | -| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:31 | -| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:31 | -| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:32 | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:33 | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:33 | +| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:34 | | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | test.rs:418:22:418:52 | TryExpr | provenance | | | test.rs:418:22:418:52 | TryExpr | test.rs:418:13:418:18 | buffer | provenance | | | test.rs:425:13:425:16 | path | test.rs:426:14:426:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:40 | +| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:42 | | test.rs:425:13:425:16 | path | test.rs:427:14:427:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:40 | +| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:42 | | test.rs:425:13:425:16 | path | test.rs:437:14:437:17 | path | provenance | | | test.rs:425:20:425:27 | e.path() | test.rs:425:13:425:16 | path | provenance | | -| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:9 MaD:9 | -| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:40 | -| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:40 | -| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:119 | +| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:11 MaD:11 | +| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:42 | +| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:42 | +| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:122 | | test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | | -| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:40 | +| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:42 | | test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | | | test.rs:439:25:439:37 | e.file_name() | test.rs:439:13:439:21 | file_name | provenance | | -| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:8 MaD:8 | -| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:40 | +| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:10 MaD:10 | +| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:42 | | test.rs:461:13:461:18 | target | test.rs:462:14:462:19 | target | provenance | | -| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:30 | +| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:32 | | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | test.rs:461:22:461:50 | TryExpr | provenance | | | test.rs:461:22:461:50 | TryExpr | test.rs:461:13:461:18 | target | provenance | | | test.rs:470:13:470:18 | buffer | test.rs:471:14:471:19 | buffer | provenance | | -| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:34 | +| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:36 | | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | test.rs:470:31:470:63 | await ... [Ok] | provenance | | | test.rs:470:31:470:63 | await ... [Ok] | test.rs:470:31:470:64 | TryExpr | provenance | | | test.rs:470:31:470:64 | TryExpr | test.rs:470:13:470:18 | buffer | provenance | | | test.rs:475:13:475:18 | buffer | test.rs:476:14:476:19 | buffer | provenance | | -| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:34 | +| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:36 | | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | test.rs:475:31:475:63 | await ... [Ok] | provenance | | | test.rs:475:31:475:63 | await ... [Ok] | test.rs:475:31:475:64 | TryExpr | provenance | | | test.rs:475:31:475:64 | TryExpr | test.rs:475:13:475:18 | buffer | provenance | | | test.rs:480:13:480:18 | buffer | test.rs:481:14:481:19 | buffer | provenance | | -| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:36 | +| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:38 | | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | test.rs:480:22:480:64 | await ... [Ok] | provenance | | | test.rs:480:22:480:64 | await ... [Ok] | test.rs:480:22:480:65 | TryExpr | provenance | | | test.rs:480:22:480:65 | TryExpr | test.rs:480:13:480:18 | buffer | provenance | | | test.rs:486:13:486:16 | path | test.rs:488:14:488:17 | path | provenance | | | test.rs:486:20:486:31 | entry.path() | test.rs:486:13:486:16 | path | provenance | | -| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:17 MaD:17 | -| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:17 MaD:17 | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:19 MaD:19 | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:19 MaD:19 | | test.rs:487:13:487:21 | file_name | test.rs:489:14:489:22 | file_name | provenance | | | test.rs:487:25:487:41 | entry.file_name() | test.rs:487:13:487:21 | file_name | provenance | | -| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:16 MaD:16 | -| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:16 MaD:16 | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:18 MaD:18 | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:18 MaD:18 | | test.rs:493:13:493:18 | target | test.rs:494:14:494:19 | target | provenance | | -| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:35 | +| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:37 | | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | | | test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | | | test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:100 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:99 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:102 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:101 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:104 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:103 | -| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:61 | -| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:57 | -| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:10 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:103 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:105 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:64 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:107 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:106 | +| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:59 | +| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:12 | | test.rs:503:20:503:50 | ...::open(...) [Ok] | test.rs:503:20:503:51 | TryExpr | provenance | | | test.rs:503:20:503:51 | TryExpr | test.rs:503:9:503:16 | mut file | provenance | | | test.rs:507:32:507:42 | [post] &mut buffer | test.rs:508:15:508:20 | buffer | provenance | | @@ -545,69 +548,69 @@ edges | test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | | | test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | | | test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:100 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:99 | -| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:87 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:103 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:90 | | test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | | -| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:11 | +| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | | | test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:100 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:99 | -| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:87 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:103 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:90 | | test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | | -| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:11 | +| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | | | test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:100 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:99 | -| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:87 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:103 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:90 | | test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | | -| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:11 | +| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | test.rs:552:35:552:40 | [post] buffer | provenance | | | test.rs:552:35:552:40 | [post] buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:553:15:553:20 | buffer | test.rs:553:14:553:20 | &buffer | provenance | | -| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:59 | -| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:10 | +| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:61 | +| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:12 | | test.rs:560:21:560:51 | ...::open(...) [Ok] | test.rs:560:21:560:52 | TryExpr | provenance | | | test.rs:560:21:560:52 | TryExpr | test.rs:560:13:560:17 | file1 | provenance | | | test.rs:561:13:561:17 | file2 | test.rs:562:38:562:42 | file2 | provenance | | -| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:10 | +| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:12 | | test.rs:561:21:561:59 | ...::open(...) [Ok] | test.rs:561:21:561:60 | TryExpr | provenance | | | test.rs:561:21:561:60 | TryExpr | test.rs:561:13:561:17 | file2 | provenance | | -| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:65 | | test.rs:562:26:562:43 | file1.chain(...) | test.rs:562:13:562:22 | mut reader | provenance | | -| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:58 | +| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:60 | | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | test.rs:563:36:563:41 | [post] buffer | provenance | | | test.rs:563:36:563:41 | [post] buffer | test.rs:564:15:564:20 | buffer | provenance | | | test.rs:564:15:564:20 | buffer | test.rs:564:14:564:20 | &buffer | provenance | | -| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:64 | -| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:10 | +| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:66 | +| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:12 | | test.rs:569:21:569:51 | ...::open(...) [Ok] | test.rs:569:21:569:52 | TryExpr | provenance | | | test.rs:569:21:569:52 | TryExpr | test.rs:569:13:569:17 | file1 | provenance | | -| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:65 | | test.rs:570:26:570:40 | file1.take(...) | test.rs:570:13:570:22 | mut reader | provenance | | | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | test.rs:571:36:571:41 | [post] buffer | provenance | | | test.rs:571:36:571:41 | [post] buffer | test.rs:572:15:572:20 | buffer | provenance | | | test.rs:572:15:572:20 | buffer | test.rs:572:14:572:20 | &buffer | provenance | | -| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:70 | -| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:76 | -| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:77 | -| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:72 | -| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:78 | -| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:74 | -| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:73 | -| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:75 | -| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:71 | -| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:14 | +| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:72 | +| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:78 | +| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:79 | +| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:74 | +| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:80 | +| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:76 | +| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:75 | +| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:77 | +| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:73 | +| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:16 | | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | test.rs:581:20:581:58 | await ... [Ok] | provenance | | | test.rs:581:20:581:58 | await ... [Ok] | test.rs:581:20:581:59 | TryExpr | provenance | | | test.rs:581:20:581:59 | TryExpr | test.rs:581:9:581:16 | mut file | provenance | | @@ -642,45 +645,45 @@ edges | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | test.rs:620:28:620:33 | [post] buffer | provenance | | | test.rs:620:28:620:33 | [post] buffer | test.rs:621:15:621:20 | buffer | provenance | | | test.rs:621:15:621:20 | buffer | test.rs:621:14:621:20 | &buffer | provenance | | -| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:70 | +| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:72 | | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | test.rs:627:22:627:71 | await ... [Ok] | provenance | | | test.rs:627:22:627:71 | await ... [Ok] | test.rs:627:22:627:72 | TryExpr | provenance | | | test.rs:627:22:627:72 | TryExpr | test.rs:627:13:627:18 | mut f1 | provenance | | -| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | test.rs:629:35:629:40 | [post] buffer | provenance | | | test.rs:629:35:629:40 | [post] buffer | test.rs:630:15:630:20 | buffer | provenance | | | test.rs:630:15:630:20 | buffer | test.rs:630:14:630:20 | &buffer | provenance | | | test.rs:660:9:660:16 | mut file | test.rs:664:22:664:25 | file | provenance | | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:38 | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:39 | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:49 | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:50 | -| test.rs:660:20:660:44 | ...::open | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:4 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:41 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:51 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:52 | +| test.rs:660:20:660:44 | ...::open | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:6 | | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | test.rs:660:20:660:62 | await ... [Ok] | provenance | | | test.rs:660:20:660:62 | await ... [Ok] | test.rs:660:20:660:63 | TryExpr | provenance | | | test.rs:660:20:660:63 | TryExpr | test.rs:660:9:660:16 | mut file | provenance | | -| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:38 | -| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:49 | +| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:51 | | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | test.rs:664:37:664:42 | [post] buffer | provenance | | | test.rs:664:37:664:42 | [post] buffer | test.rs:665:15:665:20 | buffer | provenance | | | test.rs:665:15:665:20 | buffer | test.rs:665:14:665:20 | &buffer | provenance | | | test.rs:671:13:671:18 | mut f1 | test.rs:673:22:673:23 | f1 | provenance | | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:38 | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:39 | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:49 | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:50 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:41 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:51 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:52 | | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | test.rs:671:22:671:75 | await ... [Ok] | provenance | | | test.rs:671:22:671:75 | await ... [Ok] | test.rs:671:22:671:76 | TryExpr | provenance | | | test.rs:671:22:671:76 | TryExpr | test.rs:671:13:671:18 | mut f1 | provenance | | -| test.rs:671:56:671:59 | open | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:5 | -| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:38 | -| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:49 | +| test.rs:671:56:671:59 | open | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:7 | +| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:51 | | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | test.rs:673:35:673:40 | [post] buffer | provenance | | | test.rs:673:35:673:40 | [post] buffer | test.rs:674:15:674:20 | buffer | provenance | | | test.rs:674:15:674:20 | buffer | test.rs:674:14:674:20 | &buffer | provenance | | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:60 | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:118 | -| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:12 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:121 | +| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:14 | | test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | | | test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | | | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | test.rs:695:34:695:39 | [post] buffer | provenance | | @@ -688,21 +691,21 @@ edges | test.rs:695:34:695:39 | [post] buffer | test.rs:699:14:699:22 | buffer[0] | provenance | | | test.rs:698:15:698:20 | buffer | test.rs:698:14:698:20 | &buffer | provenance | | | test.rs:707:13:707:22 | mut stream | test.rs:715:58:715:63 | stream | provenance | | -| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:13 | +| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:15 | | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | test.rs:707:26:707:106 | TryExpr | provenance | | | test.rs:707:26:707:106 | TryExpr | test.rs:707:13:707:22 | mut stream | provenance | | -| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:54 | -| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:64 | +| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:56 | +| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:66 | | test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | | -| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:108 | +| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:111 | | test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | | | test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | | | test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:124 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:70 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:125 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:126 | -| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:18 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:127 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:72 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:128 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:129 | +| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:20 | | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | | | test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | | | test.rs:759:28:759:73 | TryExpr | test.rs:759:9:759:24 | mut tokio_stream | provenance | | @@ -722,7 +725,7 @@ edges | test.rs:817:27:817:32 | buffer | test.rs:817:26:817:32 | &buffer | provenance | | | test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:20:11:20:13 | tcp | provenance | | | test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:26:53:26:55 | tcp | provenance | | -| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:6 | +| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:8 | | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | test_futures_io.rs:19:15:19:43 | await ... [Ok] | provenance | | | test_futures_io.rs:19:15:19:43 | await ... [Ok] | test_futures_io.rs:19:15:19:44 | TryExpr | provenance | | | test_futures_io.rs:19:15:19:44 | TryExpr | test_futures_io.rs:19:9:19:11 | tcp | provenance | | @@ -731,15 +734,15 @@ edges | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:32:40:32:45 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:45:64:45:69 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:27:49:32 | reader | provenance | | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:39 | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:49 | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:50 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:41 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:51 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:52 | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:54:51:54:56 | reader | provenance | | | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | | | test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | | | test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | | -| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:91 | +| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:94 | | test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | | @@ -747,60 +750,60 @@ edges | test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:83 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:85 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:84 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:86 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:88 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:87 | | test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | | | test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | -| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:49 | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:51 | | test_futures_io.rs:45:64:45:69 | reader | test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | provenance | | | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | test_futures_io.rs:45:77:45:83 | [post] buffer1 | provenance | | | test_futures_io.rs:45:77:45:83 | [post] buffer1 | test_futures_io.rs:46:15:46:36 | buffer1[...] | provenance | | | test_futures_io.rs:46:15:46:36 | buffer1[...] | test_futures_io.rs:46:14:46:36 | &... | provenance | | -| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:49 | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:51 | | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | test_futures_io.rs:49:44:49:50 | [post] buffer2 | provenance | | | test_futures_io.rs:49:44:49:50 | [post] buffer2 | test_futures_io.rs:51:15:51:36 | buffer2[...] | provenance | | | test_futures_io.rs:51:15:51:36 | buffer2[...] | test_futures_io.rs:51:14:51:36 | &... | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:55:11:55:17 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:59:40:59:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:69:37:69:43 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:44 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:46 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:90:40:90:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:103:64:103:70 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:27:107:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:39 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:49 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:50 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:41 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:51 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:52 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:113:40:113:46 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:44 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:46 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:27:132:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:47 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:48 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:49 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:50 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:27:139:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:45 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:46 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:47 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:48 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:27:146:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:51 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:52 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:54 | | test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | | -| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:92 | +| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:95 | | test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | | | test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | +| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:60:15:60:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:83 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:85 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:84 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:86 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:88 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:87 | | test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | | test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | @@ -813,11 +816,11 @@ edges | test_futures_io.rs:63:31:63:33 | buf | test_futures_io.rs:65:18:65:20 | buf | provenance | | | test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | test_futures_io.rs:64:18:64:24 | &buffer | provenance | | | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | -| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:83 | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:85 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:86 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:88 | | test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | | @@ -835,35 +838,35 @@ edges | test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:83 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:85 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:84 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:86 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:88 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:87 | | test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | -| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:49 | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:51 | | test_futures_io.rs:103:64:103:70 | reader2 | test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | test_futures_io.rs:103:78:103:84 | [post] buffer1 | provenance | | | test_futures_io.rs:103:78:103:84 | [post] buffer1 | test_futures_io.rs:104:15:104:36 | buffer1[...] | provenance | | | test_futures_io.rs:104:15:104:36 | buffer1[...] | test_futures_io.rs:104:14:104:36 | &... | provenance | | -| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:38 | -| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:49 | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:40 | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:51 | | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | test_futures_io.rs:107:45:107:51 | [post] buffer2 | provenance | | | test_futures_io.rs:107:45:107:51 | [post] buffer2 | test_futures_io.rs:108:15:108:36 | buffer2[...] | provenance | | | test_futures_io.rs:108:15:108:36 | buffer2[...] | test_futures_io.rs:108:14:108:36 | &... | provenance | | | test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:114:15:114:20 | pinned | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | +| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:114:15:114:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:43 | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:83 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:85 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:84 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:86 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:88 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:87 | | test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | | test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | @@ -879,42 +882,60 @@ edges | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:125:22:125:45 | await ... [Ok] | provenance | | | test_futures_io.rs:125:22:125:45 | await ... [Ok] | test_futures_io.rs:125:22:125:46 | TryExpr | provenance | | | test_futures_io.rs:125:22:125:46 | TryExpr | test_futures_io.rs:125:13:125:18 | buffer | provenance | | -| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:47 | +| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:49 | | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | test_futures_io.rs:132:58:132:61 | [post] line | provenance | | | test_futures_io.rs:132:58:132:61 | [post] line | test_futures_io.rs:133:15:133:18 | line | provenance | | | test_futures_io.rs:133:15:133:18 | line | test_futures_io.rs:133:14:133:18 | &line | provenance | | -| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:45 | +| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:47 | | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | test_futures_io.rs:139:50:139:53 | [post] line | provenance | | | test_futures_io.rs:139:50:139:53 | [post] line | test_futures_io.rs:140:15:140:18 | line | provenance | | | test_futures_io.rs:140:15:140:18 | line | test_futures_io.rs:140:14:140:18 | &line | provenance | | -| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:51 | +| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:53 | | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | test_futures_io.rs:146:52:146:57 | [post] buffer | provenance | | | test_futures_io.rs:146:52:146:57 | [post] buffer | test_futures_io.rs:147:15:147:20 | buffer | provenance | | | test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:80 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:89 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:80 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:89 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:92 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:92 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:79 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:88 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:79 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:88 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:91 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:91 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:80 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:89 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:80 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:89 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:79 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:88 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:79 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:88 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:92 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:92 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:91 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:91 | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() | provenance | MaD:81 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:14 | a | provenance | | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:92 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:14 | a | provenance | | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:91 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:103:14:103:14 | a | provenance | | +| web_frameworks.rs:100:17:100:33 | path.into_inner() | web_frameworks.rs:100:13:100:13 | a | provenance | | +| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:83 | +| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:92 | +| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:82 | +| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:91 | +| web_frameworks.rs:127:5:127:20 | to | web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | provenance | Src:MaD:4 | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:32 | path.into_inner() | provenance | MaD:81 | +| web_frameworks.rs:131:13:131:13 | a | web_frameworks.rs:132:14:132:14 | a | provenance | | +| web_frameworks.rs:131:17:131:32 | path.into_inner() | web_frameworks.rs:131:13:131:13 | a | provenance | | +| web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | provenance | Src:MaD:5 | | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:242:38:242:46 | ...: String | provenance | Src:MaD:2 | | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:242:38:242:46 | ...: String | provenance | Src:MaD:2 | | web_frameworks.rs:242:38:242:46 | ...: String | web_frameworks.rs:244:18:244:18 | a | provenance | | @@ -1719,6 +1740,20 @@ nodes | web_frameworks.rs:68:15:68:15 | a | semmle.label | a | | web_frameworks.rs:70:14:70:14 | a | semmle.label | a | | web_frameworks.rs:70:14:70:14 | a | semmle.label | a | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| web_frameworks.rs:100:13:100:13 | a | semmle.label | a | +| web_frameworks.rs:100:17:100:33 | path.into_inner() | semmle.label | path.into_inner() | +| web_frameworks.rs:101:14:101:14 | a | semmle.label | a | +| web_frameworks.rs:101:14:101:23 | a.as_str() | semmle.label | a.as_str() | +| web_frameworks.rs:102:14:102:14 | a | semmle.label | a | +| web_frameworks.rs:102:14:102:25 | a.as_bytes() | semmle.label | a.as_bytes() | +| web_frameworks.rs:103:14:103:14 | a | semmle.label | a | +| web_frameworks.rs:127:5:127:20 | to | semmle.label | to | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| web_frameworks.rs:131:13:131:13 | a | semmle.label | a | +| web_frameworks.rs:131:17:131:32 | path.into_inner() | semmle.label | path.into_inner() | +| web_frameworks.rs:132:14:132:14 | a | semmle.label | a | +| web_frameworks.rs:139:41:139:42 | to | semmle.label | to | | web_frameworks.rs:242:33:242:35 | map | semmle.label | map | | web_frameworks.rs:242:33:242:35 | map | semmle.label | map | | web_frameworks.rs:242:38:242:46 | ...: String | semmle.label | ...: String | @@ -1882,6 +1917,10 @@ testFailures | web_frameworks.rs:15:14:15:14 | a | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | $@ | web_frameworks.rs:11:31:11:31 | a | a | | web_frameworks.rs:70:14:70:14 | a | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | $@ | web_frameworks.rs:68:15:68:15 | a | a | | web_frameworks.rs:70:14:70:14 | a | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | $@ | web_frameworks.rs:68:15:68:15 | a | a | +| web_frameworks.rs:101:14:101:23 | a.as_str() | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:101:14:101:23 | a.as_str() | $@ | web_frameworks.rs:139:41:139:42 | to | to | +| web_frameworks.rs:102:14:102:25 | a.as_bytes() | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:102:14:102:25 | a.as_bytes() | $@ | web_frameworks.rs:139:41:139:42 | to | to | +| web_frameworks.rs:103:14:103:14 | a | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:103:14:103:14 | a | $@ | web_frameworks.rs:139:41:139:42 | to | to | +| web_frameworks.rs:132:14:132:14 | a | web_frameworks.rs:127:5:127:20 | to | web_frameworks.rs:132:14:132:14 | a | $@ | web_frameworks.rs:127:5:127:20 | to | to | | web_frameworks.rs:244:18:244:18 | a | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:244:18:244:18 | a | $@ | web_frameworks.rs:242:33:242:35 | map | map | | web_frameworks.rs:244:18:244:18 | a | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:244:18:244:18 | a | $@ | web_frameworks.rs:242:33:242:35 | map | map | | web_frameworks.rs:252:22:252:22 | a | web_frameworks.rs:250:46:250:49 | then | web_frameworks.rs:252:22:252:22 | a | $@ | web_frameworks.rs:250:46:250:49 | then | then | diff --git a/rust/ql/test/library-tests/dataflow/sources/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/TaintSources.expected index 96b6426baf4..c54f7e1696b 100644 --- a/rust/ql/test/library-tests/dataflow/sources/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/TaintSources.expected @@ -100,6 +100,38 @@ | web_frameworks.rs:58:14:58:15 | ms | Flow source 'RemoteSource' of type remote (DEFAULT). | | web_frameworks.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | | web_frameworks.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| web_frameworks.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | | web_frameworks.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | | web_frameworks.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | | web_frameworks.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs index 3b901bd823f..e5ce0f313ae 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs @@ -95,18 +95,18 @@ mod actix_test { use actix_web::{get, web, App}; async fn my_actix_handler_1( - path: web::Path, // $ MISSING: Alert[rust/summary/taint-sources] + path: web::Path, ) -> String { let a = path.into_inner(); - sink(a.as_str()); // $ MISSING: hasTaintFlow - sink(a.as_bytes()); // $ MISSING: hasTaintFlow - sink(a); // $ MISSING: hasTaintFlow + sink(a.as_str()); // $ hasTaintFlow=my_actix_handler_1 + sink(a.as_bytes()); // $ hasTaintFlow=my_actix_handler_1 + sink(a); // $ hasTaintFlow=my_actix_handler_1 "".to_string() } async fn my_actix_handler_2( - path: web::Path<(String, String)>, // $ MISSING: Alert[rust/summary/taint-sources] + path: web::Path<(String, String)>, ) -> String { let (a, b) = path.into_inner(); @@ -117,28 +117,28 @@ mod actix_test { } async fn my_actix_handler_3( - web::Query(a): web::Query, // $ MISSING: Alert[rust/summary/taint-sources] + web::Query(a): web::Query, ) -> String { sink(a); // $ MISSING: hasTaintFlow "".to_string() } - #[get("/4/{a}")] + #[get("/4/{a}")] // $ Alert[rust/summary/taint-sources] async fn my_actix_handler_4( - path: web::Path, // $ MISSING: Alert[rust/summary/taint-sources] + path: web::Path, ) -> String { let a = path.into_inner(); - sink(a); // $ MISSING: hasTaintFlow + sink(a); // $ hasTaintFlow=my_actix_handler_4 "".to_string() } async fn test_actix() { let app = App::new() - .route("/1/{a}", web::get().to(my_actix_handler_1)) - .route("/2/{a}/{b}", web::get().to(my_actix_handler_2)) - .route("/3/{a}", web::get().to(my_actix_handler_3)) + .route("/1/{a}", web::get().to(my_actix_handler_1)) // $ Alert[rust/summary/taint-sources] + .route("/2/{a}/{b}", web::get().to(my_actix_handler_2)) // $ Alert[rust/summary/taint-sources] + .route("/3/{a}", web::get().to(my_actix_handler_3)) // $ Alert[rust/summary/taint-sources] .service(my_actix_handler_4); // ... From 84c6a3a3760f726298330980525b462ec383ba9e Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 29 Sep 2025 13:03:10 +0200 Subject: [PATCH 02/82] Rust: Add change note for actix-web models --- rust/ql/lib/change-notes/2025-09-29-actix-web-model.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2025-09-29-actix-web-model.md diff --git a/rust/ql/lib/change-notes/2025-09-29-actix-web-model.md b/rust/ql/lib/change-notes/2025-09-29-actix-web-model.md new file mode 100644 index 00000000000..7bf9ce8a7d5 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-09-29-actix-web-model.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Added basic models for the `actix-web` web framework. \ No newline at end of file From 2e9e357d7e6c6e2be218f087af2c83763cb96c2b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 3 Oct 2025 10:52:52 +0200 Subject: [PATCH 03/82] Rangeanalysis: Fix a join-order. --- .../codeql/rangeanalysis/RangeAnalysis.qll | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll b/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll index 1d17ad8346c..ff17f9b5405 100644 --- a/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll +++ b/shared/rangeanalysis/codeql/rangeanalysis/RangeAnalysis.qll @@ -923,17 +923,18 @@ module RangeStage< } /** - * Holds if `b + delta` is a valid bound for `inp` when used as an input to - * `phi` along `edge`. + * Holds if `b + delta` is a valid bound for the input `inp` to `phi` along + * the edge with rank `rix`. * - `upper = true` : `inp <= b + delta` * - `upper = false` : `inp >= b + delta` */ private predicate boundedPhiInp( - Sem::SsaPhiNode phi, Sem::SsaVariable inp, SsaReadPositionPhiInputEdge edge, SemBound b, - D::Delta delta, boolean upper, boolean fromBackEdge, D::Delta origdelta, SemReason reason + Sem::SsaPhiNode phi, int rix, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, + D::Delta origdelta, SemReason reason ) { - edge.phiInput(phi, inp) and - exists(D::Delta d, boolean fromBackEdge0 | + exists( + D::Delta d, boolean fromBackEdge0, Sem::SsaVariable inp, SsaReadPositionPhiInputEdge edge + | boundedSsa(inp, b, d, edge, upper, fromBackEdge0, origdelta, reason) or boundedPhi(inp, b, d, upper, fromBackEdge0, origdelta, reason) @@ -945,6 +946,7 @@ module RangeStage< origdelta = D::fromFloat(0) and reason = TSemNoReason() | + rankedPhiInput(phi, inp, edge, rix) and if backEdge(phi, inp, edge) then fromBackEdge = true and @@ -963,33 +965,30 @@ module RangeStage< } /** - * Holds if `b + delta` is a valid bound for `inp` when used as an input to - * `phi` along `edge`. + * Holds if `b + delta` is a valid bound for the input `inp` to `phi` along + * the edge with rank `rix`. * - `upper = true` : `inp <= b + delta` * - `upper = false` : `inp >= b + delta` * - * Equivalent to `boundedPhiInp(phi, inp, edge, b, delta, upper, _, _, _)`. + * Equivalent to `boundedPhiInp(phi, rix, b, delta, upper, _, _, _)`. */ pragma[noinline] private predicate boundedPhiInp1( - Sem::SsaPhiNode phi, SemBound b, boolean upper, Sem::SsaVariable inp, - SsaReadPositionPhiInputEdge edge, D::Delta delta + Sem::SsaPhiNode phi, SemBound b, boolean upper, int rix, D::Delta delta ) { - boundedPhiInp(phi, inp, edge, b, delta, upper, _, _, _) + boundedPhiInp(phi, rix, b, delta, upper, _, _, _) } /** - * Holds if `phi` is a valid bound for `inp` when used as an input to `phi` - * along `edge`. + * Holds if `phi` is a valid bound for the input `inp` to `phi` along the + * edge with rank `rix`. * - `upper = true` : `inp <= phi` * - `upper = false` : `inp >= phi` */ - private predicate selfBoundedPhiInp( - Sem::SsaPhiNode phi, Sem::SsaVariable inp, SsaReadPositionPhiInputEdge edge, boolean upper - ) { + private predicate selfBoundedPhiInp(Sem::SsaPhiNode phi, int rix, boolean upper) { exists(D::Delta d, SemSsaBound phibound | phibound.getVariable() = phi and - boundedPhiInp(phi, inp, edge, phibound, d, upper, _, _, _) and + boundedPhiInp(phi, rix, phibound, d, upper, _, _, _) and ( upper = true and D::toFloat(d) <= 0 or @@ -1009,33 +1008,34 @@ module RangeStage< Sem::SsaPhiNode phi, boolean upper, SemBound b, D::Delta delta, boolean fromBackEdge, D::Delta origdelta, SemReason reason ) { - boundedPhiInp(phi, _, _, b, delta, upper, fromBackEdge, origdelta, reason) + boundedPhiInp(phi, _, b, delta, upper, fromBackEdge, origdelta, reason) } /** * Holds if the candidate bound `b + delta` for `phi` is valid for the phi input - * `inp` along `edge`. + * along the edge with rank `rix`. */ private predicate boundedPhiCandValidForEdge( Sem::SsaPhiNode phi, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, - D::Delta origdelta, SemReason reason, Sem::SsaVariable inp, SsaReadPositionPhiInputEdge edge + D::Delta origdelta, SemReason reason, int rix ) { boundedPhiCand(phi, upper, b, delta, fromBackEdge, origdelta, reason) and ( - exists(D::Delta d | boundedPhiInp1(phi, b, upper, inp, edge, d) | + exists(D::Delta d | boundedPhiInp1(phi, b, upper, rix, d) | upper = true and D::toFloat(d) <= D::toFloat(delta) ) or - exists(D::Delta d | boundedPhiInp1(phi, b, upper, inp, edge, d) | + exists(D::Delta d | boundedPhiInp1(phi, b, upper, rix, d) | upper = false and D::toFloat(d) >= D::toFloat(delta) ) or - selfBoundedPhiInp(phi, inp, edge, upper) + selfBoundedPhiInp(phi, rix, upper) ) } /** - * Holds if `b + delta` is a valid bound for `phi`'s `rix`th input edge. + * Holds if `b + delta` is a valid bound for `phi` when accounting for the + * input edges ranked 1 through `rix`. * - `upper = true` : `phi <= b + delta` * - `upper = false` : `phi >= b + delta` */ @@ -1044,10 +1044,8 @@ module RangeStage< Sem::SsaPhiNode phi, SemBound b, D::Delta delta, boolean upper, boolean fromBackEdge, D::Delta origdelta, SemReason reason, int rix ) { - exists(Sem::SsaVariable inp, SsaReadPositionPhiInputEdge edge | - rankedPhiInput(phi, inp, edge, rix) and - boundedPhiCandValidForEdge(phi, b, delta, upper, fromBackEdge, origdelta, reason, inp, edge) - | + boundedPhiCandValidForEdge(phi, b, delta, upper, fromBackEdge, origdelta, reason, rix) and + ( rix = 1 or boundedPhiRankStep(phi, b, delta, upper, fromBackEdge, origdelta, reason, rix - 1) From ef1fe6cabcbadc79d9091f788904e8d057efd2ee Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 3 Oct 2025 10:40:45 +0100 Subject: [PATCH 04/82] Add code owners for `/shared/` --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index 7233623d452..9b3e04029e0 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -9,6 +9,7 @@ /python/ @github/codeql-python /ruby/ @github/codeql-ruby /rust/ @github/codeql-rust +/shared/ @aschackmull @hvitved @owen-mc /swift/ @github/codeql-swift /misc/codegen/ @github/codeql-swift /java/kotlin-extractor/ @github/codeql-kotlin From dac50fa0c1ad83fe306a6fa02d5178601dc3363d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Tue, 12 Aug 2025 09:59:57 +0200 Subject: [PATCH 05/82] Enable overlay compilation in lib/qlpack.yml --- python/ql/lib/qlpack.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 35ab576bf1a..d8e4448dc6b 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -19,3 +19,4 @@ dataExtensions: - semmle/python/frameworks/**/*.model.yml - ext/*.model.yml warnOnImplicitThis: true +compileForOverlayEval: true From 4c9ca93cdfbe0b52707b3ee65c2b724f2ef92e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 16:31:37 +0200 Subject: [PATCH 06/82] Turn on overlay support in codeql-extractor.yml --- python/codeql-extractor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/python/codeql-extractor.yml b/python/codeql-extractor.yml index c8b51db42e6..993b1505bd1 100644 --- a/python/codeql-extractor.yml +++ b/python/codeql-extractor.yml @@ -2,6 +2,7 @@ name: "python" display_name: "Python" version: 1.22.1 column_kind: utf32 +overlay_support_version: 20250626 build_modes: - none default_queries: From a88d3397cd5c1f39adb44fa8a38a6d287ced2f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 16:14:07 +0200 Subject: [PATCH 07/82] Add overlay builtins to python dbscheme --- config/dbscheme-fragments.json | 1 + python/extractor/semmle/dbscheme.template | 16 ++++++++++++++++ python/ql/lib/semmlecode.python.dbscheme | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/config/dbscheme-fragments.json b/config/dbscheme-fragments.json index c2a9a5e734b..a626025de0b 100644 --- a/config/dbscheme-fragments.json +++ b/config/dbscheme-fragments.json @@ -9,6 +9,7 @@ "fragments": [ "/*- Compilations -*/", "/*- External data -*/", + "/*- Overlay support -*/", "/*- Files and folders -*/", "/*- Diagnostic messages -*/", "/*- Diagnostic messages: severity -*/", diff --git a/python/extractor/semmle/dbscheme.template b/python/extractor/semmle/dbscheme.template index 07b65434bbd..43015df66f4 100644 --- a/python/extractor/semmle/dbscheme.template +++ b/python/extractor/semmle/dbscheme.template @@ -40,6 +40,22 @@ externalData( string value : string ref ); +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + /*- DEPRECATED: Snapshot date -*/ snapshotDate(unique date snapshotDate : date ref); diff --git a/python/ql/lib/semmlecode.python.dbscheme b/python/ql/lib/semmlecode.python.dbscheme index 5af903da088..6a1f497168d 100644 --- a/python/ql/lib/semmlecode.python.dbscheme +++ b/python/ql/lib/semmlecode.python.dbscheme @@ -47,6 +47,22 @@ externalData( string value : string ref ); +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + /*- DEPRECATED: Snapshot date -*/ snapshotDate(unique date snapshotDate : date ref); From 1c3a7f2b1e680404312b6092c1cb6e0146f23f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 16:50:15 +0200 Subject: [PATCH 08/82] Add database upgrade/downgrade scripts --- .../old.dbscheme | 1252 +++++++++++++++++ .../semmlecode.python.dbscheme | 1236 ++++++++++++++++ .../upgrade.properties | 4 + .../old.dbscheme | 1236 ++++++++++++++++ .../semmlecode.python.dbscheme | 1252 +++++++++++++++++ .../upgrade.properties | 2 + 6 files changed, 4982 insertions(+) create mode 100644 python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme create mode 100644 python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme create mode 100644 python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties create mode 100644 python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/old.dbscheme create mode 100644 python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/semmlecode.python.dbscheme create mode 100644 python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/upgrade.properties diff --git a/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme new file mode 100644 index 00000000000..6a1f497168d --- /dev/null +++ b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme @@ -0,0 +1,1252 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme new file mode 100644 index 00000000000..5af903da088 --- /dev/null +++ b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme @@ -0,0 +1,1236 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties new file mode 100644 index 00000000000..1a7cdb0ad71 --- /dev/null +++ b/python/downgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties @@ -0,0 +1,4 @@ +description: Add databaseMetadata and overlayChangedFiles relations +compatibility: full +databaseMetadata.rel: delete +overlayChangedFiles.rel: delete diff --git a/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/old.dbscheme b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/old.dbscheme new file mode 100644 index 00000000000..5af903da088 --- /dev/null +++ b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/old.dbscheme @@ -0,0 +1,1236 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/semmlecode.python.dbscheme b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/semmlecode.python.dbscheme new file mode 100644 index 00000000000..6a1f497168d --- /dev/null +++ b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/semmlecode.python.dbscheme @@ -0,0 +1,1252 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/upgrade.properties b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/upgrade.properties new file mode 100644 index 00000000000..52b67d65af7 --- /dev/null +++ b/python/ql/lib/upgrades/5af903da088e3746aa283700a43a779302453523/upgrade.properties @@ -0,0 +1,2 @@ +description: Add databaseMetadata and overlayChangedFiles relations +compatibility: full From 1574b5fd91a1ff397b6083329f39ecf9082c20a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Wed, 20 Aug 2025 16:30:02 +0200 Subject: [PATCH 09/82] Add synthetic data to dbscheme.stats for `databaseMetadata`/`overlayChangedFiles` --- .../ql/lib/semmlecode.python.dbscheme.stats | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/python/ql/lib/semmlecode.python.dbscheme.stats b/python/ql/lib/semmlecode.python.dbscheme.stats index 289c0487066..a4060cf9b8e 100644 --- a/python/ql/lib/semmlecode.python.dbscheme.stats +++ b/python/ql/lib/semmlecode.python.dbscheme.stats @@ -1269,6 +1269,53 @@ +databaseMetadata +1 + + +metadataKey +1 + + +value +1 + + + + +metadataKey +value + + +12 + + + + + +value +metadataKey + + +12 + + + + + + + +overlayChangedFiles +50 + + +path +50 + + + + + snapshotDate 2 From 29b1a7403b0d96c88322c659e846fd164f7d5981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 17:29:39 +0200 Subject: [PATCH 10/82] Support CODEQL_PATH_TRANSFORMER env var in python path renamer The new name is required by overlay support. --- python/extractor/semmle/path_rename.py | 2 +- python/extractor/tests/test_use_projectlayout.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/extractor/semmle/path_rename.py b/python/extractor/semmle/path_rename.py index 3a72d41e971..39832d6d96a 100644 --- a/python/extractor/semmle/path_rename.py +++ b/python/extractor/semmle/path_rename.py @@ -25,7 +25,7 @@ def renamer_from_options_and_env(options, logger): except (AttributeError, ImportError): raise SemmleError("Cannot get renamer from module " + options.renamer) else: - path_transformer = os.environ.get("SEMMLE_PATH_TRANSFORMER", None) + path_transformer = os.environ.get("CODEQL_PATH_TRANSFORMER", None) or os.environ.get("SEMMLE_PATH_TRANSFORMER", None) if path_transformer: logger.info("Using path transformer '%s'", path_transformer) rename = projectlayout.get_renamer(path_transformer) diff --git a/python/extractor/tests/test_use_projectlayout.py b/python/extractor/tests/test_use_projectlayout.py index fde36016f97..a573044b0b4 100644 --- a/python/extractor/tests/test_use_projectlayout.py +++ b/python/extractor/tests/test_use_projectlayout.py @@ -19,7 +19,7 @@ class ProjectLayoutUseTest(ExtractorTest): def test_invalid_layout(self): try: - with environment("SEMMLE_PATH_TRANSFORMER", "nonsuch/project-layout"): + with environment("CODEQL_PATH_TRANSFORMER", "nonsuch/project-layout"): self.run_extractor("-R", self.src_path) except subprocess.CalledProcessError as ex: self.assertEqual(ex.returncode, 2) From e0cf719cb94f8135f37466a94b5867fa6c4cabcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Wed, 10 Sep 2025 17:30:56 +0200 Subject: [PATCH 11/82] Path transformer: handle Windows-style paths And don't add slash to start of path patterns on Windows. --- python/extractor/semmle/projectlayout.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/python/extractor/semmle/projectlayout.py b/python/extractor/semmle/projectlayout.py index ec657d2ae24..2886f9e9e4d 100644 --- a/python/extractor/semmle/projectlayout.py +++ b/python/extractor/semmle/projectlayout.py @@ -12,12 +12,16 @@ import collections import re from functools import total_ordering import sys +from pathlib import PureWindowsPath +import os def get_renamer(filename): layout = load(filename) def rename(path): renamed = layout.artificial_path(path) return path if renamed is None else renamed + if os.name == "nt": + return lambda path: rename(PureWindowsPath(path).as_posix()) return rename def load(filename): @@ -257,7 +261,7 @@ class _Rewrite(object): exclude = path self._line = line; self._original = u'-' + exclude; - if not exclude.startswith(u"/"): + if os.name != 'nt' and not exclude.startswith(u"/"): exclude = u'/' + exclude if exclude.find(u"//") != -1: raise _error(u"Illegal '//' in exclude path", line) @@ -274,14 +278,14 @@ class _Rewrite(object): include = path self._line = line; self._original = include; - if not include.startswith(u"/"): + if os.name != 'nt' and not include.startswith(u"/"): include = u'/' + include doubleslash = include.find(u"//") if doubleslash != include.find(u"//"): raise _error(u"More than one '//' in include path (project-layout)", line) if self._verify_stars.match(include): raise _error(u"Illegal use of '**' in include path (project-layout)", line) - if not virtual.startswith(u"/"): + if os.name != 'nt' and not virtual.startswith(u"/"): virtual = u"/" + virtual if virtual.endswith(u"/"): virtual = virtual[0 : -1] From 49b18db0440f798b9b034e7201893bbb67065dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 18:31:12 +0200 Subject: [PATCH 12/82] Python extractor: in overlay mode, traverse only changed files - fall back to full extraction on overlay changes json read error - we filter both root modules and (transitive) imports against the overlay-changes json. --- python/extractor/semmle/worker.py | 42 ++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 726c2c90c3b..1005842daca 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -11,6 +11,7 @@ from semmle.extractors import SuperExtractor, ModulePrinter, SkippedBuiltin from semmle.profiling import get_profiler from semmle.path_rename import renamer_from_options_and_env from semmle.logging import WARN, recursion_error_message, internal_error_message, Logger +from semmle.util import FileExtractable, FolderExtractable class ExtractorFailure(Exception): 'Generic exception representing the failure of an extractor.' @@ -19,17 +20,32 @@ class ExtractorFailure(Exception): class ModuleImportGraph(object): - def __init__(self, max_depth): + def __init__(self, max_depth, logger: Logger): self.modules = {} self.succ = defaultdict(set) self.todo = set() self.done = set() self.max_depth = max_depth + self.logger = logger + + # During overlay extraction, only traverse the files that were changed. + self.overlay_changes = None + if 'CODEQL_EXTRACTOR_PYTHON_OVERLAY_CHANGES' in os.environ: + overlay_changes_file = os.environ['CODEQL_EXTRACTOR_PYTHON_OVERLAY_CHANGES'] + logger.info("Overlay extraction mode: only extracting files changed according to '%s'", overlay_changes_file) + try: + with open(overlay_changes_file, 'r', encoding='utf-8') as f: + data = json.load(f) + changed_paths = data.get('changes', []) + self.overlay_changes = { os.path.abspath(p) for p in changed_paths } + except (IOError, ValueError) as e: + logger.warn("Failed to read overlay changes from '%s' (falling back to full extraction): %s", overlay_changes_file, e) + self.overlay_changes = None def add_root(self, mod): self.modules[mod] = 0 if mod not in self.done: - self.todo.add(mod) + self.add_todo(mod) def add_import(self, mod, imported): assert mod in self.modules @@ -39,7 +55,7 @@ class ModuleImportGraph(object): self._reduce_depth(imported, self.modules[mod] + 1) else: if self.modules[mod] < self.max_depth and imported not in self.done: - self.todo.add(imported) + self.add_todo(imported) self.modules[imported] = self.modules[mod] + 1 def _reduce_depth(self, mod, depth): @@ -48,7 +64,7 @@ class ModuleImportGraph(object): if depth > self.max_depth: return if mod not in self.done: - self.todo.add(mod) + self.add_todo(mod) self.modules[mod] = depth for imp in self.succ[mod]: self._reduce_depth(imp, depth+1) @@ -61,11 +77,25 @@ class ModuleImportGraph(object): def push_back(self, mod): self.done.remove(mod) - self.todo.add(mod) + self.add_todo(mod) def empty(self): return not self.todo + def add_todo(self, mod): + if not self._module_in_overlay_changes(mod): + self.logger.debug("Skipping module '%s' as it was not changed in overlay extraction.", mod) + return + self.todo.add(mod) + + def _module_in_overlay_changes(self, mod): + if self.overlay_changes is not None: + if isinstance(mod, FileExtractable): + return mod.path in self.overlay_changes + if isinstance(mod, FolderExtractable): + return mod.path + '/__init__.py' in self.overlay_changes + return True + class ExtractorPool(object): '''Pool of worker processes running extractors''' @@ -90,7 +120,7 @@ class ExtractorPool(object): self.enqueued = set() self.done = set() self.requirements = {} - self.import_graph = ModuleImportGraph(options.max_import_depth) + self.import_graph = ModuleImportGraph(options.max_import_depth, logger) logger.debug("Source archive: %s", archive) self.logger = logger DiagnosticsWriter.create_output_dir() From 6f208e9decf8eb053c8d73be61fa5af422958984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 11 Aug 2025 18:55:09 +0200 Subject: [PATCH 13/82] Write overlay metadata at end of extraction. --- python/extractor/semmle/worker.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 1005842daca..96761a01c77 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -192,6 +192,10 @@ class ExtractorPool(object): self.module_queue.put(None) for p in self.procs: p.join() + if 'CODEQL_EXTRACTOR_PYTHON_OVERLAY_BASE_METADATA_OUT' in os.environ: + with open(os.environ['CODEQL_EXTRACTOR_PYTHON_OVERLAY_BASE_METADATA_OUT'], 'w', encoding='utf-8') as f: + metadata = {} + json.dump(metadata, f) self.logger.info("Processed %d modules in %0.2fs", len(self.import_graph.done), time.time() - self.start_time) def stop(self, timeout=2.0): From 1a9683f98663e442752f0cbbbc101948667090bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Wed, 1 Oct 2025 14:24:15 +0200 Subject: [PATCH 14/82] Add `@top` database type --- .../old.dbscheme | 1261 +++++++++++++++++ .../semmlecode.python.dbscheme | 1252 ++++++++++++++++ .../upgrade.properties | 2 + python/extractor/semmle/dbscheme.template | 9 + python/ql/lib/semmlecode.python.dbscheme | 9 + .../old.dbscheme | 1252 ++++++++++++++++ .../semmlecode.python.dbscheme | 1261 +++++++++++++++++ .../upgrade.properties | 2 + 8 files changed, 5048 insertions(+) create mode 100644 python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/old.dbscheme create mode 100644 python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/semmlecode.python.dbscheme create mode 100644 python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/upgrade.properties create mode 100644 python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme create mode 100644 python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme create mode 100644 python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties diff --git a/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/old.dbscheme b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/old.dbscheme new file mode 100644 index 00000000000..acf8d3b08ae --- /dev/null +++ b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/old.dbscheme @@ -0,0 +1,1261 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/** The union of all Python database entities */ +@top = + @py_source_element | @py_object | @py_base_var | @location | @py_line | @py_comment | + @py_expr_parent | @py_expr_context | + @py_operator | @py_boolop | @py_cmpop | @py_unaryop | + @py_cmpop_list | @py_alias_list | @py_StringPart_list | @py_comprehension_list | @py_dict_item_list | @py_pattern_list | @py_stmt_list | @py_str_list | @py_type_parameter_list | + @externalDefect | @externalMetric | @externalDataElement | @duplication_or_similarity | @svnentry | + @xmllocatable | @yaml_locatable; diff --git a/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/semmlecode.python.dbscheme b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/semmlecode.python.dbscheme new file mode 100644 index 00000000000..6a1f497168d --- /dev/null +++ b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/semmlecode.python.dbscheme @@ -0,0 +1,1252 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/upgrade.properties b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/upgrade.properties new file mode 100644 index 00000000000..63392513719 --- /dev/null +++ b/python/downgrades/acf8d3b08ae3cfac8833d16efbfa5a10fef86819/upgrade.properties @@ -0,0 +1,2 @@ +description: Add @top type +compatibility: full diff --git a/python/extractor/semmle/dbscheme.template b/python/extractor/semmle/dbscheme.template index 43015df66f4..6b320aafab6 100644 --- a/python/extractor/semmle/dbscheme.template +++ b/python/extractor/semmle/dbscheme.template @@ -436,3 +436,12 @@ py_decorated_object(int object : @py_object ref, @py_object = @py_cobject | @py_flow_node; @py_source_element = @py_ast_node | @container; + +/** The union of all Python database entities */ +@top = + @py_source_element | @py_object | @py_base_var | @location | @py_line | @py_comment | + @py_expr_parent | @py_expr_context | + @py_operator | @py_boolop | @py_cmpop | @py_unaryop | + @py_cmpop_list | @py_alias_list | @py_StringPart_list | @py_comprehension_list | @py_dict_item_list | @py_pattern_list | @py_stmt_list | @py_str_list | @py_type_parameter_list | + @externalDefect | @externalMetric | @externalDataElement | @duplication_or_similarity | @svnentry | + @xmllocatable | @yaml_locatable; diff --git a/python/ql/lib/semmlecode.python.dbscheme b/python/ql/lib/semmlecode.python.dbscheme index 6a1f497168d..acf8d3b08ae 100644 --- a/python/ql/lib/semmlecode.python.dbscheme +++ b/python/ql/lib/semmlecode.python.dbscheme @@ -1250,3 +1250,12 @@ py_decorated_object(int object : @py_object ref, @py_object = @py_cobject | @py_flow_node; @py_source_element = @py_ast_node | @container; + +/** The union of all Python database entities */ +@top = + @py_source_element | @py_object | @py_base_var | @location | @py_line | @py_comment | + @py_expr_parent | @py_expr_context | + @py_operator | @py_boolop | @py_cmpop | @py_unaryop | + @py_cmpop_list | @py_alias_list | @py_StringPart_list | @py_comprehension_list | @py_dict_item_list | @py_pattern_list | @py_stmt_list | @py_str_list | @py_type_parameter_list | + @externalDefect | @externalMetric | @externalDataElement | @duplication_or_similarity | @svnentry | + @xmllocatable | @yaml_locatable; diff --git a/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme new file mode 100644 index 00000000000..6a1f497168d --- /dev/null +++ b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/old.dbscheme @@ -0,0 +1,1252 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme new file mode 100644 index 00000000000..acf8d3b08ae --- /dev/null +++ b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/semmlecode.python.dbscheme @@ -0,0 +1,1261 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ +/* ParamSpec.default = 2, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ +/* TypeVar.default = 3, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ +/* TypeVarTuple.default = 2, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/** The union of all Python database entities */ +@top = + @py_source_element | @py_object | @py_base_var | @location | @py_line | @py_comment | + @py_expr_parent | @py_expr_context | + @py_operator | @py_boolop | @py_cmpop | @py_unaryop | + @py_cmpop_list | @py_alias_list | @py_StringPart_list | @py_comprehension_list | @py_dict_item_list | @py_pattern_list | @py_stmt_list | @py_str_list | @py_type_parameter_list | + @externalDefect | @externalMetric | @externalDataElement | @duplication_or_similarity | @svnentry | + @xmllocatable | @yaml_locatable; diff --git a/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties new file mode 100644 index 00000000000..63392513719 --- /dev/null +++ b/python/ql/lib/upgrades/6a1f497168da2f43828161d3c86db7d4c94c2b53/upgrade.properties @@ -0,0 +1,2 @@ +description: Add @top type +compatibility: full From 7174d4c8ba2c1f5f01d5d53398257d9fcef69f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Mon, 18 Aug 2025 19:45:37 +0200 Subject: [PATCH 15/82] Overlay.qll: discard predicates for dbscheme elements with direct or indirect location links in dbscheme. - Unify discardable entities under one Discardable superclass. - Two discard predicates depending on TRAP ID type. - Future-proof the XML and Yaml discard predicates for when their extractors become incremental. --- python/ql/lib/python.qll | 1 + python/ql/lib/semmle/python/Overlay.qll | 355 ++++++++++++++++++++++++ 2 files changed, 356 insertions(+) create mode 100644 python/ql/lib/semmle/python/Overlay.qll diff --git a/python/ql/lib/python.qll b/python/ql/lib/python.qll index 24744d005a1..b08f0ae35bb 100644 --- a/python/ql/lib/python.qll +++ b/python/ql/lib/python.qll @@ -37,6 +37,7 @@ import semmle.python.pointsto.CallGraph import semmle.python.objects.ObjectAPI import semmle.python.Unit import site +private import semmle.python.Overlay // Removing this import perturbs the compilation process enough that the points-to analysis gets // compiled -- and cached -- differently depending on whether the data flow library is imported. By // importing it privately here, we ensure that the points-to analysis is compiled the same way. diff --git a/python/ql/lib/semmle/python/Overlay.qll b/python/ql/lib/semmle/python/Overlay.qll new file mode 100644 index 00000000000..fa782801457 --- /dev/null +++ b/python/ql/lib/semmle/python/Overlay.qll @@ -0,0 +1,355 @@ +/** + * Defines entity discard predicates for Python overlay analysis. + */ + +/*- Predicates -*/ +/** + * Holds always for the overlay variant and never for the base variant. + * This local predicate is used to define local predicates that behave + * differently for the base and overlay variant. + */ +overlay[local] +predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +overlay[local] +private string getPathForLocation(@location loc) { + exists(@file file | locations_default(loc, file, _, _, _, _) | files(file, result)) + or + exists(@py_Module mod | locations_ast(loc, mod, _, _, _, _) | result = getPathForModule(mod)) +} + +overlay[local] +private string getPathForModule(@py_Module mod) { + exists(@container fileOrFolder | py_module_path(mod, fileOrFolder) | + result = getPathForContainer(fileOrFolder) + ) +} + +overlay[local] +private string getPathForContainer(@container fileOrFolder) { + files(fileOrFolder, result) or folders(fileOrFolder, result) +} + +/*- Discardable entities and their discard predicates -*/ +/** Python database entities that use named TRAP IDs; the rest use *-ids. */ +overlay[local] +private class NamedEntity = @py_Module or @container or @py_cobject; + +overlay[discard_entity] +private predicate discardNamedEntity(@top el) { + el instanceof NamedEntity and + // Entities with named IDs can exist both in base, overlay, or both. + exists(Discardable d | d = el | + overlayChangedFiles(d.getPath()) and + not d.existsInOverlay() + ) +} + +overlay[discard_entity] +private predicate discardStarEntity(@top el) { + not el instanceof NamedEntity and + // Entities with *-ids can exist either in base or overlay, but not both. + exists(Discardable d | d = el | + overlayChangedFiles(d.getPath()) and + d.existsInBase() + ) +} + +/** + * An abstract base class for all elements that can be discarded from the base. + */ +overlay[local] +abstract class Discardable extends @top { + /** Gets the path to the file in which this element occurs. */ + abstract string getPath(); + + /** Holds if this element exists in the base variant. */ + predicate existsInBase() { not isOverlay() and exists(this) } + + /** Holds if this element exists in the overlay variant. */ + predicate existsInOverlay() { isOverlay() and exists(this) } + + /** Gets a textual representation of this discardable element. */ + string toString() { none() } +} + +/** + * Discardable locatable AST nodes (`@py_location_parent`). + */ +overlay[local] +final private class DiscardableLocatable extends Discardable instanceof @py_location_parent { + override string getPath() { + exists(@location loc | py_locations(loc, this) | result = getPathForLocation(loc)) + } +} + +/** + * Discardable scopes (classes, functions, modules). + */ +overlay[local] +final private class DiscardableScope extends Discardable instanceof @py_scope { + override string getPath() { + exists(@location loc | py_scope_location(loc, this) | result = getPathForLocation(loc)) + or + result = getPathForModule(this) + } +} + +/** + * Discardable files and folders. + */ +overlay[local] +final private class DiscardableContainer extends Discardable instanceof @container { + override string getPath() { result = getPathForContainer(this) } +} + +/** Discardable control flow nodes */ +overlay[local] +final private class DiscardableCfgNode extends Discardable instanceof @py_flow_node { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_flow_bb_node(this, d.(@py_ast_node), _, _)) + } +} + +/** Discardable Python variables. */ +overlay[local] +final private class DiscardableVar extends Discardable instanceof @py_variable { + override string getPath() { + exists(Discardable parent | result = parent.getPath() | variable(this, parent.(@py_scope), _)) + } +} + +/** Discardable SSA variables. */ +overlay[local] +final private class DiscardableSsaVar extends Discardable instanceof @py_ssa_var { + override string getPath() { + exists(DiscardableVar other | result = other.getPath() | py_ssa_var(this, other)) + } +} + +/** Discardable locations. */ +overlay[local] +final private class DiscardableLocation extends Discardable instanceof @location { + override string getPath() { result = getPathForLocation(this) } +} + +/** Discardable lines. */ +overlay[local] +final private class DiscardableLine extends Discardable instanceof @py_line { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_line_lengths(this, d.(@py_Module), _, _)) + } +} + +/** Discardable string part lists. */ +overlay[local] +final private class DiscardableStringPartList extends Discardable instanceof @py_StringPart_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_StringPart_lists(this, d.(@py_Bytes_or_Str))) + } +} + +/** Discardable alias */ +overlay[local] +final private class DiscardableAlias extends Discardable instanceof @py_alias { + override string getPath() { + exists(DiscardableAliasList d | result = d.getPath() | py_aliases(this, d, _)) + } +} + +/** Discardable alias list */ +overlay[local] +final private class DiscardableAliasList extends Discardable instanceof @py_alias_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_alias_lists(this, d.(@py_Import))) + } +} + +/** Discardable arguments */ +overlay[local] +final private class DiscardableArguments extends Discardable instanceof @py_arguments { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_arguments(this, d.(@py_arguments_parent))) + } +} + +/** Discardable boolop */ +overlay[local] +final private class DiscardableBoolOp extends Discardable instanceof @py_boolop { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_boolops(this, _, d.(@py_BoolExpr))) + } +} + +/** Discardable cmpop */ +overlay[local] +final private class DiscardableCmpOp extends Discardable instanceof @py_cmpop { + override string getPath() { + exists(DiscardableCmpOpList d | result = d.getPath() | py_cmpops(this, _, d, _)) + } +} + +/** Discardable cmpop list */ +overlay[local] +final private class DiscardableCmpOpList extends Discardable instanceof @py_cmpop_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_cmpop_lists(this, d.(@py_Compare))) + } +} + +/** Discardable comprehension list */ +overlay[local] +final private class DiscardableComprehensionList extends Discardable instanceof @py_comprehension_list +{ + override string getPath() { + exists(Discardable d | result = d.getPath() | py_comprehension_lists(this, d.(@py_ListComp))) + } +} + +/** Discardable dict item list */ +overlay[local] +final private class DiscardableDictItemList extends Discardable instanceof @py_dict_item_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | + py_dict_item_lists(this, d.(@py_dict_item_list_parent)) + ) + } +} + +/** Discardable expr context */ +overlay[local] +final private class DiscardableExprContext extends Discardable instanceof @py_expr_context { + override string getPath() { + exists(Discardable d | result = d.getPath() | + py_expr_contexts(this, _, d.(@py_expr_context_parent)) + ) + } +} + +/** Discardable expr list */ +overlay[local] +final private class DiscardableExprList extends Discardable instanceof @py_expr_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_expr_lists(this, d.(@py_expr_list_parent), _)) + } +} + +/** Discardable operator */ +overlay[local] +final private class DiscardableOperator extends Discardable instanceof @py_operator { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_operators(this, _, d.(@py_BinaryExpr))) + } +} + +/** Discardable parameter list */ +overlay[local] +final private class DiscardableParameterList extends Discardable instanceof @py_parameter_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_parameter_lists(this, d.(@py_Function))) + } +} + +/** Discardable pattern list */ +overlay[local] +final private class DiscardablePatternList extends Discardable instanceof @py_pattern_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | + py_pattern_lists(this, d.(@py_pattern_list_parent), _) + ) + } +} + +/** Discardable stmt list */ +overlay[local] +final private class DiscardableStmtList extends Discardable instanceof @py_stmt_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_stmt_lists(this, d.(@py_stmt_list_parent), _)) + } +} + +/** Discardable str list */ +overlay[local] +final private class DiscardableStrList extends Discardable instanceof @py_str_list { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_str_lists(this, d.(@py_str_list_parent))) + } +} + +/** Discardable type parameter list */ +overlay[local] +final private class DiscardableTypeParameterList extends Discardable instanceof @py_type_parameter_list +{ + override string getPath() { + exists(Discardable d | result = d.getPath() | + py_type_parameter_lists(this, d.(@py_type_parameter_list_parent)) + ) + } +} + +/** Discardable unaryop */ +overlay[local] +final private class DiscardableUnaryOp extends Discardable instanceof @py_unaryop { + override string getPath() { + exists(Discardable d | result = d.getPath() | py_unaryops(this, _, d.(@py_UnaryExpr))) + } +} + +/** Discardable comment */ +overlay[local] +final private class DiscardableComment extends Discardable instanceof @py_comment { + override string getPath() { + exists(DiscardableLocation d | result = d.getPath() | py_comments(this, _, d)) + } +} + +/*- XML -*/ +overlay[local] +final private class DiscardableXmlLocatable extends Discardable instanceof @xmllocatable { + override string getPath() { + exists(@location loc | xmllocations(this, loc) | result = getPathForLocation(loc)) + } +} + +overlay[local] +private predicate overlayXmlExtracted(string path) { + exists(DiscardableXmlLocatable d | not files(d, _) and not xmlNs(d, _, _, _) | + d.existsInOverlay() and + path = d.getPath() + ) +} + +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable el) { + exists(DiscardableXmlLocatable d | d = el | + // The XML extractor is currently not incremental and may extract more + // XML files than those included in `overlayChangedFiles`, so this discard predicate + // handles those files alongside the normal `discardStarEntity` logic. + overlayXmlExtracted(d.getPath()) and + d.existsInBase() + ) +} + +/*- YAML -*/ +overlay[local] +final private class DiscardableYamlLocatable extends Discardable instanceof @yaml_locatable { + override string getPath() { + exists(@location loc | yaml_locations(this, loc) | result = getPathForLocation(loc)) + } +} + +overlay[local] +private predicate overlayYamlExtracted(string path) { + exists(DiscardableYamlLocatable l | l.existsInOverlay() | path = l.getPath()) +} + +overlay[discard_entity] +private predicate discardBaseYamlLocatable(@yaml_locatable el) { + exists(DiscardableYamlLocatable d | d = el | + // The Yaml extractor is currently not incremental and may extract more + // Yaml files than those included in `overlayChangedFiles`, so this discard predicate + // handles those files alongside the normal `discardStarEntity` logic. + overlayYamlExtracted(d.getPath()) and + d.existsInBase() + ) +} From 20d4e429ca49a58712a2d8820a7776b3b476c3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Thu, 2 Oct 2025 11:38:18 +0200 Subject: [PATCH 16/82] Add consistency query (exactly one path for every entity) --- .../OverlayDiscardConsistency.ql | 1 + .../OverlayDiscardConsistencyQuery.qll | 90 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 python/ql/consistency-queries/OverlayDiscardConsistency.ql create mode 100644 python/ql/lib/semmle/python/internal/OverlayDiscardConsistencyQuery.qll diff --git a/python/ql/consistency-queries/OverlayDiscardConsistency.ql b/python/ql/consistency-queries/OverlayDiscardConsistency.ql new file mode 100644 index 00000000000..d37afe1f919 --- /dev/null +++ b/python/ql/consistency-queries/OverlayDiscardConsistency.ql @@ -0,0 +1 @@ +import semmle.python.internal.OverlayDiscardConsistencyQuery diff --git a/python/ql/lib/semmle/python/internal/OverlayDiscardConsistencyQuery.qll b/python/ql/lib/semmle/python/internal/OverlayDiscardConsistencyQuery.qll new file mode 100644 index 00000000000..9cca328b02d --- /dev/null +++ b/python/ql/lib/semmle/python/internal/OverlayDiscardConsistencyQuery.qll @@ -0,0 +1,90 @@ +/** + * Provides consistency queries for checking that every database entity + * that can be discarded (i.e. everything but `@py_cobject`) in an overlay + * database is indeed discarded, by proxy of having exactly one `Discardable.getPath()`. + */ + +import python +import semmle.python.Overlay + +class TopWithToString instanceof @top { + string getDbType() { + this instanceof @py_source_element and result = "@source_element" + or + this instanceof @py_object and result = "@py_object" + or + this instanceof @py_base_var and result = "@py_base_var" + or + this instanceof @location and result = "@location" + or + this instanceof @py_line and result = "@py_line" + or + this instanceof @py_comment and result = "@py_comment" + or + this instanceof @py_expr_parent and result = "@py_expr_parent" + or + this instanceof @py_expr_context and result = "@py_expr_context" + or + this instanceof @py_operator and result = "@py_operator" + or + this instanceof @py_boolop and result = "@py_boolop" + or + this instanceof @py_cmpop and result = "@py_cmpop" + or + this instanceof @py_unaryop and result = "@py_unaryop" + or + this instanceof @py_cmpop_list and result = "@py_cmpop_list" + or + this instanceof @py_alias_list and result = "@py_alias_list" + or + this instanceof @py_StringPart_list and result = "@py_StringPart_list" + or + this instanceof @py_comprehension_list and result = "@py_comprehension_list" + or + this instanceof @py_dict_item_list and result = "@py_dict_item_list" + or + this instanceof @py_pattern_list and result = "@py_pattern_list" + or + this instanceof @py_stmt_list and result = "@py_stmt_list" + or + this instanceof @py_str_list and result = "@py_str_list" + or + this instanceof @py_type_parameter_list and result = "@py_type_parameter_list" + or + this instanceof @externalDefect and result = "@externalDefect" + or + this instanceof @externalMetric and result = "@externalMetric" + or + this instanceof @externalDataElement and result = "@externalDataElement" + or + this instanceof @duplication_or_similarity and result = "@duplication_or_similarity" + or + this instanceof @svnentry and result = "@svnentry" + or + this instanceof @xmllocatable and result = "@xmllocatable" + or + this instanceof @yaml_locatable and result = "@yaml_locatable" + } + + string toString() { + result = this.getDbType() + or + not exists(this.getDbType()) and + result = "Unknown type" + } +} + +query predicate consistencyTest(TopWithToString el, string message) { + not el instanceof Discardable and + not el instanceof @py_cobject and // cannot be linked to a path + not el instanceof @externalDataElement and // cannot be linked to a path + message = "Not Discardable" + or + exists(Discardable d, int numPaths | d = el and numPaths = count(d.getPath()) | + numPaths = 0 and + message = "Discardable but no path found" + or + numPaths > 1 and + message = "Discardable but multiple paths found (" + concat(d.getPath(), ", ") + ")" + ) +} From 9d7c52423a95b13e45f5a18a27c49f44e9391a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Thu, 2 Oct 2025 16:41:06 +0200 Subject: [PATCH 17/82] Basic python overlay tests The base source is in basic-overlay-eval/orig_src, the overlay source is in basic-full-eval. We run two tests: a full evaluation test in basic-full-eval, and an overlay evaluation test in basic-overlay-eval. The test source and expected results are the SAME, due to the .qlref, meaning we expect the same results for full and overlay evaluation. --- .../overlay/basic-full-eval/greeting.py | 5 + .../overlay/basic-full-eval/hello.py | 4 + .../overlay/basic-full-eval/lib/__init__.py | 1 + .../overlay/basic-full-eval/new.py | 2 + .../overlay/basic-full-eval/options | 1 + .../overlay/basic-full-eval/test.expected | 152 ++++++++++++++++++ .../overlay/basic-full-eval/test.ql | 19 +++ .../basic-overlay-eval/codeql-test.yml | 3 + .../overlay/basic-overlay-eval/options | 1 + .../basic-overlay-eval/orig_src/greeting.py | 5 + .../basic-overlay-eval/orig_src/hello.py | 4 + .../orig_src/lib/__init__.py | 1 + .../basic-overlay-eval/orig_src/old.py | 2 + .../overlay/basic-overlay-eval/test.qlref | 1 + 14 files changed, 201 insertions(+) create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/greeting.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/hello.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/lib/__init__.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/new.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/options create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/test.expected create mode 100644 python/ql/test/extractor-tests/overlay/basic-full-eval/test.ql create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/codeql-test.yml create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/options create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/greeting.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/hello.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/lib/__init__.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/old.py create mode 100644 python/ql/test/extractor-tests/overlay/basic-overlay-eval/test.qlref diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/greeting.py b/python/ql/test/extractor-tests/overlay/basic-full-eval/greeting.py new file mode 100644 index 00000000000..8bff5db5bbf --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/greeting.py @@ -0,0 +1,5 @@ +from new import * +from lib import * + +def get_greeting(): + return combine("Goodbye", get_new_target()) diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/hello.py b/python/ql/test/extractor-tests/overlay/basic-full-eval/hello.py new file mode 100644 index 00000000000..2744a6c2978 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/hello.py @@ -0,0 +1,4 @@ +from greeting import * + +if __name__ == "__main__": + print(get_greeting()) diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/lib/__init__.py b/python/ql/test/extractor-tests/overlay/basic-full-eval/lib/__init__.py new file mode 100644 index 00000000000..b3587542d9b --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/lib/__init__.py @@ -0,0 +1 @@ +def combine(a, b): return f"{a}, {b}!" diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/new.py b/python/ql/test/extractor-tests/overlay/basic-full-eval/new.py new file mode 100644 index 00000000000..25722f63b07 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/new.py @@ -0,0 +1,2 @@ +def get_new_target(): + return "世界" diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/options b/python/ql/test/extractor-tests/overlay/basic-full-eval/options new file mode 100644 index 00000000000..4f6e4043862 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/options @@ -0,0 +1 @@ +semmle-extractor-options: -R . -m hello.py --filter exclude:**/*.testproj/** diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/test.expected b/python/ql/test/extractor-tests/overlay/basic-full-eval/test.expected new file mode 100644 index 00000000000..523e2eb8883 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/test.expected @@ -0,0 +1,152 @@ +testStringLiterals +| greeting.py:5:20:5:28 | StringLiteral | Goodbye | +| hello.py:3:16:3:25 | StringLiteral | __main__ | +| lib/__init__.py:1:27:1:29 | StringLiteral | | +| lib/__init__.py:1:31:1:34 | StringLiteral | , | +| lib/__init__.py:1:36:1:38 | StringLiteral | ! | +| new.py:2:12:2:15 | StringLiteral | \u4e16\u754c | +testModules +| greeting.py:0:0:0:0 | Module greeting | +| hello.py:0:0:0:0 | Module hello | +| lib/__init__.py:0:0:0:0 | Module lib.__init__ | +| lib:0:0:0:0 | Package lib | +| new.py:0:0:0:0 | Module new | +testFunctions +| greeting.py:4:1:4:19 | Function get_greeting | +| lib/__init__.py:1:1:1:18 | Function combine | +| new.py:1:1:1:21 | Function get_new_target | +testClasses +testLocations +| greeting.py:0:0:0:0 | greeting.py:0 | +| greeting.py:1:1:1:17 | greeting.py:1 | +| greeting.py:1:6:1:8 | greeting.py:1 | +| greeting.py:2:1:2:17 | greeting.py:2 | +| greeting.py:2:6:2:8 | greeting.py:2 | +| greeting.py:4:1:4:19 | greeting.py:4 | +| greeting.py:4:1:4:19 | greeting.py:4 | +| greeting.py:4:1:4:19 | greeting.py:4 | +| greeting.py:4:5:4:16 | greeting.py:4 | +| greeting.py:5:5:5:47 | greeting.py:5 | +| greeting.py:5:12:5:18 | greeting.py:5 | +| greeting.py:5:12:5:47 | greeting.py:5 | +| greeting.py:5:20:5:28 | greeting.py:5 | +| greeting.py:5:31:5:44 | greeting.py:5 | +| greeting.py:5:31:5:46 | greeting.py:5 | +| hello.py:0:0:0:0 | hello.py:0 | +| hello.py:1:1:1:22 | hello.py:1 | +| hello.py:1:6:1:13 | hello.py:1 | +| hello.py:3:1:3:26 | hello.py:3 | +| hello.py:3:4:3:11 | hello.py:3 | +| hello.py:3:4:3:25 | hello.py:3 | +| hello.py:3:16:3:25 | hello.py:3 | +| hello.py:4:5:4:9 | hello.py:4 | +| hello.py:4:5:4:25 | hello.py:4 | +| hello.py:4:5:4:25 | hello.py:4 | +| hello.py:4:11:4:22 | hello.py:4 | +| hello.py:4:11:4:24 | hello.py:4 | +| lib/__init__.py:0:0:0:0 | lib/__init__.py:0 | +| lib/__init__.py:1:1:1:18 | lib/__init__.py:1 | +| lib/__init__.py:1:1:1:18 | lib/__init__.py:1 | +| lib/__init__.py:1:1:1:18 | lib/__init__.py:1 | +| lib/__init__.py:1:5:1:11 | lib/__init__.py:1 | +| lib/__init__.py:1:13:1:13 | lib/__init__.py:1 | +| lib/__init__.py:1:16:1:16 | lib/__init__.py:1 | +| lib/__init__.py:1:20:1:38 | lib/__init__.py:1 | +| lib/__init__.py:1:27:1:29 | lib/__init__.py:1 | +| lib/__init__.py:1:27:1:38 | lib/__init__.py:1 | +| lib/__init__.py:1:30:1:30 | lib/__init__.py:1 | +| lib/__init__.py:1:31:1:34 | lib/__init__.py:1 | +| lib/__init__.py:1:35:1:35 | lib/__init__.py:1 | +| lib/__init__.py:1:36:1:38 | lib/__init__.py:1 | +| lib:0:0:0:0 | lib:0 | +| new.py:0:0:0:0 | new.py:0 | +| new.py:1:1:1:21 | new.py:1 | +| new.py:1:1:1:21 | new.py:1 | +| new.py:1:1:1:21 | new.py:1 | +| new.py:1:5:1:18 | new.py:1 | +| new.py:2:5:2:15 | new.py:2 | +| new.py:2:12:2:15 | new.py:2 | +testFiles +| greeting.py:0:0:0:0 | greeting.py | +| hello.py:0:0:0:0 | hello.py | +| lib/__init__.py:0:0:0:0 | lib/__init__.py | +| new.py:0:0:0:0 | new.py | +testCfgNodes +| greeting.py:0:0:0:0 | Entry node for Module greeting | +| greeting.py:0:0:0:0 | Exit node for Module greeting | +| greeting.py:1:1:1:17 | ControlFlowNode for from new import * | +| greeting.py:1:6:1:8 | ControlFlowNode for ImportExpr | +| greeting.py:2:1:2:17 | ControlFlowNode for from lib import * | +| greeting.py:2:6:2:8 | ControlFlowNode for ImportExpr | +| greeting.py:4:1:4:19 | ControlFlowNode for FunctionExpr | +| greeting.py:4:1:4:19 | Entry node for Function get_greeting | +| greeting.py:4:1:4:19 | Exit node for Function get_greeting | +| greeting.py:4:5:4:16 | ControlFlowNode for get_greeting | +| greeting.py:5:5:5:47 | ControlFlowNode for Return | +| greeting.py:5:12:5:18 | ControlFlowNode for combine | +| greeting.py:5:12:5:47 | ControlFlowNode for combine() | +| greeting.py:5:20:5:28 | ControlFlowNode for StringLiteral | +| greeting.py:5:31:5:44 | ControlFlowNode for get_new_target | +| greeting.py:5:31:5:46 | ControlFlowNode for get_new_target() | +| hello.py:0:0:0:0 | Entry node for Module hello | +| hello.py:0:0:0:0 | Exit node for Module hello | +| hello.py:1:1:1:22 | ControlFlowNode for from greeting import * | +| hello.py:1:6:1:13 | ControlFlowNode for ImportExpr | +| hello.py:3:4:3:11 | ControlFlowNode for __name__ | +| hello.py:3:4:3:25 | ControlFlowNode for Compare | +| hello.py:3:16:3:25 | ControlFlowNode for StringLiteral | +| hello.py:4:5:4:9 | ControlFlowNode for print | +| hello.py:4:5:4:25 | ControlFlowNode for print() | +| hello.py:4:11:4:22 | ControlFlowNode for get_greeting | +| hello.py:4:11:4:24 | ControlFlowNode for get_greeting() | +| lib/__init__.py:0:0:0:0 | Entry node for Module lib.__init__ | +| lib/__init__.py:0:0:0:0 | Exit node for Module lib.__init__ | +| lib/__init__.py:1:1:1:18 | ControlFlowNode for FunctionExpr | +| lib/__init__.py:1:1:1:18 | Entry node for Function combine | +| lib/__init__.py:1:1:1:18 | Exit node for Function combine | +| lib/__init__.py:1:5:1:11 | ControlFlowNode for combine | +| lib/__init__.py:1:13:1:13 | ControlFlowNode for a | +| lib/__init__.py:1:16:1:16 | ControlFlowNode for b | +| lib/__init__.py:1:20:1:38 | ControlFlowNode for Return | +| lib/__init__.py:1:27:1:29 | ControlFlowNode for StringLiteral | +| lib/__init__.py:1:27:1:38 | ControlFlowNode for Fstring | +| lib/__init__.py:1:30:1:30 | ControlFlowNode for a | +| lib/__init__.py:1:31:1:34 | ControlFlowNode for StringLiteral | +| lib/__init__.py:1:35:1:35 | ControlFlowNode for b | +| lib/__init__.py:1:36:1:38 | ControlFlowNode for StringLiteral | +| lib:0:0:0:0 | Entry node for Package lib | +| new.py:0:0:0:0 | Entry node for Module new | +| new.py:0:0:0:0 | Exit node for Module new | +| new.py:1:1:1:21 | ControlFlowNode for FunctionExpr | +| new.py:1:1:1:21 | Entry node for Function get_new_target | +| new.py:1:1:1:21 | Exit node for Function get_new_target | +| new.py:1:5:1:18 | ControlFlowNode for get_new_target | +| new.py:2:5:2:15 | ControlFlowNode for Return | +| new.py:2:12:2:15 | ControlFlowNode for StringLiteral | +testSsaVars +| file://:0:0:0:0 | SSA Variable __name__ | +| file://:0:0:0:0 | SSA Variable get_greeting | +| file://:0:0:0:0 | SSA Variable print | +| greeting.py:4:5:4:16 | SSA Variable get_greeting | +| lib/__init__.py:1:5:1:11 | SSA Variable combine | +| lib/__init__.py:1:13:1:13 | SSA Variable a | +| lib/__init__.py:1:16:1:16 | SSA Variable b | +| new.py:1:5:1:18 | SSA Variable get_new_target | +testVars +| Global Variable __name__ | greeting.py:0:0:0:0 | Module greeting | +| Global Variable __name__ | hello.py:0:0:0:0 | Module hello | +| Global Variable __name__ | lib/__init__.py:0:0:0:0 | Module lib.__init__ | +| Global Variable __name__ | new.py:0:0:0:0 | Module new | +| Global Variable __package__ | greeting.py:0:0:0:0 | Module greeting | +| Global Variable __package__ | hello.py:0:0:0:0 | Module hello | +| Global Variable __package__ | lib/__init__.py:0:0:0:0 | Module lib.__init__ | +| Global Variable __package__ | new.py:0:0:0:0 | Module new | +| Global Variable combine | greeting.py:0:0:0:0 | Module greeting | +| Global Variable combine | lib/__init__.py:0:0:0:0 | Module lib.__init__ | +| Global Variable get_greeting | greeting.py:0:0:0:0 | Module greeting | +| Global Variable get_greeting | hello.py:0:0:0:0 | Module hello | +| Global Variable get_new_target | greeting.py:0:0:0:0 | Module greeting | +| Global Variable get_new_target | new.py:0:0:0:0 | Module new | +| Global Variable print | hello.py:0:0:0:0 | Module hello | +| Local Variable a | lib/__init__.py:1:1:1:18 | Function combine | +| Local Variable b | lib/__init__.py:1:1:1:18 | Function combine | diff --git a/python/ql/test/extractor-tests/overlay/basic-full-eval/test.ql b/python/ql/test/extractor-tests/overlay/basic-full-eval/test.ql new file mode 100644 index 00000000000..469fb9118f0 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-full-eval/test.ql @@ -0,0 +1,19 @@ +import python + +query predicate testStringLiterals(StringLiteral l, string text) { l.getText() = text } + +query predicate testModules(Module m) { any() } + +query predicate testFunctions(Function f) { any() } + +query predicate testClasses(Class c) { any() } + +query predicate testLocations(Location l) { any() } + +query predicate testFiles(File f) { any() } + +query predicate testCfgNodes(ControlFlowNode n) { any() } + +query predicate testSsaVars(SsaVariable var) { any() } + +query predicate testVars(Variable var, Scope s) { s = var.getScope() } diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/codeql-test.yml b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/codeql-test.yml new file mode 100644 index 00000000000..b0ad72e42d8 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/codeql-test.yml @@ -0,0 +1,3 @@ +overlay: + base: "orig_src" + overlay: "../basic-full-eval" diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/options b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/options new file mode 100644 index 00000000000..4f6e4043862 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/options @@ -0,0 +1 @@ +semmle-extractor-options: -R . -m hello.py --filter exclude:**/*.testproj/** diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/greeting.py b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/greeting.py new file mode 100644 index 00000000000..5b16454e2c6 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/greeting.py @@ -0,0 +1,5 @@ +from old import * +from lib import * + +def get_greeting(): + return combine("Hello", get_old_target()) diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/hello.py b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/hello.py new file mode 100644 index 00000000000..2744a6c2978 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/hello.py @@ -0,0 +1,4 @@ +from greeting import * + +if __name__ == "__main__": + print(get_greeting()) diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/lib/__init__.py b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/lib/__init__.py new file mode 100644 index 00000000000..b3587542d9b --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/lib/__init__.py @@ -0,0 +1 @@ +def combine(a, b): return f"{a}, {b}!" diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/old.py b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/old.py new file mode 100644 index 00000000000..8dc6e3416fb --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/orig_src/old.py @@ -0,0 +1,2 @@ +def get_old_target(): + return "World" diff --git a/python/ql/test/extractor-tests/overlay/basic-overlay-eval/test.qlref b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/test.qlref new file mode 100644 index 00000000000..961494fbda1 --- /dev/null +++ b/python/ql/test/extractor-tests/overlay/basic-overlay-eval/test.qlref @@ -0,0 +1 @@ +../basic-full-eval/test.ql From ece121070bde6b85ae89f53f88b6dd62fddbcfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Thu, 2 Oct 2025 18:03:11 +0200 Subject: [PATCH 18/82] Add change note. --- .../2025-10-02-python-overlay-compilation-plus-extractor.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 python/ql/lib/change-notes/2025-10-02-python-overlay-compilation-plus-extractor.md diff --git a/python/ql/lib/change-notes/2025-10-02-python-overlay-compilation-plus-extractor.md b/python/ql/lib/change-notes/2025-10-02-python-overlay-compilation-plus-extractor.md new file mode 100644 index 00000000000..5eb698354c1 --- /dev/null +++ b/python/ql/lib/change-notes/2025-10-02-python-overlay-compilation-plus-extractor.md @@ -0,0 +1,5 @@ +--- +category: feature +--- + +* Initial support for incremental Python databases via `codeql database create --overlay-base`/`--overlay-changes`. From c749607db802e9e48c08274a1dad48d39938e35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nora=20Dimitrijevi=C4=87?= Date: Tue, 7 Oct 2025 11:22:16 +0200 Subject: [PATCH 19/82] Bump python extractor version to 7.1.5 --- python/extractor/semmle/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 8196f76e437..2f6a18ac7a9 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ from io import BytesIO #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.4" +VERSION = "7.1.5" PY_EXTENSIONS = ".py", ".pyw" From 101d2ddd4f7c3a89e39cdfe1c772e86769c39fdb Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 7 Oct 2025 12:12:49 +0100 Subject: [PATCH 20/82] Use new team for shared library reviewers --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 9b3e04029e0..84cff64ff15 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -9,7 +9,7 @@ /python/ @github/codeql-python /ruby/ @github/codeql-ruby /rust/ @github/codeql-rust -/shared/ @aschackmull @hvitved @owen-mc +/shared/ @github/codeql-shared-libraries-reviewers /swift/ @github/codeql-swift /misc/codegen/ @github/codeql-swift /java/kotlin-extractor/ @github/codeql-kotlin From f83b80a584eb0fd119c74624166fbc6d59383a9a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 7 Oct 2025 12:32:38 +0100 Subject: [PATCH 21/82] Add `codeql-alert-coverage-eng` as catch-all --- CODEOWNERS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CODEOWNERS b/CODEOWNERS index 84cff64ff15..dabe5a869d5 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,7 @@ +# Catch-all for anything which isn't matched by a line lower down +* @github/codeql-alert-coverage-eng + +# CodeQL language libraries /actions/ @github/codeql-dynamic /cpp/ @github/codeql-c-analysis /csharp/ @github/codeql-csharp From db9bb8389850a0492b3c02a34f20072310a9599d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 7 Oct 2025 12:33:32 +0100 Subject: [PATCH 22/82] Move rule for `/ql/` for consistency --- CODEOWNERS | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index dabe5a869d5..472edff683b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,6 +11,7 @@ /java/ @github/codeql-java /javascript/ @github/codeql-javascript /python/ @github/codeql-python +/ql/ @github/codeql-ql-for-ql-reviewers /ruby/ @github/codeql-ruby /rust/ @github/codeql-rust /shared/ @github/codeql-shared-libraries-reviewers @@ -30,9 +31,6 @@ /docs/codeql/ql-language-reference/ @github/codeql-frontend-reviewers /docs/query-*-style-guide.md @github/codeql-analysis-reviewers -# QL for QL reviewers -/ql/ @github/codeql-ql-for-ql-reviewers - # Bazel (excluding BUILD.bazel files) MODULE.bazel @github/codeql-ci-reviewers .bazelversion @github/codeql-ci-reviewers From 8a2be0910ccc7420e9074b005af888de420c5b8d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:10:31 +0100 Subject: [PATCH 23/82] Rust: Add change note for Rust GA. --- rust/ql/lib/change-notes/2025-10-07-rust-ga.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2025-10-07-rust-ga.md diff --git a/rust/ql/lib/change-notes/2025-10-07-rust-ga.md b/rust/ql/lib/change-notes/2025-10-07-rust-ga.md new file mode 100644 index 00000000000..f24f4f6e4c3 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-10-07-rust-ga.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Rust analysis is now Generally Available (GA). From 90db349f4bf623498d1b86bbf94495339824b90b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 8 Oct 2025 14:05:00 +0100 Subject: [PATCH 24/82] State that ruby broken crypto algo doesn't deal with hashing --- .../queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp index cede4e735d5..d793312c45d 100644 --- a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp +++ b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp @@ -13,6 +13,12 @@ algorithm means that encrypted or hashed data is less secure than it appears to be.

+

+ This query alerts on any use of a weak cryptographic algorithm, that is + not a hashing algorithm. Use of broken or weak cryptographic hash + functions are handled by the + rb/weak-sensitive-data-hashing query. +

From 2a1c9d8ec15d6fe5fd169c33294498b2603eb67b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 8 Oct 2025 14:08:36 +0100 Subject: [PATCH 25/82] Remove erroneous comma --- python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp | 2 +- .../ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp | 2 +- .../ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp index 1b26d30e0fe..a457db90431 100644 --- a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -16,7 +16,7 @@

- This query alerts on any use of a weak cryptographic algorithm, that is + This query alerts on any use of a weak cryptographic algorithm that is not a hashing algorithm. Use of broken or weak cryptographic hash functions are handled by the py/weak-sensitive-data-hashing query. diff --git a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp index d793312c45d..3346d3f7015 100644 --- a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp +++ b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp @@ -14,7 +14,7 @@ secure than it appears to be.

- This query alerts on any use of a weak cryptographic algorithm, that is + This query alerts on any use of a weak cryptographic algorithm that is not a hashing algorithm. Use of broken or weak cryptographic hash functions are handled by the rb/weak-sensitive-data-hashing query. diff --git a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp index e24222e09fc..7bc1eb018e2 100644 --- a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -16,7 +16,7 @@

- This query alerts on any use of a weak cryptographic algorithm, that is + This query alerts on any use of a weak cryptographic algorithm that is not a hashing algorithm. Use of broken or weak cryptographic hash functions are handled by the rust/weak-sensitive-data-hashing query. From 0bcdb91639f5433b2a2f2b64c52b64f02b14b134 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 8 Oct 2025 14:10:54 +0100 Subject: [PATCH 26/82] Improve qhelp for broken crypto algo queries Previously it focussed too much on the risk of data being decrypted, and didn't explain why using weak algorithms is a problem in other contexts. --- .../CWE/CWE-327/BrokenCryptoAlgorithm.qhelp | 12 ++++-- .../CWE/CWE-327/BrokenCryptoAlgorithm.qhelp | 12 ++++-- .../CWE-327/BrokenCryptoAlgorithm.qhelp | 29 ++++++++++++--- .../CWE-327/BrokenCryptoAlgorithm.qhelp | 30 ++++++++++++--- .../cwe-327/BrokenCryptoAlgorithm.qhelp | 30 ++++++++++++--- .../CWE-327/BrokenCryptoAlgorithm.qhelp | 37 ++++++++++++++----- 6 files changed, 114 insertions(+), 36 deletions(-) diff --git a/cpp/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp b/cpp/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp index 0fcbd89d892..33561b3d1bf 100644 --- a/cpp/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/cpp/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -3,11 +3,15 @@ "qhelp.dtd"> -

Using broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.

+

Using broken or weak cryptographic algorithms may compromise security guarantees such as confidentiality, integrity, and authenticity.

-

Many cryptographic algorithms provided by cryptography libraries are known to be weak, or -flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted -data.

+

Many cryptographic algorithms are known to be weak or flawed. The security guarantees of a system often rely on the underlying cryptography, so using a weak algorithm can have severe consequences. For example: +

+
    +
  • If a weak encryption algorithm is used, an attacker may be able to decrypt sensitive data.
  • +
  • If a weak hashing algorithm is used to protect data integrity, an attacker may be able to craft a malicious input that has the same hash as a benign one.
  • +
  • If a weak algorithm is used for digital signatures, an attacker may be able to forge signatures and impersonate legitimate users.
  • +
diff --git a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp index 1d8e8db6798..35b37b9f814 100644 --- a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -3,11 +3,15 @@ "qhelp.dtd"> -

Using broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.

+

Using broken or weak cryptographic algorithms may compromise security guarantees such as confidentiality, integrity, and authenticity.

-

Many cryptographic algorithms provided by cryptography libraries are known to be weak, or -flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted -data.

+

Many cryptographic algorithms are known to be weak or flawed. The security guarantees of a system often rely on the underlying cryptography, so using a weak algorithm can have severe consequences. For example: +

+
    +
  • If a weak encryption algorithm is used, an attacker may be able to decrypt sensitive data.
  • +
  • If a weak hashing algorithm is used to protect data integrity, an attacker may be able to craft a malicious input that has the same hash as a benign one.
  • +
  • If a weak algorithm is used for digital signatures, an attacker may be able to forge signatures and impersonate legitimate users.
  • +
diff --git a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp index e0ccf71572f..bdd1071b613 100644 --- a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -4,17 +4,34 @@

- Using broken or weak cryptographic algorithms can leave data - vulnerable to being decrypted or forged by an attacker. + Using broken or weak cryptographic algorithms may compromise + security guarantees such as confidentiality, integrity, and + authenticity.

- Many cryptographic algorithms provided by cryptography - libraries are known to be weak, or flawed. Using such an - algorithm means that encrypted or hashed data is less - secure than it appears to be. + Many cryptographic algorithms are known to be weak or flawed. The + security guarantees of a system often rely on the underlying + cryptography, so using a weak algorithm can have severe consequences. + For example:

+
    +
  • + If a weak encryption algorithm is used, an attacker may be able to + decrypt sensitive data. +
  • +
  • + If a weak hashing algorithm is used to protect data integrity, an + attacker may be able to craft a malicious input that has the same + hash as a benign one. +
  • +
  • + If a weak algorithm is used for digital signatures, an attacker may + be able to forge signatures and impersonate legitimate users. +
  • +
+
diff --git a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp index a457db90431..003849b17cc 100644 --- a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -3,18 +3,36 @@ "qhelp.dtd"> +

- Using broken or weak cryptographic algorithms can leave data - vulnerable to being decrypted or forged by an attacker. + Using broken or weak cryptographic algorithms may compromise + security guarantees such as confidentiality, integrity, and + authenticity.

- Many cryptographic algorithms provided by cryptography - libraries are known to be weak, or flawed. Using such an - algorithm means that encrypted or hashed data is less - secure than it appears to be. + Many cryptographic algorithms are known to be weak or flawed. The + security guarantees of a system often rely on the underlying + cryptography, so using a weak algorithm can have severe consequences. + For example:

+
    +
  • + If a weak encryption algorithm is used, an attacker may be able to + decrypt sensitive data. +
  • +
  • + If a weak hashing algorithm is used to protect data integrity, an + attacker may be able to craft a malicious input that has the same + hash as a benign one. +
  • +
  • + If a weak algorithm is used for digital signatures, an attacker may + be able to forge signatures and impersonate legitimate users. +
  • +
+

This query alerts on any use of a weak cryptographic algorithm that is not a hashing algorithm. Use of broken or weak cryptographic hash diff --git a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp index 3346d3f7015..3c4dae2ae7b 100644 --- a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp +++ b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp @@ -4,15 +4,33 @@

- Using broken or weak cryptographic algorithms can leave data - vulnerable to being decrypted or forged by an attacker. + Using broken or weak cryptographic algorithms may compromise + security guarantees such as confidentiality, integrity, and + authenticity.

+

- Many cryptographic algorithms provided by cryptography - libraries are known to be weak, or flawed. Using such an - algorithm means that encrypted or hashed data is less - secure than it appears to be. + Many cryptographic algorithms are known to be weak or flawed. The + security guarantees of a system often rely on the underlying + cryptography, so using a weak algorithm can have severe consequences. + For example:

+ +
    +
  • + If a weak encryption algorithm is used, an attacker may be able to + decrypt sensitive data. +
  • +
  • + If a weak hashing algorithm is used to protect data integrity, an + attacker may be able to craft a malicious input that has the same + hash as a benign one. +
  • +
  • + If a weak algorithm is used for digital signatures, an attacker may + be able to forge signatures and impersonate legitimate users. +
  • +

This query alerts on any use of a weak cryptographic algorithm that is not a hashing algorithm. Use of broken or weak cryptographic hash diff --git a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp index 7bc1eb018e2..89aa8f71a58 100644 --- a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -3,17 +3,34 @@ "qhelp.dtd"> -

- Using broken or weak cryptographic algorithms can leave data - vulnerable to being decrypted or forged by an attacker. -

+

+ Using broken or weak cryptographic algorithms may compromise + security guarantees such as confidentiality, integrity, and + authenticity. +

-

- Many cryptographic algorithms provided by cryptography - libraries are known to be weak, or flawed. Using such an - algorithm means that encrypted or hashed data is less - secure than it appears to be. -

+

+ Many cryptographic algorithms are known to be weak or flawed. The + security guarantees of a system often rely on the underlying + cryptography, so using a weak algorithm can have severe consequences. + For example: +

+ +
    +
  • + If a weak encryption algorithm is used, an attacker may be able to + decrypt sensitive data. +
  • +
  • + If a weak hashing algorithm is used to protect data integrity, an + attacker may be able to craft a malicious input that has the same + hash as a benign one. +
  • +
  • + If a weak algorithm is used for digital signatures, an attacker may + be able to forge signatures and impersonate legitimate users. +
  • +

This query alerts on any use of a weak cryptographic algorithm that is From f8626cd41777acd30a21e0877649b8fef660afdd Mon Sep 17 00:00:00 2001 From: Jon Janego Date: Wed, 8 Oct 2025 10:42:10 -0500 Subject: [PATCH 27/82] changedocs for 2.23.2 --- .../codeql-changelog/codeql-cli-2.10.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.10.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.10.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.10.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.10.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.10.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.11.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.12.7.rst | 2 +- .../codeql-changelog/codeql-cli-2.13.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.13.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.13.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.13.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.13.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.14.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.15.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.16.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.17.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.18.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.18.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.18.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.18.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.18.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.19.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.19.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.19.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.19.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.19.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.20.7.rst | 2 +- .../codeql-changelog/codeql-cli-2.21.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.21.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.21.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.21.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.21.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.22.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.22.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.22.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.22.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.22.4.rst | 12 +-- .../codeql-changelog/codeql-cli-2.23.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.23.2.rst | 89 +++++++++++++++++++ .../codeql-changelog/codeql-cli-2.4.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.4.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.4.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.4.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.4.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.4.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.7.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.8.rst | 2 +- .../codeql-changelog/codeql-cli-2.5.9.rst | 2 +- .../codeql-changelog/codeql-cli-2.6.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.6.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.6.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.6.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.7.6.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.4.rst | 2 +- .../codeql-changelog/codeql-cli-2.8.5.rst | 2 +- .../codeql-changelog/codeql-cli-2.9.0.rst | 2 +- .../codeql-changelog/codeql-cli-2.9.1.rst | 2 +- .../codeql-changelog/codeql-cli-2.9.2.rst | 2 +- .../codeql-changelog/codeql-cli-2.9.3.rst | 2 +- .../codeql-changelog/codeql-cli-2.9.4.rst | 2 +- .../codeql-changelog/index.rst | 3 +- 121 files changed, 215 insertions(+), 125 deletions(-) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.2.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.0.rst index 96826b25608..7b7cba95fd3 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.0.rst @@ -9,7 +9,7 @@ CodeQL 2.10.0 (2022-06-27) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.1.rst index b059afcfc9e..17c0589c596 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.1.rst @@ -9,7 +9,7 @@ CodeQL 2.10.1 (2022-07-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.2.rst index 37e094f7495..93794d214ce 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.2.rst @@ -9,7 +9,7 @@ CodeQL 2.10.2 (2022-08-02) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.3.rst index 75d3183d4dd..f66721b9128 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.3.rst @@ -9,7 +9,7 @@ CodeQL 2.10.3 (2022-08-15) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.4.rst index c6d9c4c7805..7e15085db02 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.4.rst @@ -9,7 +9,7 @@ CodeQL 2.10.4 (2022-08-31) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.5.rst index 9c2373e358c..72082e16d70 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.10.5.rst @@ -9,7 +9,7 @@ CodeQL 2.10.5 (2022-09-13) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.0.rst index a9b32080979..332d060068e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.0.rst @@ -9,7 +9,7 @@ CodeQL 2.11.0 (2022-09-28) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.1.rst index d7aff79a078..3847694a0fe 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.1.rst @@ -9,7 +9,7 @@ CodeQL 2.11.1 (2022-10-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.2.rst index 83083a9c3a9..9e0dd258b07 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.2.rst @@ -9,7 +9,7 @@ CodeQL 2.11.2 (2022-10-25) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.3.rst index 893d8b52ae1..fb3948cdfce 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.3.rst @@ -9,7 +9,7 @@ CodeQL 2.11.3 (2022-11-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.4.rst index ab22a245583..37b52835a7f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.4.rst @@ -9,7 +9,7 @@ CodeQL 2.11.4 (2022-11-24) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.5.rst index 1ccd87c81ad..9a0f23f55c6 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.5.rst @@ -9,7 +9,7 @@ CodeQL 2.11.5 (2022-12-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.6.rst index cc4dabd21ac..2455de41316 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.11.6.rst @@ -9,7 +9,7 @@ CodeQL 2.11.6 (2022-12-13) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst index 0b7c47773d6..0993702172f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst @@ -9,7 +9,7 @@ CodeQL 2.12.0 (2023-01-10) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.1.rst index c0dd4057e9e..88d9a9d202f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.1.rst @@ -9,7 +9,7 @@ CodeQL 2.12.1 (2023-01-23) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.2.rst index 22df6d46a06..fc78c1bfb2b 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.2.rst @@ -9,7 +9,7 @@ CodeQL 2.12.2 (2023-02-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.3.rst index f3258301786..f954f436150 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.3.rst @@ -9,7 +9,7 @@ CodeQL 2.12.3 (2023-02-23) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.4.rst index 8545a2f77ca..9c84debe0a9 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.4.rst @@ -9,7 +9,7 @@ CodeQL 2.12.4 (2023-03-09) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.5.rst index 5a0c6ae4f92..a25613a96e6 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.5.rst @@ -9,7 +9,7 @@ CodeQL 2.12.5 (2023-03-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.6.rst index aa61cc37f8b..cf542efebda 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.6.rst @@ -9,7 +9,7 @@ CodeQL 2.12.6 (2023-04-04) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.7.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.7.rst index f9c0b12d10f..6fd4d8f416c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.7.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.7.rst @@ -9,7 +9,7 @@ CodeQL 2.12.7 (2023-04-18) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.0.rst index 046e0f548ca..3d3bb548598 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.0.rst @@ -9,7 +9,7 @@ CodeQL 2.13.0 (2023-04-20) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.1.rst index 3af28abf08b..ba78f5fc2f4 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.1.rst @@ -9,7 +9,7 @@ CodeQL 2.13.1 (2023-05-03) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.3.rst index 1cff5244519..09c97c03ff6 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.3.rst @@ -9,7 +9,7 @@ CodeQL 2.13.3 (2023-05-31) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.4.rst index 6bc1dc9daec..8443cea4738 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.4.rst @@ -9,7 +9,7 @@ CodeQL 2.13.4 (2023-06-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.5.rst index f559a2d6154..b0877954388 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.13.5.rst @@ -9,7 +9,7 @@ CodeQL 2.13.5 (2023-07-05) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.0.rst index 3583785a082..9c2a459120a 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.0.rst @@ -9,7 +9,7 @@ CodeQL 2.14.0 (2023-07-13) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.1.rst index 736f48e5ddc..bcdebcae4f7 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.1.rst @@ -9,7 +9,7 @@ CodeQL 2.14.1 (2023-07-27) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.2.rst index ccc388fe210..82362f17567 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.2.rst @@ -9,7 +9,7 @@ CodeQL 2.14.2 (2023-08-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.3.rst index 2707003615b..fc6861d094c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.3.rst @@ -9,7 +9,7 @@ CodeQL 2.14.3 (2023-08-25) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.4.rst index 9ad1517025f..7880af6540e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.4.rst @@ -9,7 +9,7 @@ CodeQL 2.14.4 (2023-09-12) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.5.rst index c56fced5e1d..d3cc1ba634c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.5.rst @@ -9,7 +9,7 @@ CodeQL 2.14.5 (2023-09-14) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.6.rst index a6e8643624c..ef518ba829b 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.14.6.rst @@ -9,7 +9,7 @@ CodeQL 2.14.6 (2023-09-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.0.rst index 14635c0fb50..320d322cf19 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.0.rst @@ -9,7 +9,7 @@ CodeQL 2.15.0 (2023-10-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.1.rst index b98fcd1cd3c..d82569c71f7 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.1.rst @@ -9,7 +9,7 @@ CodeQL 2.15.1 (2023-10-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.2.rst index c542a4df350..60baabb9e5a 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.2.rst @@ -9,7 +9,7 @@ CodeQL 2.15.2 (2023-11-13) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.3.rst index 1bcadd72b5a..fc9e283ecfc 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.3.rst @@ -9,7 +9,7 @@ CodeQL 2.15.3 (2023-11-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.4.rst index f7cbcd80210..f72f1cb8c06 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.4.rst @@ -9,7 +9,7 @@ CodeQL 2.15.4 (2023-12-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.5.rst index 31977c61599..c674850e7cd 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.15.5.rst @@ -9,7 +9,7 @@ CodeQL 2.15.5 (2023-12-20) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.0.rst index 127994f2999..c516ae0fb62 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.0.rst @@ -9,7 +9,7 @@ CodeQL 2.16.0 (2024-01-16) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.1.rst index cd328246d8c..99a675dbe77 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.1.rst @@ -9,7 +9,7 @@ CodeQL 2.16.1 (2024-01-25) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.2.rst index db04b157756..c7529d18cf4 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.2.rst @@ -9,7 +9,7 @@ CodeQL 2.16.2 (2024-02-12) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst index 016bf7583fb..5071c80291c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.3.rst @@ -9,7 +9,7 @@ CodeQL 2.16.3 (2024-02-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.4.rst index a73ce5982fd..f3200dfa5fa 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.4.rst @@ -9,7 +9,7 @@ CodeQL 2.16.4 (2024-03-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.5.rst index cb602e126d1..f416159c3ee 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.5.rst @@ -9,7 +9,7 @@ CodeQL 2.16.5 (2024-03-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.6.rst index dba880ceaae..16c87249130 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.16.6.rst @@ -9,7 +9,7 @@ CodeQL 2.16.6 (2024-03-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.0.rst index 9551941ea38..51c18155920 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.0.rst @@ -9,7 +9,7 @@ CodeQL 2.17.0 (2024-04-04) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.1.rst index c162c3f9554..de95f2a7d8b 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.1.rst @@ -9,7 +9,7 @@ CodeQL 2.17.1 (2024-04-24) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.2.rst index 9fb2aee867b..6f6fc6f2427 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.2.rst @@ -9,7 +9,7 @@ CodeQL 2.17.2 (2024-05-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.3.rst index 45286dd2723..345c66059a9 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.3.rst @@ -9,7 +9,7 @@ CodeQL 2.17.3 (2024-05-17) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.4.rst index e705d8fe17f..9ae59714b90 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.4.rst @@ -9,7 +9,7 @@ CodeQL 2.17.4 (2024-06-03) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.5.rst index e86eb795b1e..d32b5a327e7 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.5.rst @@ -9,7 +9,7 @@ CodeQL 2.17.5 (2024-06-12) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.6.rst index 584d45889d5..74abb31897e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.17.6.rst @@ -9,7 +9,7 @@ CodeQL 2.17.6 (2024-06-27) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.0.rst index c299355c00e..99764e480a5 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.0.rst @@ -9,7 +9,7 @@ CodeQL 2.18.0 (2024-07-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.1.rst index a13cd9cdc5d..5d4dd5179a1 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.1.rst @@ -9,7 +9,7 @@ CodeQL 2.18.1 (2024-07-25) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.2.rst index 3bc21179a89..bc67ac410d4 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.2.rst @@ -9,7 +9,7 @@ CodeQL 2.18.2 (2024-08-13) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.3.rst index 31ecd6e0ed7..77792853900 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.3.rst @@ -9,7 +9,7 @@ CodeQL 2.18.3 (2024-08-28) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.4.rst index 14f7cb96647..18556314725 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.18.4.rst @@ -9,7 +9,7 @@ CodeQL 2.18.4 (2024-09-12) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.0.rst index 0184b811817..ce5973268db 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.0.rst @@ -9,7 +9,7 @@ CodeQL 2.19.0 (2024-09-18) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.1.rst index 352a229a422..f2948d0db67 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.1.rst @@ -9,7 +9,7 @@ CodeQL 2.19.1 (2024-10-04) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.2.rst index b21bc2566a8..edc40712dc0 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.2.rst @@ -9,7 +9,7 @@ CodeQL 2.19.2 (2024-10-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.3.rst index c078993aa3f..183adc77e41 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.3.rst @@ -9,7 +9,7 @@ CodeQL 2.19.3 (2024-11-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst index 9235d63fe2c..2135aa8f759 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst @@ -9,7 +9,7 @@ CodeQL 2.19.4 (2024-12-02) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.0.rst index 70fed1e9cfd..1d1422d381c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.0.rst @@ -9,7 +9,7 @@ CodeQL 2.20.0 (2024-12-09) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.1.rst index 11f30e96086..5d3d2d99f9e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.1.rst @@ -9,7 +9,7 @@ CodeQL 2.20.1 (2025-01-09) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.2.rst index ed4d502ea2d..c657bf0c48e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.2.rst @@ -9,7 +9,7 @@ CodeQL 2.20.2 (2025-01-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.3.rst index 053d11610a4..1fca15790f1 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.3.rst @@ -9,7 +9,7 @@ CodeQL 2.20.3 (2025-01-24) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.4.rst index c3012e020c7..673d4a55d59 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.4.rst @@ -9,7 +9,7 @@ CodeQL 2.20.4 (2025-02-06) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.5.rst index 855f25655ec..d3264090af1 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.5.rst @@ -9,7 +9,7 @@ CodeQL 2.20.5 (2025-02-20) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.6.rst index 76c038bded2..841b637cc34 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.6.rst @@ -9,7 +9,7 @@ CodeQL 2.20.6 (2025-03-06) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.7.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.7.rst index fd6885b025e..144382c9737 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.7.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.20.7.rst @@ -9,7 +9,7 @@ CodeQL 2.20.7 (2025-03-18) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.0.rst index b6396b2be4e..a9a27208831 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.0.rst @@ -9,7 +9,7 @@ CodeQL 2.21.0 (2025-04-03) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.1.rst index 40587985d9d..ada0a6102fc 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.1.rst @@ -9,7 +9,7 @@ CodeQL 2.21.1 (2025-04-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.2.rst index 636cf2fe63d..97d52abf744 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.2.rst @@ -9,7 +9,7 @@ CodeQL 2.21.2 (2025-05-01) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.3.rst index d499f27dcb1..71a8e3a6824 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.3.rst @@ -9,7 +9,7 @@ CodeQL 2.21.3 (2025-05-15) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst index c21a9940b4b..6fcbc0cd0ca 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst @@ -9,7 +9,7 @@ CodeQL 2.21.4 (2025-06-02) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst index d60b0e95769..4288b9c2e98 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst @@ -9,7 +9,7 @@ CodeQL 2.22.0 (2025-06-11) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.1.rst index 0b051d5473f..6aed611d5cf 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.1.rst @@ -9,7 +9,7 @@ CodeQL 2.22.1 (2025-06-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.2.rst index 92c440a05af..6164266e10f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.2.rst @@ -9,7 +9,7 @@ CodeQL 2.22.2 (2025-07-29) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.3.rst index 7a1d554855d..4f1d34ff2dd 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.3.rst @@ -9,7 +9,7 @@ CodeQL 2.22.3 (2025-08-06) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.4.rst index 97dc83d41da..1a592436a8f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.4.rst @@ -9,7 +9,7 @@ CodeQL 2.22.4 (2025-08-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- @@ -33,11 +33,6 @@ C/C++ * The :code:`cpp/short-global-name` query will no longer give alerts for instantiations of template variables, only for the template itself. * Fixed a false positive in :code:`cpp/overflow-buffer` when the type of the destination buffer is a reference to a class/struct type. -Golang -"""""" - -* Go 1.25 is now supported. - JavaScript/TypeScript """"""""""""""""""""" @@ -84,6 +79,11 @@ C/C++ * Improved dataflow through global variables in the new dataflow library (:code:`semmle.code.cpp.dataflow.new.DataFlow` and :code:`semmle.code.cpp.dataflow.new.TaintTracking`). Queries based on these libraries will produce more results on codebases with many global variables. * The global value numbering library (:code:`semmle.code.cpp.valuenumbering.GlobalValueNumbering` and :code:`semmle.code.cpp.ir.ValueNumbering`) has been improved so more expressions are assigned the same value number. +Golang +"""""" + +* Go 1.25 is now supported. + Java/Kotlin """"""""""" diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst index d87754d8391..4091be0911e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst @@ -9,7 +9,7 @@ CodeQL 2.23.0 (2025-09-04) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.2.rst new file mode 100644 index 00000000000..246af4c3be1 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.2.rst @@ -0,0 +1,89 @@ +.. _codeql-cli-2.23.2: + +========================== +CodeQL 2.23.2 (2025-10-02) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.23.2 runs a total of 479 security queries when configured with the Default suite (covering 166 CWE). The Extended suite enables an additional 135 queries (covering 35 more CWE). 1 security query has been added with this release. + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* The :code:`codeql generate query-help` command now prepends the query's name (taken from the :code:`.ql` file) as a level-one heading when processing markdown query help, for consistency with help generated from a :code:`.qhelp` file. + +New Features +~~~~~~~~~~~~ + +* CodeQL Go analysis now supports the "Git Source" type for `private package registries `__. This is in addition to the existing support for the "GOPROXY server" type. + +Query Packs +----------- + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* The modeling of null guards based on complex pattern expressions has been improved, which in turn improves the query :code:`cs/dereferenced-value-may-be-null` by removing false positives. +* The query :code:`cs/xmldoc/missing-summary` has been removed from the :code:`code-quality` suite, to align with other languages. + +Python +"""""" + +* The queries that check for unmatchable :code:`$` and :code:`^` in regular expressions did not account correctly for occurrences inside lookahead and lookbehind assertions. These occurrences are now handled correctly, eliminating this source of false positives. +* The :code:`py/inheritance/signature-mismatch` query has been modernized. It produces more precise results and more descriptive alert messages. +* The :code:`py/inheritance/incorrect-overriding-signature` query has been deprecated. Its results have been consolidated into the :code:`py/inheritance/signature-mismatch` query. + +New Queries +~~~~~~~~~~~ + +Rust +"""" + +* Added a new query, :code:`rust/non-https-url`, for detecting the use of non-HTTPS URLs that can be intercepted by third parties. + +Language Libraries +------------------ + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added modeling of :code:`GraphQLObjectType` resolver function parameters as remote sources. +* Support for the `graphql `__ library has been improved. Data flow from GraphQL query sources and variables to resolver function parameters is now tracked. +* Added support for the :code:`aws-sdk` and :code:`@aws-sdk/client-dynamodb`, :code:`@aws-sdk/client-athena`, :code:`@aws-sdk/client-s3`, and :code:`@aws-sdk/client-rds-data` packages. + +Python +"""""" + +* Data flow tracking through global variables now supports nested field access patterns such as :code:`global_var.obj.field`. This improves the precision of taint tracking analysis when data flows through complex global variable structures. + +New Features +~~~~~~~~~~~~ + +Ruby +"""" + +* Initial modeling for the Ruby Grape framework in :code:`Grape.qll` has been added to detect API endpoints, parameters, and headers within Grape API classes. + +Rust +"""" + +* The models-as-data format for sources now supports access paths of the form + :code:`Argument[i].Parameter[j]`. This denotes that the source passes tainted data to the :code:`j`\ th parameter of its :code:`i`\ th argument (which must be a function or a closure). diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.1.rst index 58d7f61cba8..af61c689885 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.1.rst @@ -9,7 +9,7 @@ CodeQL 2.4.1 (2020-12-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.2.rst index 26cd430bd5f..dcbd51e613a 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.2.rst @@ -9,7 +9,7 @@ CodeQL 2.4.2 (2021-01-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.3.rst index 7bd90f4e621..6936a0a200e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.3.rst @@ -9,7 +9,7 @@ CodeQL 2.4.3 (2021-01-29) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.4.rst index 5b918dc90e8..8c0709928af 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.4.rst @@ -9,7 +9,7 @@ CodeQL 2.4.4 (2021-02-12) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.5.rst index 9d4a5b329b1..9ef2182c9f5 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.5.rst @@ -9,7 +9,7 @@ CodeQL 2.4.5 (2021-03-08) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.6.rst index c5f1a57ea0d..ba551f3333d 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.4.6.rst @@ -9,7 +9,7 @@ CodeQL 2.4.6 (2021-03-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.0.rst index 45b21c0d03c..0e983e5cacb 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.0.rst @@ -9,7 +9,7 @@ CodeQL 2.5.0 (2021-03-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.1.rst index 7aa11611c71..8f259708fdc 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.1.rst @@ -9,7 +9,7 @@ CodeQL 2.5.1 (2021-04-19) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.2.rst index dde165f5f3c..09049680fae 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.2.rst @@ -9,7 +9,7 @@ CodeQL 2.5.2 (2021-04-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.3.rst index 05717dacb04..518a699fbf3 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.3.rst @@ -9,7 +9,7 @@ CodeQL 2.5.3 (2021-04-30) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.4.rst index 85cb5102041..33a1ee1e802 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.4.rst @@ -9,7 +9,7 @@ CodeQL 2.5.4 (2021-05-03) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.5.rst index 349d9c2ab4c..02946e207ff 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.5.rst @@ -9,7 +9,7 @@ CodeQL 2.5.5 (2021-05-17) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.6.rst index 5d9b4fab3aa..8f7444f3339 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.6.rst @@ -9,7 +9,7 @@ CodeQL 2.5.6 (2021-06-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.7.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.7.rst index 31c0fcbc387..a79252fdbe8 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.7.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.7.rst @@ -9,7 +9,7 @@ CodeQL 2.5.7 (2021-07-02) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.8.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.8.rst index 753da44a257..da7e793d1c6 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.8.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.8.rst @@ -9,7 +9,7 @@ CodeQL 2.5.8 (2021-07-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.9.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.9.rst index e142a305026..cc9120def9e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.9.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.5.9.rst @@ -9,7 +9,7 @@ CodeQL 2.5.9 (2021-08-09) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.0.rst index 494f9ed2d71..6b7a81e5ac5 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.0.rst @@ -9,7 +9,7 @@ CodeQL 2.6.0 (2021-08-24) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.1.rst index 0ff5d4bd9f0..a9e030c403a 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.1.rst @@ -9,7 +9,7 @@ CodeQL 2.6.1 (2021-09-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.2.rst index af7c4b7042b..6a67b21f33c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.2.rst @@ -9,7 +9,7 @@ CodeQL 2.6.2 (2021-09-21) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.3.rst index e566b818a00..d5c4e3e3f57 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.6.3.rst @@ -9,7 +9,7 @@ CodeQL 2.6.3 (2021-10-06) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.0.rst index dbbd36aea5e..9ac5b7f3e92 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.0.rst @@ -9,7 +9,7 @@ CodeQL 2.7.0 (2021-10-27) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.1.rst index f28740575f3..09aead4a36e 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.1.rst @@ -9,7 +9,7 @@ CodeQL 2.7.1 (2021-11-15) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.2.rst index ecd7d53c3e0..c2c0d35179c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.2.rst @@ -9,7 +9,7 @@ CodeQL 2.7.2 (2021-11-22) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.3.rst index ffac75543ca..af2cac49d3f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.3.rst @@ -9,7 +9,7 @@ CodeQL 2.7.3 (2021-12-06) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.5.rst index d754aec07cb..c3107ea0386 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.5.rst @@ -9,7 +9,7 @@ CodeQL 2.7.5 (2022-01-17) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.6.rst index ef418261258..6d9820c064d 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.6.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.7.6.rst @@ -9,7 +9,7 @@ CodeQL 2.7.6 (2022-01-24) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.0.rst index 03e16acf5d9..602465d13f6 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.0.rst @@ -9,7 +9,7 @@ CodeQL 2.8.0 (2022-02-04) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.1.rst index 184a488ca4a..d25904b4028 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.1.rst @@ -9,7 +9,7 @@ CodeQL 2.8.1 (2022-02-15) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.2.rst index 6c778328d9b..1f7aba69555 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.2.rst @@ -9,7 +9,7 @@ CodeQL 2.8.2 (2022-02-28) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.3.rst index 0a5c75d06d6..9fcc89afbc9 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.3.rst @@ -9,7 +9,7 @@ CodeQL 2.8.3 (2022-03-14) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.4.rst index a9cb1ddde70..83766ab58bc 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.4.rst @@ -9,7 +9,7 @@ CodeQL 2.8.4 (2022-03-29) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.5.rst index e9dcb93b10c..9cd2e1b7a67 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.5.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.8.5.rst @@ -9,7 +9,7 @@ CodeQL 2.8.5 (2022-04-07) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.0.rst index 3b289245398..bf104cfb5d3 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.0.rst @@ -9,7 +9,7 @@ CodeQL 2.9.0 (2022-04-26) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.1.rst index 0a2cd31ba3b..0e983c973d7 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.1.rst @@ -9,7 +9,7 @@ CodeQL 2.9.1 (2022-05-05) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.2.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.2.rst index ff7548ce259..a3ae2394118 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.2.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.2.rst @@ -9,7 +9,7 @@ CodeQL 2.9.2 (2022-05-16) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.3.rst index fe8834674d5..c5f14565820 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.3.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.3.rst @@ -9,7 +9,7 @@ CodeQL 2.9.3 (2022-05-31) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.4.rst index 1cd748682c5..0bac2d62b6f 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.4.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.9.4.rst @@ -9,7 +9,7 @@ CodeQL 2.9.4 (2022-06-20) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 41230fc72f1..48d9badc765 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -4,13 +4,14 @@ CodeQL change logs ================== -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. A list of queries for each suite and language `is available here `__. .. toctree:: :maxdepth: 1 + codeql-cli-2.23.2 codeql-cli-2.23.1 codeql-cli-2.23.0 codeql-cli-2.22.4 From 2f22acdd062fd00ad3cbcf24a9008dbeeb547817 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 8 Oct 2025 16:48:57 +0100 Subject: [PATCH 28/82] Remove hashing example when not covered by query --- python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp | 5 ----- .../src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp | 5 ----- .../src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp | 5 ----- 3 files changed, 15 deletions(-) diff --git a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp index 003849b17cc..9757f2d49bf 100644 --- a/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/python/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -23,11 +23,6 @@ decrypt sensitive data.

  • - If a weak hashing algorithm is used to protect data integrity, an - attacker may be able to craft a malicious input that has the same - hash as a benign one. -
  • -
  • If a weak algorithm is used for digital signatures, an attacker may be able to forge signatures and impersonate legitimate users.
  • diff --git a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp index 3c4dae2ae7b..cf84089e3d2 100644 --- a/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp +++ b/ruby/ql/src/queries/security/cwe-327/BrokenCryptoAlgorithm.qhelp @@ -22,11 +22,6 @@ decrypt sensitive data.
  • - If a weak hashing algorithm is used to protect data integrity, an - attacker may be able to craft a malicious input that has the same - hash as a benign one. -
  • -
  • If a weak algorithm is used for digital signatures, an attacker may be able to forge signatures and impersonate legitimate users.
  • diff --git a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp index 89aa8f71a58..0c9e8fc289d 100644 --- a/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp +++ b/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -22,11 +22,6 @@ decrypt sensitive data.
  • - If a weak hashing algorithm is used to protect data integrity, an - attacker may be able to craft a malicious input that has the same - hash as a benign one. -
  • -
  • If a weak algorithm is used for digital signatures, an attacker may be able to forge signatures and impersonate legitimate users.
  • From 9c610e8bab506a10a0258f5596db72dc4c78c909 Mon Sep 17 00:00:00 2001 From: Jon Janego Date: Wed, 8 Oct 2025 10:57:17 -0500 Subject: [PATCH 29/82] Update links in CodeQL CLI changelog --- .../codeql-overview/codeql-changelog/codeql-cli-2.23.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.1.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.1.rst index 1c4ac199687..ff22a3f647c 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.1.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.1.rst @@ -9,7 +9,7 @@ CodeQL 2.23.1 (2025-09-23) :local: :backlinks: none -This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. Security Coverage ----------------- From 546d59ff9d6f337710d952e3084ee05a59decbf3 Mon Sep 17 00:00:00 2001 From: idrissrio Date: Wed, 8 Oct 2025 12:41:11 +0200 Subject: [PATCH 30/82] Java: Wait for test HTTP servers to be ready before running buildless test --- .../test.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/java/ql/integration-tests/java/buildless-dependency-different-repository/test.py b/java/ql/integration-tests/java/buildless-dependency-different-repository/test.py index 8a5efabf941..a74fd05be8f 100644 --- a/java/ql/integration-tests/java/buildless-dependency-different-repository/test.py +++ b/java/ql/integration-tests/java/buildless-dependency-different-repository/test.py @@ -1,12 +1,29 @@ import subprocess import logging +import time +import socket + + +def wait_for_port(port, process, timeout=100): + start = time.time() + while time.time() - start < timeout: + # Check if process died + if process.poll() is not None: + raise RuntimeError(f"Server process exited with code {process.returncode}") + try: + with socket.create_connection(("localhost", port), timeout=1): + return True + except (socket.timeout, ConnectionRefusedError, OSError): + time.sleep(0.2) + raise RuntimeError(f"Port {port} not ready within {timeout}s") def test(codeql, java): - # Each of these serves the "repo" and "repo2" directories on http://localhost:924[89] - repo_server_process = subprocess.Popen(["python3", "-m", "http.server", "9428", "-b", "localhost"], cwd="repo") - repo_server_process2 = subprocess.Popen(["python3", "-m", "http.server", "9429", "-b", "localhost"], cwd="repo2") + repo_server_process = subprocess.Popen(["python3", "-m", "http.server", "9428", "-b", "localhost"], cwd="repo", stderr=subprocess.PIPE, stdout=subprocess.PIPE) + repo_server_process2 = subprocess.Popen(["python3", "-m", "http.server", "9429", "-b", "localhost"], cwd="repo2", stderr=subprocess.PIPE, stdout=subprocess.PIPE) try: + wait_for_port(9428, repo_server_process) + wait_for_port(9429, repo_server_process2) codeql.database.create( extractor_option="buildless=true", _env={"CODEQL_EXTRACTOR_JAVA_OPTION_BUILDLESS_CLASSPATH_FROM_BUILD_FILES": "true"}, From 0c9cd09140a9b2b4e880156e69cfe23ac5fb4371 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Oct 2025 11:34:14 +0100 Subject: [PATCH 31/82] Make NumericOrBooleanSanitizer easier to access and rename it --- go/ql/lib/semmle/go/security/Sanitizers.qll | 16 ++++++++++++++++ .../go/security/SqlInjectionCustomizations.qll | 10 +++++----- 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 go/ql/lib/semmle/go/security/Sanitizers.qll diff --git a/go/ql/lib/semmle/go/security/Sanitizers.qll b/go/ql/lib/semmle/go/security/Sanitizers.qll new file mode 100644 index 00000000000..4391e12c25a --- /dev/null +++ b/go/ql/lib/semmle/go/security/Sanitizers.qll @@ -0,0 +1,16 @@ +/** + * Classes to represent sanitizers commonly used in dataflow and taint tracking + * configurations. + */ + +import go + +/** + * A node whose type is a simple type unlikely to carry taint, such as a + * numeric or boolean type. + */ +class SimpleTypeSanitizer extends DataFlow::Node { + SimpleTypeSanitizer() { + this.getType() instanceof NumericType or this.getType() instanceof BoolType + } +} diff --git a/go/ql/lib/semmle/go/security/SqlInjectionCustomizations.qll b/go/ql/lib/semmle/go/security/SqlInjectionCustomizations.qll index 0b2f96a9283..f26168ad1d7 100644 --- a/go/ql/lib/semmle/go/security/SqlInjectionCustomizations.qll +++ b/go/ql/lib/semmle/go/security/SqlInjectionCustomizations.qll @@ -4,6 +4,7 @@ */ import go +private import semmle.go.security.Sanitizers /** * Provides extension points for customizing the taint tracking configuration for reasoning about @@ -39,12 +40,11 @@ module SqlInjection { /** A NoSql query, considered as a taint sink for SQL injection. */ class NoSqlQueryAsSink extends Sink instanceof NoSql::Query { } + /** DEPRECATED: Use `SimpleTypeSanitizer` from semmle.go.security.Sanitizers instead. */ + deprecated class NumericOrBooleanSanitizer = SimpleTypeSanitizer; + /** * A numeric- or boolean-typed node, considered a sanitizer for sql injection. */ - class NumericOrBooleanSanitizer extends Sanitizer { - NumericOrBooleanSanitizer() { - this.getType() instanceof NumericType or this.getType() instanceof BoolType - } - } + private class DefaultSanitizer extends Sanitizer instanceof SimpleTypeSanitizer { } } From 7599fdd8fa0047d398efcda216d7998c5783e3b1 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Oct 2025 11:57:10 +0100 Subject: [PATCH 32/82] Add request forgery test for numeric type --- .../Security/CWE-918/RequestForgery.expected | 133 ++++++++++-------- .../Security/CWE-918/RequestForgery.ext.yml | 6 + .../test/query-tests/Security/CWE-918/tst.go | 9 ++ 3 files changed, 87 insertions(+), 61 deletions(-) create mode 100644 go/ql/test/query-tests/Security/CWE-918/RequestForgery.ext.yml diff --git a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected index 129613a3f1a..224a2c2b72e 100644 --- a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected +++ b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected @@ -1,18 +1,19 @@ #select | RequestForgery.go:11:15:11:66 | call to Get | RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | The $@ of this request depends on a $@. | RequestForgery.go:11:24:11:65 | ...+... | URL | RequestForgery.go:8:12:8:34 | call to FormValue | user-provided value | -| tst.go:18:2:18:18 | call to Get | tst.go:10:13:10:35 | call to FormValue | tst.go:18:11:18:17 | tainted | The $@ of this request depends on a $@. | tst.go:18:11:18:17 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:20:2:20:19 | call to Head | tst.go:10:13:10:35 | call to FormValue | tst.go:20:12:20:18 | tainted | The $@ of this request depends on a $@. | tst.go:20:12:20:18 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:22:2:22:38 | call to Post | tst.go:10:13:10:35 | call to FormValue | tst.go:22:12:22:18 | tainted | The $@ of this request depends on a $@. | tst.go:22:12:22:18 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:24:2:24:28 | call to PostForm | tst.go:10:13:10:35 | call to FormValue | tst.go:24:16:24:22 | tainted | The $@ of this request depends on a $@. | tst.go:24:16:24:22 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:28:2:28:15 | call to Do | tst.go:10:13:10:35 | call to FormValue | tst.go:27:35:27:41 | tainted | The $@ of this request depends on a $@. | tst.go:27:35:27:41 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:31:2:31:15 | call to Do | tst.go:10:13:10:35 | call to FormValue | tst.go:30:68:30:74 | tainted | The $@ of this request depends on a $@. | tst.go:30:68:30:74 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:33:2:33:20 | call to Get | tst.go:10:13:10:35 | call to FormValue | tst.go:33:13:33:19 | tainted | The $@ of this request depends on a $@. | tst.go:33:13:33:19 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:34:2:34:21 | call to Head | tst.go:10:13:10:35 | call to FormValue | tst.go:34:14:34:20 | tainted | The $@ of this request depends on a $@. | tst.go:34:14:34:20 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:35:2:35:40 | call to Post | tst.go:10:13:10:35 | call to FormValue | tst.go:35:14:35:20 | tainted | The $@ of this request depends on a $@. | tst.go:35:14:35:20 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:36:2:36:30 | call to PostForm | tst.go:10:13:10:35 | call to FormValue | tst.go:36:18:36:24 | tainted | The $@ of this request depends on a $@. | tst.go:36:18:36:24 | tainted | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:38:2:38:30 | call to Get | tst.go:10:13:10:35 | call to FormValue | tst.go:38:11:38:29 | ...+... | The $@ of this request depends on a $@. | tst.go:38:11:38:29 | ...+... | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:40:2:40:41 | call to Get | tst.go:10:13:10:35 | call to FormValue | tst.go:40:11:40:40 | ...+... | The $@ of this request depends on a $@. | tst.go:40:11:40:40 | ...+... | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | -| tst.go:48:2:48:21 | call to Get | tst.go:10:13:10:35 | call to FormValue | tst.go:48:11:48:20 | call to String | The $@ of this request depends on a $@. | tst.go:48:11:48:20 | call to String | URL | tst.go:10:13:10:35 | call to FormValue | user-provided value | +| tst.go:19:2:19:18 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:19:11:19:17 | tainted | The $@ of this request depends on a $@. | tst.go:19:11:19:17 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:21:2:21:19 | call to Head | tst.go:11:13:11:35 | call to FormValue | tst.go:21:12:21:18 | tainted | The $@ of this request depends on a $@. | tst.go:21:12:21:18 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:23:2:23:38 | call to Post | tst.go:11:13:11:35 | call to FormValue | tst.go:23:12:23:18 | tainted | The $@ of this request depends on a $@. | tst.go:23:12:23:18 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:25:2:25:28 | call to PostForm | tst.go:11:13:11:35 | call to FormValue | tst.go:25:16:25:22 | tainted | The $@ of this request depends on a $@. | tst.go:25:16:25:22 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:29:2:29:15 | call to Do | tst.go:11:13:11:35 | call to FormValue | tst.go:28:35:28:41 | tainted | The $@ of this request depends on a $@. | tst.go:28:35:28:41 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:32:2:32:15 | call to Do | tst.go:11:13:11:35 | call to FormValue | tst.go:31:68:31:74 | tainted | The $@ of this request depends on a $@. | tst.go:31:68:31:74 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:34:2:34:20 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:34:13:34:19 | tainted | The $@ of this request depends on a $@. | tst.go:34:13:34:19 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:35:2:35:21 | call to Head | tst.go:11:13:11:35 | call to FormValue | tst.go:35:14:35:20 | tainted | The $@ of this request depends on a $@. | tst.go:35:14:35:20 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:36:2:36:40 | call to Post | tst.go:11:13:11:35 | call to FormValue | tst.go:36:14:36:20 | tainted | The $@ of this request depends on a $@. | tst.go:36:14:36:20 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:37:2:37:30 | call to PostForm | tst.go:11:13:11:35 | call to FormValue | tst.go:37:18:37:24 | tainted | The $@ of this request depends on a $@. | tst.go:37:18:37:24 | tainted | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:39:2:39:30 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | The $@ of this request depends on a $@. | tst.go:39:11:39:29 | ...+... | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:41:2:41:41 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | The $@ of this request depends on a $@. | tst.go:41:11:41:40 | ...+... | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:49:2:49:21 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:49:11:49:20 | call to String | The $@ of this request depends on a $@. | tst.go:49:11:49:20 | call to String | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | +| tst.go:53:2:53:26 | call to Get | tst.go:52:42:52:52 | call to intSource | tst.go:53:11:53:25 | ...+... | The $@ of this request depends on a $@. | tst.go:53:11:53:25 | ...+... | URL | tst.go:52:42:52:52 | call to intSource | user-provided value | | websocket.go:65:12:65:53 | call to Dial | websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:65:27:65:40 | untrustedInput | WebSocket URL | websocket.go:60:21:60:31 | call to Referer | user-provided value | | websocket.go:79:13:79:40 | call to DialConfig | websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:78:36:78:49 | untrustedInput | WebSocket URL | websocket.go:74:21:74:31 | call to Referer | user-provided value | | websocket.go:91:3:91:50 | call to Dial | websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:91:31:91:44 | untrustedInput | WebSocket URL | websocket.go:88:21:88:31 | call to Referer | user-provided value | @@ -23,59 +24,69 @@ | websocket.go:197:7:197:36 | call to BuildProxy | websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:197:22:197:35 | untrustedInput | WebSocket URL | websocket.go:195:21:195:31 | call to Referer | user-provided value | | websocket.go:204:7:204:29 | call to New | websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:204:15:204:28 | untrustedInput | WebSocket URL | websocket.go:202:21:202:31 | call to Referer | user-provided value | edges -| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:18:11:18:17 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:20:12:20:18 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:22:12:22:18 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:24:16:24:22 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:27:35:27:41 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:30:68:30:74 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:33:13:33:19 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:34:14:34:20 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:35:14:35:20 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:36:18:36:24 | tainted | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:38:11:38:29 | ...+... | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:40:11:40:40 | ...+... | provenance | Src:MaD:1 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:47:11:47:18 | tainted2 | provenance | Src:MaD:1 | -| tst.go:47:2:47:2 | implicit dereference [postupdate] | tst.go:47:2:47:2 | u [postupdate] | provenance | | -| tst.go:47:2:47:2 | u [postupdate] | tst.go:48:11:48:11 | u | provenance | | -| tst.go:47:11:47:18 | tainted2 | tst.go:47:2:47:2 | implicit dereference [postupdate] | provenance | Config | -| tst.go:47:11:47:18 | tainted2 | tst.go:47:2:47:2 | u [postupdate] | provenance | Config | -| tst.go:48:11:48:11 | u | tst.go:48:11:48:20 | call to String | provenance | MaD:3 | -| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | provenance | Src:MaD:2 | -| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | provenance | Src:MaD:2 | +| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:19:11:19:17 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:21:12:21:18 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:23:12:23:18 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:25:16:25:22 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:28:35:28:41 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:31:68:31:74 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:34:13:34:19 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:35:14:35:20 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:36:14:36:20 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:37:18:37:24 | tainted | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | provenance | Src:MaD:2 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:48:11:48:18 | tainted2 | provenance | Src:MaD:2 | +| tst.go:48:2:48:2 | implicit dereference [postupdate] | tst.go:48:2:48:2 | u [postupdate] | provenance | | +| tst.go:48:2:48:2 | u [postupdate] | tst.go:49:11:49:11 | u | provenance | | +| tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | implicit dereference [postupdate] | provenance | Config | +| tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | u [postupdate] | provenance | Config | +| tst.go:49:11:49:11 | u | tst.go:49:11:49:20 | call to String | provenance | MaD:5 | +| tst.go:52:9:52:53 | []type{args} [array] | tst.go:52:9:52:53 | call to Sprintf | provenance | MaD:4 | +| tst.go:52:9:52:53 | call to Sprintf | tst.go:53:11:53:25 | ...+... | provenance | | +| tst.go:52:42:52:52 | call to intSource | tst.go:52:9:52:53 | []type{args} [array] | provenance | Src:MaD:1 | +| tst.go:52:42:52:52 | call to intSource | tst.go:52:9:52:53 | call to Sprintf | provenance | Src:MaD:1 FunctionModel | +| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | provenance | Src:MaD:3 | +| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | provenance | Src:MaD:3 | models -| 1 | Source: net/http; Request; true; FormValue; ; ; ReturnValue; remote; manual | -| 2 | Source: net/http; Request; true; Referer; ; ; ReturnValue; remote; manual | -| 3 | Summary: fmt; Stringer; true; String; ; ; Argument[receiver]; ReturnValue; taint; manual | +| 1 | Source: main; ; false; intSource; ; ; ReturnValue; remote; manual | +| 2 | Source: net/http; Request; true; FormValue; ; ; ReturnValue; remote; manual | +| 3 | Source: net/http; Request; true; Referer; ; ; ReturnValue; remote; manual | +| 4 | Summary: fmt; ; false; Sprintf; ; ; Argument[1].ArrayElement; ReturnValue; taint; manual | +| 5 | Summary: fmt; Stringer; true; String; ; ; Argument[receiver]; ReturnValue; taint; manual | nodes | RequestForgery.go:8:12:8:34 | call to FormValue | semmle.label | call to FormValue | | RequestForgery.go:11:24:11:65 | ...+... | semmle.label | ...+... | -| tst.go:10:13:10:35 | call to FormValue | semmle.label | call to FormValue | -| tst.go:18:11:18:17 | tainted | semmle.label | tainted | -| tst.go:20:12:20:18 | tainted | semmle.label | tainted | -| tst.go:22:12:22:18 | tainted | semmle.label | tainted | -| tst.go:24:16:24:22 | tainted | semmle.label | tainted | -| tst.go:27:35:27:41 | tainted | semmle.label | tainted | -| tst.go:30:68:30:74 | tainted | semmle.label | tainted | -| tst.go:33:13:33:19 | tainted | semmle.label | tainted | -| tst.go:34:14:34:20 | tainted | semmle.label | tainted | +| tst.go:11:13:11:35 | call to FormValue | semmle.label | call to FormValue | +| tst.go:19:11:19:17 | tainted | semmle.label | tainted | +| tst.go:21:12:21:18 | tainted | semmle.label | tainted | +| tst.go:23:12:23:18 | tainted | semmle.label | tainted | +| tst.go:25:16:25:22 | tainted | semmle.label | tainted | +| tst.go:28:35:28:41 | tainted | semmle.label | tainted | +| tst.go:31:68:31:74 | tainted | semmle.label | tainted | +| tst.go:34:13:34:19 | tainted | semmle.label | tainted | | tst.go:35:14:35:20 | tainted | semmle.label | tainted | -| tst.go:36:18:36:24 | tainted | semmle.label | tainted | -| tst.go:38:11:38:29 | ...+... | semmle.label | ...+... | -| tst.go:40:11:40:40 | ...+... | semmle.label | ...+... | -| tst.go:47:2:47:2 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| tst.go:47:2:47:2 | u [postupdate] | semmle.label | u [postupdate] | -| tst.go:47:11:47:18 | tainted2 | semmle.label | tainted2 | -| tst.go:48:11:48:11 | u | semmle.label | u | -| tst.go:48:11:48:20 | call to String | semmle.label | call to String | +| tst.go:36:14:36:20 | tainted | semmle.label | tainted | +| tst.go:37:18:37:24 | tainted | semmle.label | tainted | +| tst.go:39:11:39:29 | ...+... | semmle.label | ...+... | +| tst.go:41:11:41:40 | ...+... | semmle.label | ...+... | +| tst.go:48:2:48:2 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| tst.go:48:2:48:2 | u [postupdate] | semmle.label | u [postupdate] | +| tst.go:48:11:48:18 | tainted2 | semmle.label | tainted2 | +| tst.go:49:11:49:11 | u | semmle.label | u | +| tst.go:49:11:49:20 | call to String | semmle.label | call to String | +| tst.go:52:9:52:53 | []type{args} [array] | semmle.label | []type{args} [array] | +| tst.go:52:9:52:53 | call to Sprintf | semmle.label | call to Sprintf | +| tst.go:52:42:52:52 | call to intSource | semmle.label | call to intSource | +| tst.go:53:11:53:25 | ...+... | semmle.label | ...+... | | websocket.go:60:21:60:31 | call to Referer | semmle.label | call to Referer | | websocket.go:65:27:65:40 | untrustedInput | semmle.label | untrustedInput | | websocket.go:74:21:74:31 | call to Referer | semmle.label | call to Referer | diff --git a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.ext.yml b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.ext.yml new file mode 100644 index 00000000000..1fc92a07144 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/go-all + extensible: sourceModel + data: + - ["main", "", False, "intSource", "", "", "ReturnValue", "remote", "manual"] diff --git a/go/ql/test/query-tests/Security/CWE-918/tst.go b/go/ql/test/query-tests/Security/CWE-918/tst.go index 02f65507abd..479d7aa8c92 100644 --- a/go/ql/test/query-tests/Security/CWE-918/tst.go +++ b/go/ql/test/query-tests/Security/CWE-918/tst.go @@ -2,6 +2,7 @@ package main import ( "context" + "fmt" "net/http" "net/url" ) @@ -46,8 +47,16 @@ func handler2(w http.ResponseWriter, req *http.Request) { u, _ := url.Parse("http://example.com/relative-path") u.Host = tainted2 http.Get(u.String()) // $ Alert + + // Simple types are considered sanitized. + url := fmt.Sprintf("%s/%d", "some-url", intSource()) // $ SPURIOUS: Source + http.Get("http://" + url) // $ SPURIOUS: Alert } func main() { } + +func intSource() int64 { + return 0 +} From 3cbce80d0bf48a2bd8b90d9ddbb593a701e65c5a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Oct 2025 12:15:29 +0100 Subject: [PATCH 33/82] Add SimpleTypeSanitizer to `go/request-forgery` --- .../security/RequestForgeryCustomizations.qll | 6 ++ .../Security/CWE-918/RequestForgery.expected | 65 ++++++++----------- .../test/query-tests/Security/CWE-918/tst.go | 4 +- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/go/ql/lib/semmle/go/security/RequestForgeryCustomizations.qll b/go/ql/lib/semmle/go/security/RequestForgeryCustomizations.qll index 1298785b726..82f9df4b506 100644 --- a/go/ql/lib/semmle/go/security/RequestForgeryCustomizations.qll +++ b/go/ql/lib/semmle/go/security/RequestForgeryCustomizations.qll @@ -9,6 +9,7 @@ import semmle.go.dataflow.barrierguardutil.RedirectCheckBarrierGuard import semmle.go.dataflow.barrierguardutil.RegexpCheck import semmle.go.dataflow.barrierguardutil.UrlCheck import semmle.go.dataflow.ExternalFlow +private import semmle.go.security.Sanitizers /** Provides classes and predicates for the request forgery query. */ module RequestForgery { @@ -114,6 +115,11 @@ module RequestForgery { * considered a barrier guard for `url`. */ class UrlCheckAsBarrierGuard extends UrlCheckBarrier, Sanitizer { } + + /** + * A simple-typed node, considered a sanitizer for request forgery. + */ + private class DefaultSanitizer extends Sanitizer instanceof SimpleTypeSanitizer { } } /** A sink for request forgery, considered as a sink for safe URL flow. */ diff --git a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected index 224a2c2b72e..15b0e179e98 100644 --- a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected +++ b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected @@ -13,7 +13,6 @@ | tst.go:39:2:39:30 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | The $@ of this request depends on a $@. | tst.go:39:11:39:29 | ...+... | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | | tst.go:41:2:41:41 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | The $@ of this request depends on a $@. | tst.go:41:11:41:40 | ...+... | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | | tst.go:49:2:49:21 | call to Get | tst.go:11:13:11:35 | call to FormValue | tst.go:49:11:49:20 | call to String | The $@ of this request depends on a $@. | tst.go:49:11:49:20 | call to String | URL | tst.go:11:13:11:35 | call to FormValue | user-provided value | -| tst.go:53:2:53:26 | call to Get | tst.go:52:42:52:52 | call to intSource | tst.go:53:11:53:25 | ...+... | The $@ of this request depends on a $@. | tst.go:53:11:53:25 | ...+... | URL | tst.go:52:42:52:52 | call to intSource | user-provided value | | websocket.go:65:12:65:53 | call to Dial | websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:65:27:65:40 | untrustedInput | WebSocket URL | websocket.go:60:21:60:31 | call to Referer | user-provided value | | websocket.go:79:13:79:40 | call to DialConfig | websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:78:36:78:49 | untrustedInput | WebSocket URL | websocket.go:74:21:74:31 | call to Referer | user-provided value | | websocket.go:91:3:91:50 | call to Dial | websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:91:31:91:44 | untrustedInput | WebSocket URL | websocket.go:88:21:88:31 | call to Referer | user-provided value | @@ -24,44 +23,38 @@ | websocket.go:197:7:197:36 | call to BuildProxy | websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:197:22:197:35 | untrustedInput | WebSocket URL | websocket.go:195:21:195:31 | call to Referer | user-provided value | | websocket.go:204:7:204:29 | call to New | websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | The $@ of this request depends on a $@. | websocket.go:204:15:204:28 | untrustedInput | WebSocket URL | websocket.go:202:21:202:31 | call to Referer | user-provided value | edges -| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:19:11:19:17 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:21:12:21:18 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:23:12:23:18 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:25:16:25:22 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:28:35:28:41 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:31:68:31:74 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:34:13:34:19 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:35:14:35:20 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:36:14:36:20 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:37:18:37:24 | tainted | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | provenance | Src:MaD:2 | -| tst.go:11:13:11:35 | call to FormValue | tst.go:48:11:48:18 | tainted2 | provenance | Src:MaD:2 | +| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:19:11:19:17 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:21:12:21:18 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:23:12:23:18 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:25:16:25:22 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:28:35:28:41 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:31:68:31:74 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:34:13:34:19 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:35:14:35:20 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:36:14:36:20 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:37:18:37:24 | tainted | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | provenance | Src:MaD:1 | +| tst.go:11:13:11:35 | call to FormValue | tst.go:48:11:48:18 | tainted2 | provenance | Src:MaD:1 | | tst.go:48:2:48:2 | implicit dereference [postupdate] | tst.go:48:2:48:2 | u [postupdate] | provenance | | | tst.go:48:2:48:2 | u [postupdate] | tst.go:49:11:49:11 | u | provenance | | | tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | implicit dereference [postupdate] | provenance | Config | | tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | u [postupdate] | provenance | Config | -| tst.go:49:11:49:11 | u | tst.go:49:11:49:20 | call to String | provenance | MaD:5 | -| tst.go:52:9:52:53 | []type{args} [array] | tst.go:52:9:52:53 | call to Sprintf | provenance | MaD:4 | -| tst.go:52:9:52:53 | call to Sprintf | tst.go:53:11:53:25 | ...+... | provenance | | -| tst.go:52:42:52:52 | call to intSource | tst.go:52:9:52:53 | []type{args} [array] | provenance | Src:MaD:1 | -| tst.go:52:42:52:52 | call to intSource | tst.go:52:9:52:53 | call to Sprintf | provenance | Src:MaD:1 FunctionModel | -| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | provenance | Src:MaD:3 | -| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | provenance | Src:MaD:3 | +| tst.go:49:11:49:11 | u | tst.go:49:11:49:20 | call to String | provenance | MaD:3 | +| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:22:197:35 | untrustedInput | provenance | Src:MaD:2 | +| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:15:204:28 | untrustedInput | provenance | Src:MaD:2 | models -| 1 | Source: main; ; false; intSource; ; ; ReturnValue; remote; manual | -| 2 | Source: net/http; Request; true; FormValue; ; ; ReturnValue; remote; manual | -| 3 | Source: net/http; Request; true; Referer; ; ; ReturnValue; remote; manual | -| 4 | Summary: fmt; ; false; Sprintf; ; ; Argument[1].ArrayElement; ReturnValue; taint; manual | -| 5 | Summary: fmt; Stringer; true; String; ; ; Argument[receiver]; ReturnValue; taint; manual | +| 1 | Source: net/http; Request; true; FormValue; ; ; ReturnValue; remote; manual | +| 2 | Source: net/http; Request; true; Referer; ; ; ReturnValue; remote; manual | +| 3 | Summary: fmt; Stringer; true; String; ; ; Argument[receiver]; ReturnValue; taint; manual | nodes | RequestForgery.go:8:12:8:34 | call to FormValue | semmle.label | call to FormValue | | RequestForgery.go:11:24:11:65 | ...+... | semmle.label | ...+... | @@ -83,10 +76,6 @@ nodes | tst.go:48:11:48:18 | tainted2 | semmle.label | tainted2 | | tst.go:49:11:49:11 | u | semmle.label | u | | tst.go:49:11:49:20 | call to String | semmle.label | call to String | -| tst.go:52:9:52:53 | []type{args} [array] | semmle.label | []type{args} [array] | -| tst.go:52:9:52:53 | call to Sprintf | semmle.label | call to Sprintf | -| tst.go:52:42:52:52 | call to intSource | semmle.label | call to intSource | -| tst.go:53:11:53:25 | ...+... | semmle.label | ...+... | | websocket.go:60:21:60:31 | call to Referer | semmle.label | call to Referer | | websocket.go:65:27:65:40 | untrustedInput | semmle.label | untrustedInput | | websocket.go:74:21:74:31 | call to Referer | semmle.label | call to Referer | diff --git a/go/ql/test/query-tests/Security/CWE-918/tst.go b/go/ql/test/query-tests/Security/CWE-918/tst.go index 479d7aa8c92..e237f5f30e7 100644 --- a/go/ql/test/query-tests/Security/CWE-918/tst.go +++ b/go/ql/test/query-tests/Security/CWE-918/tst.go @@ -49,8 +49,8 @@ func handler2(w http.ResponseWriter, req *http.Request) { http.Get(u.String()) // $ Alert // Simple types are considered sanitized. - url := fmt.Sprintf("%s/%d", "some-url", intSource()) // $ SPURIOUS: Source - http.Get("http://" + url) // $ SPURIOUS: Alert + url := fmt.Sprintf("%s/%d", "some-url", intSource()) + http.Get("http://" + url) } func main() { From 37151791b42a7f056ca636dc18c4e69605aa9ff7 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Oct 2025 12:24:58 +0100 Subject: [PATCH 34/82] Add change notes --- ...-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md | 4 ++++ .../2025-10-09-sanitize-simple-types-request-forgery.md | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md create mode 100644 go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md diff --git a/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md b/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md new file mode 100644 index 00000000000..647d9a4332c --- /dev/null +++ b/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md @@ -0,0 +1,4 @@ +--- +category: deprecated +--- +* The class `SqlInjection::NumericOrBooleanSanitizer` has been deprecated. Use `SimpleTypeSanitizer` from `semmle.go.security.Sanitizers` instead. diff --git a/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md b/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md new file mode 100644 index 00000000000..1bbf8c7f88a --- /dev/null +++ b/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The query `go/request-forgery` will no longer report alerts when the user input is of a simple type, like a number or a boolean. From b9eae31172e8d01a21e0e748c9eed8305826a6b4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 10:44:08 +0200 Subject: [PATCH 35/82] C#: Add parameter locations test. --- csharp/ql/test/library-tests/locations/A.cs | 4 +-- .../locations/locations.expected | 34 +++++++++++++++++++ .../test/library-tests/locations/locations.ql | 4 +++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/csharp/ql/test/library-tests/locations/A.cs b/csharp/ql/test/library-tests/locations/A.cs index 7f641a0024e..451f684ecd4 100644 --- a/csharp/ql/test/library-tests/locations/A.cs +++ b/csharp/ql/test/library-tests/locations/A.cs @@ -5,8 +5,8 @@ public abstract class A public abstract T Prop { get; } public abstract T this[int index] { get; set; } public abstract event EventHandler Event; - public void Apply(T t) { } - public abstract object ToObject(T t); + public void Apply(T t1) { } + public abstract object ToObject(T t2); } public class A2 : A diff --git a/csharp/ql/test/library-tests/locations/locations.expected b/csharp/ql/test/library-tests/locations/locations.expected index 1710f4e3cec..ead96a89ab2 100644 --- a/csharp/ql/test/library-tests/locations/locations.expected +++ b/csharp/ql/test/library-tests/locations/locations.expected @@ -104,3 +104,37 @@ tupletype_location | Multiple1.cs:7:19:7:31 | (Int32,String) | Multiple1.cs:7:19:7:31 | Multiple1.cs:7:19:7:31 | | Multiple1.cs:7:19:7:31 | (Int32,String) | Multiple2.cs:9:9:9:21 | Multiple2.cs:9:9:9:21 | | Multiple1.cs:10:9:10:18 | (Int32,Int32) | Multiple1.cs:10:9:10:18 | Multiple1.cs:10:9:10:18 | +parameter_locations +| A.cs:6:41:6:43 | get_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:41:6:43 | get_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:41:6:43 | get_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:32:6:36 | index | A.cs:6:32:6:36 | A.cs:6:32:6:36 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:46:6:48 | value | A.cs:6:46:6:48 | A.cs:6:46:6:48 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:46:6:48 | value | A.cs:6:46:6:48 | A.cs:6:46:6:48 | +| A.cs:6:46:6:48 | set_Item | A.cs:6:46:6:48 | value | A.cs:6:46:6:48 | A.cs:6:46:6:48 | +| A.cs:7:40:7:44 | add_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:7:40:7:44 | add_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:7:40:7:44 | add_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:7:40:7:44 | remove_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:7:40:7:44 | remove_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:7:40:7:44 | remove_Event | A.cs:7:40:7:44 | value | A.cs:7:40:7:44 | A.cs:7:40:7:44 | +| A.cs:8:17:8:21 | Apply | A.cs:8:25:8:26 | t1 | A.cs:8:25:8:26 | A.cs:8:25:8:26 | +| A.cs:8:17:8:21 | Apply | A.cs:8:25:8:26 | t1 | A.cs:8:25:8:26 | A.cs:8:25:8:26 | +| A.cs:8:17:8:21 | Apply | A.cs:8:25:8:26 | t1 | A.cs:8:25:8:26 | A.cs:8:25:8:26 | +| A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | +| A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | +| A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | +| A.cs:18:9:18:11 | get_Item | A.cs:16:37:16:37 | i | A.cs:16:37:16:37 | A.cs:16:37:16:37 | +| A.cs:19:9:19:11 | set_Item | A.cs:16:37:16:37 | i | A.cs:16:37:16:37 | A.cs:16:37:16:37 | +| A.cs:19:9:19:11 | set_Item | A.cs:19:9:19:11 | value | A.cs:19:9:19:11 | A.cs:19:9:19:11 | +| A.cs:24:9:24:11 | add_Event | A.cs:24:9:24:11 | value | A.cs:24:9:24:11 | A.cs:24:9:24:11 | +| A.cs:25:9:25:14 | remove_Event | A.cs:25:9:25:14 | value | A.cs:25:9:25:14 | A.cs:25:9:25:14 | +| A.cs:28:28:28:35 | ToObject | A.cs:28:44:28:44 | t | A.cs:28:44:28:44 | A.cs:28:44:28:44 | +| B.cs:9:9:9:11 | get_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | +| B.cs:10:9:10:11 | set_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | +| B.cs:10:9:10:11 | set_Item | B.cs:10:9:10:11 | value | B.cs:10:9:10:11 | B.cs:10:9:10:11 | +| B.cs:15:9:15:11 | add_Event | B.cs:15:9:15:11 | value | B.cs:15:9:15:11 | B.cs:15:9:15:11 | +| B.cs:16:9:16:14 | remove_Event | B.cs:16:9:16:14 | value | B.cs:16:9:16:14 | B.cs:16:9:16:14 | +| B.cs:19:28:19:35 | ToObject | B.cs:19:41:19:41 | t | B.cs:19:41:19:41 | B.cs:19:41:19:41 | diff --git a/csharp/ql/test/library-tests/locations/locations.ql b/csharp/ql/test/library-tests/locations/locations.ql index 670a2740811..0346db8432c 100644 --- a/csharp/ql/test/library-tests/locations/locations.ql +++ b/csharp/ql/test/library-tests/locations/locations.ql @@ -26,3 +26,7 @@ query predicate calltype_location(Call call, Type t, SourceLocation l) { query predicate typeparameter_location(TypeParameter tp, SourceLocation l) { tp.getALocation() = l } query predicate tupletype_location(TupleType tt, SourceLocation l) { tt.getALocation() = l } + +query predicate parameter_locations(Callable c, Parameter p, SourceLocation l) { + p.getCallable() = c and p.getALocation() = l +} From f200c3ce850ca72d640762898303063135984288 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 10:48:34 +0200 Subject: [PATCH 36/82] C#: Add field location example. --- csharp/ql/test/library-tests/locations/A.cs | 1 + .../locations/locations.expected | 43 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/csharp/ql/test/library-tests/locations/A.cs b/csharp/ql/test/library-tests/locations/A.cs index 451f684ecd4..116bc648db0 100644 --- a/csharp/ql/test/library-tests/locations/A.cs +++ b/csharp/ql/test/library-tests/locations/A.cs @@ -7,6 +7,7 @@ public abstract class A public abstract event EventHandler Event; public void Apply(T t1) { } public abstract object ToObject(T t2); + public object Field; } public class A2 : A diff --git a/csharp/ql/test/library-tests/locations/locations.expected b/csharp/ql/test/library-tests/locations/locations.expected index ead96a89ab2..ae33df976af 100644 --- a/csharp/ql/test/library-tests/locations/locations.expected +++ b/csharp/ql/test/library-tests/locations/locations.expected @@ -4,21 +4,24 @@ member_locations | A.cs:3:23:3:26 | A | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | +| A.cs:3:23:3:26 | A | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | | A.cs:3:23:3:26 | A | A.cs:5:23:5:26 | Prop | A.cs:5:23:5:26 | A.cs:5:23:5:26 | | A.cs:3:23:3:26 | A | A.cs:6:23:6:26 | Item | A.cs:6:23:6:26 | A.cs:6:23:6:26 | | A.cs:3:23:3:26 | A | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | +| A.cs:3:23:3:26 | A | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | | A.cs:3:23:3:26 | A`1 | A.cs:5:23:5:26 | Prop | A.cs:5:23:5:26 | A.cs:5:23:5:26 | | A.cs:3:23:3:26 | A`1 | A.cs:6:23:6:26 | Item | A.cs:6:23:6:26 | A.cs:6:23:6:26 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A`1 | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A`1 | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | -| A.cs:12:14:12:15 | A2 | A.cs:14:28:14:31 | Prop | A.cs:14:28:14:31 | A.cs:14:28:14:31 | -| A.cs:12:14:12:15 | A2 | A.cs:16:28:16:31 | Item | A.cs:16:28:16:31 | A.cs:16:28:16:31 | -| A.cs:12:14:12:15 | A2 | A.cs:22:40:22:44 | Event | A.cs:22:40:22:44 | A.cs:22:40:22:44 | -| A.cs:12:14:12:15 | A2 | A.cs:28:28:28:35 | ToObject | A.cs:28:28:28:35 | A.cs:28:28:28:35 | -| A.cs:12:14:12:15 | A2 | A.cs:30:17:30:17 | M | A.cs:30:17:30:17 | A.cs:30:17:30:17 | +| A.cs:3:23:3:26 | A`1 | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | +| A.cs:13:14:13:15 | A2 | A.cs:15:28:15:31 | Prop | A.cs:15:28:15:31 | A.cs:15:28:15:31 | +| A.cs:13:14:13:15 | A2 | A.cs:17:28:17:31 | Item | A.cs:17:28:17:31 | A.cs:17:28:17:31 | +| A.cs:13:14:13:15 | A2 | A.cs:23:40:23:44 | Event | A.cs:23:40:23:44 | A.cs:23:40:23:44 | +| A.cs:13:14:13:15 | A2 | A.cs:29:28:29:35 | ToObject | A.cs:29:28:29:35 | A.cs:29:28:29:35 | +| A.cs:13:14:13:15 | A2 | A.cs:31:17:31:17 | M | A.cs:31:17:31:17 | A.cs:31:17:31:17 | | B.cs:3:14:3:14 | B | B.cs:5:25:5:28 | Prop | B.cs:5:25:5:28 | B.cs:5:25:5:28 | | B.cs:3:14:3:14 | B | B.cs:7:25:7:28 | Item | B.cs:7:25:7:28 | B.cs:7:25:7:28 | | B.cs:3:14:3:14 | B | B.cs:13:40:13:44 | Event | B.cs:13:40:13:44 | B.cs:13:40:13:44 | @@ -47,11 +50,11 @@ accessor_location | A.cs:3:23:3:26 | A`1 | A.cs:6:46:6:48 | set_Item | A.cs:6:46:6:48 | A.cs:6:46:6:48 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | add_Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | remove_Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | -| A.cs:12:14:12:15 | A2 | A.cs:14:36:14:37 | get_Prop | A.cs:14:36:14:37 | A.cs:14:36:14:37 | -| A.cs:12:14:12:15 | A2 | A.cs:18:9:18:11 | get_Item | A.cs:18:9:18:11 | A.cs:18:9:18:11 | -| A.cs:12:14:12:15 | A2 | A.cs:19:9:19:11 | set_Item | A.cs:19:9:19:11 | A.cs:19:9:19:11 | -| A.cs:12:14:12:15 | A2 | A.cs:24:9:24:11 | add_Event | A.cs:24:9:24:11 | A.cs:24:9:24:11 | -| A.cs:12:14:12:15 | A2 | A.cs:25:9:25:14 | remove_Event | A.cs:25:9:25:14 | A.cs:25:9:25:14 | +| A.cs:13:14:13:15 | A2 | A.cs:15:36:15:37 | get_Prop | A.cs:15:36:15:37 | A.cs:15:36:15:37 | +| A.cs:13:14:13:15 | A2 | A.cs:19:9:19:11 | get_Item | A.cs:19:9:19:11 | A.cs:19:9:19:11 | +| A.cs:13:14:13:15 | A2 | A.cs:20:9:20:11 | set_Item | A.cs:20:9:20:11 | A.cs:20:9:20:11 | +| A.cs:13:14:13:15 | A2 | A.cs:25:9:25:11 | add_Event | A.cs:25:9:25:11 | A.cs:25:9:25:11 | +| A.cs:13:14:13:15 | A2 | A.cs:26:9:26:14 | remove_Event | A.cs:26:9:26:14 | A.cs:26:9:26:14 | | B.cs:3:14:3:14 | B | B.cs:5:33:5:33 | get_Prop | B.cs:5:33:5:33 | B.cs:5:33:5:33 | | B.cs:3:14:3:14 | B | B.cs:9:9:9:11 | get_Item | B.cs:9:9:9:11 | B.cs:9:9:9:11 | | B.cs:3:14:3:14 | B | B.cs:10:9:10:11 | set_Item | B.cs:10:9:10:11 | B.cs:10:9:10:11 | @@ -62,7 +65,7 @@ type_location | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | A.cs:3:23:3:26 | A`1 | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | A.cs:3:25:3:25 | T | A.cs:3:25:3:25 | A.cs:3:25:3:25 | -| A.cs:12:14:12:15 | A2 | A.cs:12:14:12:15 | A.cs:12:14:12:15 | +| A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | | Base.cs:1:23:1:29 | Base | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | @@ -87,11 +90,11 @@ type_location | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2.cs:5:14:5:30 | | Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub.cs:1:14:1:16 | calltype_location -| A.cs:12:14:12:15 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | -| A.cs:32:20:32:24 | object creation of type A2 | A.cs:12:14:12:15 | A2 | A.cs:12:14:12:15 | A.cs:12:14:12:15 | +| A.cs:13:14:13:15 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | +| A.cs:33:20:33:24 | object creation of type A2 | A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | | B.cs:3:14:3:14 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | C.cs:7:15:7:21 | object creation of type B | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | -| C.cs:9:17:9:24 | object creation of type A2 | A.cs:12:14:12:15 | A2 | A.cs:12:14:12:15 | A.cs:12:14:12:15 | +| C.cs:9:17:9:24 | object creation of type A2 | A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | | Sub.cs:1:14:1:16 | call to constructor Base | Base.cs:1:23:1:29 | Base | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | | Sub.cs:6:17:6:31 | object creation of type InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | typeparameter_location @@ -126,12 +129,12 @@ parameter_locations | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | -| A.cs:18:9:18:11 | get_Item | A.cs:16:37:16:37 | i | A.cs:16:37:16:37 | A.cs:16:37:16:37 | -| A.cs:19:9:19:11 | set_Item | A.cs:16:37:16:37 | i | A.cs:16:37:16:37 | A.cs:16:37:16:37 | -| A.cs:19:9:19:11 | set_Item | A.cs:19:9:19:11 | value | A.cs:19:9:19:11 | A.cs:19:9:19:11 | -| A.cs:24:9:24:11 | add_Event | A.cs:24:9:24:11 | value | A.cs:24:9:24:11 | A.cs:24:9:24:11 | -| A.cs:25:9:25:14 | remove_Event | A.cs:25:9:25:14 | value | A.cs:25:9:25:14 | A.cs:25:9:25:14 | -| A.cs:28:28:28:35 | ToObject | A.cs:28:44:28:44 | t | A.cs:28:44:28:44 | A.cs:28:44:28:44 | +| A.cs:19:9:19:11 | get_Item | A.cs:17:37:17:37 | i | A.cs:17:37:17:37 | A.cs:17:37:17:37 | +| A.cs:20:9:20:11 | set_Item | A.cs:17:37:17:37 | i | A.cs:17:37:17:37 | A.cs:17:37:17:37 | +| A.cs:20:9:20:11 | set_Item | A.cs:20:9:20:11 | value | A.cs:20:9:20:11 | A.cs:20:9:20:11 | +| A.cs:25:9:25:11 | add_Event | A.cs:25:9:25:11 | value | A.cs:25:9:25:11 | A.cs:25:9:25:11 | +| A.cs:26:9:26:14 | remove_Event | A.cs:26:9:26:14 | value | A.cs:26:9:26:14 | A.cs:26:9:26:14 | +| A.cs:29:28:29:35 | ToObject | A.cs:29:44:29:44 | t | A.cs:29:44:29:44 | A.cs:29:44:29:44 | | B.cs:9:9:9:11 | get_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | | B.cs:10:9:10:11 | set_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | | B.cs:10:9:10:11 | set_Item | B.cs:10:9:10:11 | value | B.cs:10:9:10:11 | B.cs:10:9:10:11 | From 051b83f036edd65f84b6dc78c0b3a1a4f2858ded Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 11:44:57 +0200 Subject: [PATCH 37/82] C#: Only extract the unbound location for fields and parameters and use this location in the QL code. --- csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs | 5 ++++- .../extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs | 5 +++-- csharp/ql/lib/semmle/code/csharp/Variable.qll | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs index 61b5c40e6e5..75a35c2a5f0 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs @@ -49,7 +49,10 @@ namespace Semmle.Extraction.CSharp.Entities } } - WriteLocationsToTrap(trapFile.field_location, this, Locations); + if (Context.ExtractLocation(Symbol)) + { + WriteLocationsToTrap(trapFile.field_location, this, Locations); + } if (!IsSourceDeclaration || !Symbol.FromSource()) return; diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs index a5d208fc86f..8b099261a10 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Parameter.cs @@ -115,9 +115,10 @@ namespace Semmle.Extraction.CSharp.Entities var type = Type.Create(Context, Symbol.Type); trapFile.@params(this, Name, type.TypeRef, Ordinal, ParamKind, Parent!, Original); - foreach (var l in Symbol.Locations) + if (Context.ExtractLocation(Symbol)) { - WriteLocationToTrap(trapFile.param_location, this, Context.CreateLocation(l)); + var locations = Context.GetLocations(Symbol); + WriteLocationsToTrap(trapFile.param_location, this, locations); } if (!Symbol.Locations.Any() && diff --git a/csharp/ql/lib/semmle/code/csharp/Variable.qll b/csharp/ql/lib/semmle/code/csharp/Variable.qll index 02018c260a6..746ea6acd2f 100644 --- a/csharp/ql/lib/semmle/code/csharp/Variable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Variable.qll @@ -213,7 +213,7 @@ class Parameter extends LocalScopeVariable, Attributable, TopLevelExprParent, @p params(this, _, getTypeRef(result), _, _, _, _) } - override Location getALocation() { param_location(this, result) } + override Location getALocation() { param_location(this.getUnboundDeclaration(), result) } override string toString() { result = this.getName() } @@ -449,7 +449,7 @@ class Field extends Variable, AssignableMember, Attributable, TopLevelExprParent fields(this, _, _, _, getTypeRef(result), _) } - override Location getALocation() { field_location(this, result) } + override Location getALocation() { field_location(this.getUnboundDeclaration(), result) } override string toString() { result = Variable.super.toString() } From 02428fc46708ee1d027839ebf5bb8895e9c6d491 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 13:59:17 +0200 Subject: [PATCH 38/82] C#: Add some location examples for constructors, destructors and operators. --- csharp/ql/test/library-tests/locations/A.cs | 4 + .../locations/locations.expected | 76 ++++++++++++++----- .../test/library-tests/locations/locations.ql | 1 - 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/csharp/ql/test/library-tests/locations/A.cs b/csharp/ql/test/library-tests/locations/A.cs index 116bc648db0..565683622da 100644 --- a/csharp/ql/test/library-tests/locations/A.cs +++ b/csharp/ql/test/library-tests/locations/A.cs @@ -8,6 +8,10 @@ public abstract class A public void Apply(T t1) { } public abstract object ToObject(T t2); public object Field; + public A() { } + public A(T t) { } + ~A() { } + public static A operator +(A a1, A a2) { return a1; } } public class A2 : A diff --git a/csharp/ql/test/library-tests/locations/locations.expected b/csharp/ql/test/library-tests/locations/locations.expected index ae33df976af..d41369ddcd4 100644 --- a/csharp/ql/test/library-tests/locations/locations.expected +++ b/csharp/ql/test/library-tests/locations/locations.expected @@ -5,34 +5,61 @@ member_locations | A.cs:3:23:3:26 | A | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | | A.cs:3:23:3:26 | A | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | +| A.cs:3:23:3:26 | A | A.cs:11:12:11:12 | A | A.cs:11:12:11:12 | A.cs:11:12:11:12 | +| A.cs:3:23:3:26 | A | A.cs:12:12:12:12 | A | A.cs:12:12:12:12 | A.cs:12:12:12:12 | +| A.cs:3:23:3:26 | A | A.cs:13:6:13:6 | ~A | A.cs:13:6:13:6 | A.cs:13:6:13:6 | +| A.cs:3:23:3:26 | A | A.cs:14:33:14:33 | + | A.cs:14:33:14:33 | A.cs:14:33:14:33 | | A.cs:3:23:3:26 | A | A.cs:5:23:5:26 | Prop | A.cs:5:23:5:26 | A.cs:5:23:5:26 | | A.cs:3:23:3:26 | A | A.cs:6:23:6:26 | Item | A.cs:6:23:6:26 | A.cs:6:23:6:26 | | A.cs:3:23:3:26 | A | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | | A.cs:3:23:3:26 | A | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | +| A.cs:3:23:3:26 | A | A.cs:11:12:11:12 | A | A.cs:11:12:11:12 | A.cs:11:12:11:12 | +| A.cs:3:23:3:26 | A | A.cs:12:12:12:12 | A | A.cs:12:12:12:12 | A.cs:12:12:12:12 | +| A.cs:3:23:3:26 | A | A.cs:13:6:13:6 | ~A | A.cs:13:6:13:6 | A.cs:13:6:13:6 | +| A.cs:3:23:3:26 | A | A.cs:14:33:14:33 | + | A.cs:14:33:14:33 | A.cs:14:33:14:33 | | A.cs:3:23:3:26 | A`1 | A.cs:5:23:5:26 | Prop | A.cs:5:23:5:26 | A.cs:5:23:5:26 | | A.cs:3:23:3:26 | A`1 | A.cs:6:23:6:26 | Item | A.cs:6:23:6:26 | A.cs:6:23:6:26 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A`1 | A.cs:8:17:8:21 | Apply | A.cs:8:17:8:21 | A.cs:8:17:8:21 | | A.cs:3:23:3:26 | A`1 | A.cs:9:28:9:35 | ToObject | A.cs:9:28:9:35 | A.cs:9:28:9:35 | | A.cs:3:23:3:26 | A`1 | A.cs:10:19:10:23 | Field | A.cs:10:19:10:23 | A.cs:10:19:10:23 | -| A.cs:13:14:13:15 | A2 | A.cs:15:28:15:31 | Prop | A.cs:15:28:15:31 | A.cs:15:28:15:31 | -| A.cs:13:14:13:15 | A2 | A.cs:17:28:17:31 | Item | A.cs:17:28:17:31 | A.cs:17:28:17:31 | -| A.cs:13:14:13:15 | A2 | A.cs:23:40:23:44 | Event | A.cs:23:40:23:44 | A.cs:23:40:23:44 | -| A.cs:13:14:13:15 | A2 | A.cs:29:28:29:35 | ToObject | A.cs:29:28:29:35 | A.cs:29:28:29:35 | -| A.cs:13:14:13:15 | A2 | A.cs:31:17:31:17 | M | A.cs:31:17:31:17 | A.cs:31:17:31:17 | +| A.cs:3:23:3:26 | A`1 | A.cs:11:12:11:12 | A | A.cs:11:12:11:12 | A.cs:11:12:11:12 | +| A.cs:3:23:3:26 | A`1 | A.cs:12:12:12:12 | A | A.cs:12:12:12:12 | A.cs:12:12:12:12 | +| A.cs:3:23:3:26 | A`1 | A.cs:13:6:13:6 | ~A | A.cs:13:6:13:6 | A.cs:13:6:13:6 | +| A.cs:3:23:3:26 | A`1 | A.cs:14:33:14:33 | + | A.cs:14:33:14:33 | A.cs:14:33:14:33 | +| A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A.cs:17:14:17:15 | +| A.cs:17:14:17:15 | A2 | A.cs:19:28:19:31 | Prop | A.cs:19:28:19:31 | A.cs:19:28:19:31 | +| A.cs:17:14:17:15 | A2 | A.cs:21:28:21:31 | Item | A.cs:21:28:21:31 | A.cs:21:28:21:31 | +| A.cs:17:14:17:15 | A2 | A.cs:27:40:27:44 | Event | A.cs:27:40:27:44 | A.cs:27:40:27:44 | +| A.cs:17:14:17:15 | A2 | A.cs:33:28:33:35 | ToObject | A.cs:33:28:33:35 | A.cs:33:28:33:35 | +| A.cs:17:14:17:15 | A2 | A.cs:35:17:35:17 | M | A.cs:35:17:35:17 | A.cs:35:17:35:17 | +| B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | | B.cs:3:14:3:14 | B | B.cs:5:25:5:28 | Prop | B.cs:5:25:5:28 | B.cs:5:25:5:28 | | B.cs:3:14:3:14 | B | B.cs:7:25:7:28 | Item | B.cs:7:25:7:28 | B.cs:7:25:7:28 | | B.cs:3:14:3:14 | B | B.cs:13:40:13:44 | Event | B.cs:13:40:13:44 | B.cs:13:40:13:44 | | B.cs:3:14:3:14 | B | B.cs:19:28:19:35 | ToObject | B.cs:19:28:19:35 | B.cs:19:28:19:35 | +| Base.cs:1:23:1:29 | Base | Base.cs:1:23:1:26 | Base | Base.cs:1:23:1:26 | Base.cs:1:23:1:26 | | Base.cs:1:23:1:29 | Base | Base.cs:3:17:3:17 | M | Base.cs:3:17:3:17 | Base.cs:3:17:3:17 | | Base.cs:1:23:1:29 | Base | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | +| Base.cs:1:23:1:29 | Base`1 | Base.cs:1:23:1:26 | Base | Base.cs:1:23:1:26 | Base.cs:1:23:1:26 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:3:17:3:17 | M | Base.cs:3:17:3:17 | Base.cs:3:17:3:17 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | +| Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | +| Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | +| Base.cs:8:23:8:30 | Base2`1 | Base.cs:8:23:8:27 | Base2 | Base.cs:8:23:8:27 | Base.cs:8:23:8:27 | +| C.cs:3:7:3:7 | C | C.cs:3:7:3:7 | C | C.cs:3:7:3:7 | C.cs:3:7:3:7 | | C.cs:3:7:3:7 | C | C.cs:5:17:5:17 | M | C.cs:5:17:5:17 | C.cs:5:17:5:17 | +| Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | +| Multiple1.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:36 | MultipleGeneric | Multiple1.cs:3:22:3:36 | Multiple1.cs:3:22:3:36 | +| Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:5:14:5:30 | Multiple1.cs:5:14:5:30 | | Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:7:33:7:33 | M | Multiple1.cs:7:33:7:33 | Multiple1.cs:7:33:7:33 | +| Multiple2.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | +| Multiple2.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:36 | MultipleGeneric | Multiple1.cs:3:22:3:36 | Multiple1.cs:3:22:3:36 | +| Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2.cs:5:14:5:30 | | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:7:17:7:17 | M | Multiple2.cs:7:17:7:17 | Multiple2.cs:7:17:7:17 | +| Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub.cs:1:14:1:16 | | Sub.cs:1:14:1:16 | Sub | Sub.cs:3:17:3:20 | SubM | Sub.cs:3:17:3:20 | Sub.cs:3:17:3:20 | accessor_location | A.cs:3:23:3:26 | A | A.cs:5:30:5:32 | get_Prop | A.cs:5:30:5:32 | A.cs:5:30:5:32 | @@ -50,11 +77,11 @@ accessor_location | A.cs:3:23:3:26 | A`1 | A.cs:6:46:6:48 | set_Item | A.cs:6:46:6:48 | A.cs:6:46:6:48 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | add_Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | remove_Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | -| A.cs:13:14:13:15 | A2 | A.cs:15:36:15:37 | get_Prop | A.cs:15:36:15:37 | A.cs:15:36:15:37 | -| A.cs:13:14:13:15 | A2 | A.cs:19:9:19:11 | get_Item | A.cs:19:9:19:11 | A.cs:19:9:19:11 | -| A.cs:13:14:13:15 | A2 | A.cs:20:9:20:11 | set_Item | A.cs:20:9:20:11 | A.cs:20:9:20:11 | -| A.cs:13:14:13:15 | A2 | A.cs:25:9:25:11 | add_Event | A.cs:25:9:25:11 | A.cs:25:9:25:11 | -| A.cs:13:14:13:15 | A2 | A.cs:26:9:26:14 | remove_Event | A.cs:26:9:26:14 | A.cs:26:9:26:14 | +| A.cs:17:14:17:15 | A2 | A.cs:19:36:19:37 | get_Prop | A.cs:19:36:19:37 | A.cs:19:36:19:37 | +| A.cs:17:14:17:15 | A2 | A.cs:23:9:23:11 | get_Item | A.cs:23:9:23:11 | A.cs:23:9:23:11 | +| A.cs:17:14:17:15 | A2 | A.cs:24:9:24:11 | set_Item | A.cs:24:9:24:11 | A.cs:24:9:24:11 | +| A.cs:17:14:17:15 | A2 | A.cs:29:9:29:11 | add_Event | A.cs:29:9:29:11 | A.cs:29:9:29:11 | +| A.cs:17:14:17:15 | A2 | A.cs:30:9:30:14 | remove_Event | A.cs:30:9:30:14 | A.cs:30:9:30:14 | | B.cs:3:14:3:14 | B | B.cs:5:33:5:33 | get_Prop | B.cs:5:33:5:33 | B.cs:5:33:5:33 | | B.cs:3:14:3:14 | B | B.cs:9:9:9:11 | get_Item | B.cs:9:9:9:11 | B.cs:9:9:9:11 | | B.cs:3:14:3:14 | B | B.cs:10:9:10:11 | set_Item | B.cs:10:9:10:11 | B.cs:10:9:10:11 | @@ -65,7 +92,7 @@ type_location | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | A.cs:3:23:3:26 | A`1 | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | A.cs:3:25:3:25 | T | A.cs:3:25:3:25 | A.cs:3:25:3:25 | -| A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | +| A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A.cs:17:14:17:15 | | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | | Base.cs:1:23:1:29 | Base | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | @@ -90,11 +117,11 @@ type_location | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2.cs:5:14:5:30 | | Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub.cs:1:14:1:16 | calltype_location -| A.cs:13:14:13:15 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | -| A.cs:33:20:33:24 | object creation of type A2 | A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | +| A.cs:17:14:17:15 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | +| A.cs:37:20:37:24 | object creation of type A2 | A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A.cs:17:14:17:15 | | B.cs:3:14:3:14 | call to constructor A | A.cs:3:23:3:26 | A | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | C.cs:7:15:7:21 | object creation of type B | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | -| C.cs:9:17:9:24 | object creation of type A2 | A.cs:13:14:13:15 | A2 | A.cs:13:14:13:15 | A.cs:13:14:13:15 | +| C.cs:9:17:9:24 | object creation of type A2 | A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A.cs:17:14:17:15 | | Sub.cs:1:14:1:16 | call to constructor Base | Base.cs:1:23:1:29 | Base | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | | Sub.cs:6:17:6:31 | object creation of type InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | typeparameter_location @@ -129,12 +156,21 @@ parameter_locations | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | | A.cs:9:28:9:35 | ToObject | A.cs:9:39:9:40 | t2 | A.cs:9:39:9:40 | A.cs:9:39:9:40 | -| A.cs:19:9:19:11 | get_Item | A.cs:17:37:17:37 | i | A.cs:17:37:17:37 | A.cs:17:37:17:37 | -| A.cs:20:9:20:11 | set_Item | A.cs:17:37:17:37 | i | A.cs:17:37:17:37 | A.cs:17:37:17:37 | -| A.cs:20:9:20:11 | set_Item | A.cs:20:9:20:11 | value | A.cs:20:9:20:11 | A.cs:20:9:20:11 | -| A.cs:25:9:25:11 | add_Event | A.cs:25:9:25:11 | value | A.cs:25:9:25:11 | A.cs:25:9:25:11 | -| A.cs:26:9:26:14 | remove_Event | A.cs:26:9:26:14 | value | A.cs:26:9:26:14 | A.cs:26:9:26:14 | -| A.cs:29:28:29:35 | ToObject | A.cs:29:44:29:44 | t | A.cs:29:44:29:44 | A.cs:29:44:29:44 | +| A.cs:12:12:12:12 | A | A.cs:12:16:12:16 | t | A.cs:12:16:12:16 | A.cs:12:16:12:16 | +| A.cs:12:12:12:12 | A | A.cs:12:16:12:16 | t | A.cs:12:16:12:16 | A.cs:12:16:12:16 | +| A.cs:12:12:12:12 | A | A.cs:12:16:12:16 | t | A.cs:12:16:12:16 | A.cs:12:16:12:16 | +| A.cs:14:33:14:33 | + | A.cs:14:40:14:41 | a1 | A.cs:14:40:14:41 | A.cs:14:40:14:41 | +| A.cs:14:33:14:33 | + | A.cs:14:40:14:41 | a1 | A.cs:14:40:14:41 | A.cs:14:40:14:41 | +| A.cs:14:33:14:33 | + | A.cs:14:40:14:41 | a1 | A.cs:14:40:14:41 | A.cs:14:40:14:41 | +| A.cs:14:33:14:33 | + | A.cs:14:49:14:50 | a2 | A.cs:14:49:14:50 | A.cs:14:49:14:50 | +| A.cs:14:33:14:33 | + | A.cs:14:49:14:50 | a2 | A.cs:14:49:14:50 | A.cs:14:49:14:50 | +| A.cs:14:33:14:33 | + | A.cs:14:49:14:50 | a2 | A.cs:14:49:14:50 | A.cs:14:49:14:50 | +| A.cs:23:9:23:11 | get_Item | A.cs:21:37:21:37 | i | A.cs:21:37:21:37 | A.cs:21:37:21:37 | +| A.cs:24:9:24:11 | set_Item | A.cs:21:37:21:37 | i | A.cs:21:37:21:37 | A.cs:21:37:21:37 | +| A.cs:24:9:24:11 | set_Item | A.cs:24:9:24:11 | value | A.cs:24:9:24:11 | A.cs:24:9:24:11 | +| A.cs:29:9:29:11 | add_Event | A.cs:29:9:29:11 | value | A.cs:29:9:29:11 | A.cs:29:9:29:11 | +| A.cs:30:9:30:14 | remove_Event | A.cs:30:9:30:14 | value | A.cs:30:9:30:14 | A.cs:30:9:30:14 | +| A.cs:33:28:33:35 | ToObject | A.cs:33:44:33:44 | t | A.cs:33:44:33:44 | A.cs:33:44:33:44 | | B.cs:9:9:9:11 | get_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | | B.cs:10:9:10:11 | set_Item | B.cs:7:34:7:34 | i | B.cs:7:34:7:34 | B.cs:7:34:7:34 | | B.cs:10:9:10:11 | set_Item | B.cs:10:9:10:11 | value | B.cs:10:9:10:11 | B.cs:10:9:10:11 | diff --git a/csharp/ql/test/library-tests/locations/locations.ql b/csharp/ql/test/library-tests/locations/locations.ql index 0346db8432c..d97852d7b3b 100644 --- a/csharp/ql/test/library-tests/locations/locations.ql +++ b/csharp/ql/test/library-tests/locations/locations.ql @@ -4,7 +4,6 @@ query predicate member_locations(Type t, Member m, SourceLocation l) { t = m.getDeclaringType() and l = m.getLocation() and not l instanceof EmptyLocation and - not m instanceof Constructor and t.fromSource() } From 89681a49e638476f3841872374eb33d97c6662ee Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 14:03:14 +0200 Subject: [PATCH 39/82] C#: Only extract the unbound locations for constructors, destructors and user defined operators and use this in the QL code. --- .../Entities/Constructor.cs | 15 +++++++++++++-- .../Entities/Destructor.cs | 5 ++++- .../Entities/UserOperator.cs | 5 ++++- csharp/ql/lib/semmle/code/csharp/Callable.qll | 6 +++--- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs index 4fa035446ef..462fd806788 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs @@ -29,7 +29,10 @@ namespace Semmle.Extraction.CSharp.Entities ContainingType!.PopulateGenerics(); trapFile.constructors(this, Symbol.ContainingType.Name, ContainingType, (Constructor)OriginalDefinition); - WriteLocationToTrap(trapFile.constructor_location, this, Location); + if (Context.ExtractLocation(Symbol) && (!IsDefault || IsBestSourceLocation)) + { + WriteLocationToTrap(trapFile.constructor_location, this, Location); + } if (MakeSynthetic) { @@ -168,7 +171,15 @@ namespace Semmle.Extraction.CSharp.Entities Symbol.ContainingType.IsSourceDeclaration() && !Symbol.ContainingType.IsAnonymousType; - private bool MakeSynthetic => IsPrimary || IsDefault; + /// + /// Returns true if we consider the reporting location of this constructor entity the best + /// location of the constructor. + /// For partial classes with default constructors, Roslyn consider each partial class declaration + /// as the possible location for the implicit default constructor. + /// + private bool IsBestSourceLocation => ReportingLocation is not null && Context.IsLocationInContext(ReportingLocation); + + private bool MakeSynthetic => IsPrimary || (IsDefault && IsBestSourceLocation); [return: NotNullIfNotNull(nameof(constructor))] public static new Constructor? Create(Context cx, IMethodSymbol? constructor) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Destructor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Destructor.cs index 3d07c7d42de..13e86792fc3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Destructor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Destructor.cs @@ -15,7 +15,10 @@ namespace Semmle.Extraction.CSharp.Entities ContainingType!.PopulateGenerics(); trapFile.destructors(this, $"~{Symbol.ContainingType.Name}", ContainingType, OriginalDefinition(Context, this, Symbol)); - WriteLocationToTrap(trapFile.destructor_location, this, Location); + if (Context.ExtractLocation(Symbol)) + { + WriteLocationToTrap(trapFile.destructor_location, this, Location); + } } private static new Destructor OriginalDefinition(Context cx, Destructor original, IMethodSymbol symbol) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs index e37d16567e1..40a40aab556 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs @@ -26,7 +26,10 @@ namespace Semmle.Extraction.CSharp.Entities returnType.TypeRef, (UserOperator)OriginalDefinition); - WriteLocationsToTrap(trapFile.operator_location, this, Locations); + if (Context.ExtractLocation(Symbol)) + { + WriteLocationsToTrap(trapFile.operator_location, this, Locations); + } if (IsSourceDeclaration) { diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index ef0d0673ce2..44e7c3cf4ca 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -357,7 +357,7 @@ class Constructor extends Callable, Member, Attributable, @constructor { override Constructor getUnboundDeclaration() { constructors(this, _, _, result) } - override Location getALocation() { constructor_location(this, result) } + override Location getALocation() { constructor_location(this.getUnboundDeclaration(), result) } override predicate fromSource() { Member.super.fromSource() and not this.isCompilerGenerated() } @@ -450,7 +450,7 @@ class Destructor extends Callable, Member, Attributable, @destructor { override Destructor getUnboundDeclaration() { destructors(this, _, _, result) } - override Location getALocation() { destructor_location(this, result) } + override Location getALocation() { destructor_location(this.getUnboundDeclaration(), result) } override string toString() { result = Callable.super.toString() } @@ -484,7 +484,7 @@ class Operator extends Callable, Member, Attributable, Overridable, @operator { override Operator getUnboundDeclaration() { operators(this, _, _, _, _, result) } - override Location getALocation() { operator_location(this, result) } + override Location getALocation() { operator_location(this.getUnboundDeclaration(), result) } override string toString() { result = Callable.super.toString() } From 11f20457e229506b01fc9b674e2d76ebe50fbc5e Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Oct 2025 14:15:07 +0100 Subject: [PATCH 40/82] Fix team name --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 472edff683b..ae1506f12a3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,5 +1,5 @@ # Catch-all for anything which isn't matched by a line lower down -* @github/codeql-alert-coverage-eng +* @github/code-scanning-alert-coverage # CodeQL language libraries /actions/ @github/codeql-dynamic From e8fd843e52a65c3de69a604ee2f4500c85f86fdc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Oct 2025 16:17:17 +0200 Subject: [PATCH 41/82] C#: Update some tuple related tests. --- .../assignables/Assignables.expected | 8 -------- .../library-tests/csharp7/TupleTypes.expected | 20 ++++++++----------- .../test/library-tests/csharp7/TupleTypes.ql | 4 ++-- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/csharp/ql/test/library-tests/assignables/Assignables.expected b/csharp/ql/test/library-tests/assignables/Assignables.expected index 6c11ac4869a..97c22cd9127 100644 --- a/csharp/ql/test/library-tests/assignables/Assignables.expected +++ b/csharp/ql/test/library-tests/assignables/Assignables.expected @@ -43,12 +43,6 @@ | Assignables.cs:92:23:92:23 | b | | Assignables.cs:92:33:92:33 | s | | Assignables.cs:95:40:95:44 | tuple | -| Assignables.cs:97:24:97:24 | Item1 | -| Assignables.cs:97:27:97:36 | Item2 | -| Assignables.cs:101:6:101:8 | Item1 | -| Assignables.cs:101:11:101:24 | Item2 | -| Assignables.cs:101:12:101:15 | Item1 | -| Assignables.cs:101:18:101:23 | Item2 | | Assignables.cs:108:13:108:13 | i | | Assignables.cs:109:14:109:14 | p | | Assignables.cs:113:25:113:25 | i | @@ -69,8 +63,6 @@ | Assignables.cs:132:13:132:13 | x | | Assignables.cs:133:29:133:29 | s | | Assignables.cs:138:19:138:19 | x | -| Discards.cs:5:6:5:8 | Item1 | -| Discards.cs:5:11:5:16 | Item2 | | Discards.cs:5:30:5:30 | x | | Discards.cs:19:14:19:14 | x | | Discards.cs:20:17:20:17 | y | diff --git a/csharp/ql/test/library-tests/csharp7/TupleTypes.expected b/csharp/ql/test/library-tests/csharp7/TupleTypes.expected index 9d7f3330151..86bd4d542b9 100644 --- a/csharp/ql/test/library-tests/csharp7/TupleTypes.expected +++ b/csharp/ql/test/library-tests/csharp7/TupleTypes.expected @@ -1,12 +1,8 @@ -| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 0 | CSharp7.cs:96:19:96:19 | Item1 | -| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 1 | CSharp7.cs:102:22:102:46 | Item2 | -| (Int32,Double) | (int, double) | ValueTuple | 2 | 0 | CSharp7.cs:213:6:213:8 | Item1 | -| (Int32,Double) | (int, double) | ValueTuple | 2 | 1 | CSharp7.cs:213:11:213:16 | Item2 | -| (Int32,Int32) | (int, int) | ValueTuple | 2 | 0 | CSharp7.cs:62:10:62:10 | Item1 | -| (Int32,Int32) | (int, int) | ValueTuple | 2 | 1 | CSharp7.cs:62:17:62:17 | Item2 | -| (Int32,String) | (int, string) | ValueTuple | 2 | 0 | CSharp7.cs:95:19:95:19 | Item1 | -| (Int32,String) | (int, string) | ValueTuple | 2 | 1 | CSharp7.cs:95:22:95:37 | Item2 | -| (String,Int32) | (string, int) | ValueTuple | 2 | 0 | CSharp7.cs:82:17:82:17 | Item1 | -| (String,Int32) | (string, int) | ValueTuple | 2 | 1 | CSharp7.cs:82:23:82:23 | Item2 | -| (String,String) | (string, string) | ValueTuple | 2 | 0 | CSharp7.cs:87:19:87:27 | Item1 | -| (String,String) | (string, string) | ValueTuple | 2 | 1 | CSharp7.cs:87:30:87:33 | Item2 | +| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 0 | Item1 | +| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 1 | Item2 | +| (Int32,Double) | (int, double) | ValueTuple | 2 | 0 | Item1 | +| (Int32,Double) | (int, double) | ValueTuple | 2 | 1 | Item2 | +| (Int32,String) | (int, string) | ValueTuple | 2 | 0 | Item1 | +| (Int32,String) | (int, string) | ValueTuple | 2 | 1 | Item2 | +| (String,String) | (string, string) | ValueTuple | 2 | 0 | Item1 | +| (String,String) | (string, string) | ValueTuple | 2 | 1 | Item2 | diff --git a/csharp/ql/test/library-tests/csharp7/TupleTypes.ql b/csharp/ql/test/library-tests/csharp7/TupleTypes.ql index 288fe1bfe98..c8fd4ac9ab0 100644 --- a/csharp/ql/test/library-tests/csharp7/TupleTypes.ql +++ b/csharp/ql/test/library-tests/csharp7/TupleTypes.ql @@ -1,6 +1,6 @@ import csharp from TupleType tt, int i -where tt.getAnElement().fromSource() +where tt.fromSource() select tt.getName(), tt.toStringWithTypes(), tt.getUnderlyingType().toStringWithTypes(), - tt.getArity(), i, tt.getElement(i) + tt.getArity(), i, tt.getElement(i).getName() From 0fc2875527537c0c3da393ae788ff2b670fe8c62 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 10 Oct 2025 09:31:42 +0200 Subject: [PATCH 42/82] Rust: Include tuple structs/variants in `CallExprBase.getStaticTarget()` --- .../ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll | 4 ++-- .../lib/codeql/rust/elements/internal/MethodCallExprImpl.qll | 3 +++ rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll | 2 +- rust/ql/lib/codeql/rust/internal/TypeInference.qll | 4 ++-- rust/ql/test/library-tests/definitions/Definitions.expected | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll index 19abc6e3df3..05d5aee7a06 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll @@ -19,8 +19,8 @@ module Impl { * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. */ class CallExprBase extends Generated::CallExprBase { - /** Gets the static target of this call, if any. */ - final Function getStaticTarget() { result = TypeInference::resolveCallTarget(this) } + /** Gets the static target (function or tuple struct/variant) of this call, if any. */ + final Addressable getStaticTarget() { result = TypeInference::resolveCallTarget(this) } override Expr getArg(int index) { result = this.getArgList().getArg(index) } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll index ac8d9b210e9..7617ae456bb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll @@ -38,5 +38,8 @@ module Impl { override string toStringImpl() { result = strictconcat(int i | | this.toStringPart(i) order by i) } + + /** Gets the static target of this method call, if any. */ + final Function getStaticTarget() { result = super.getStaticTarget() } } } diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll index 123824b3d69..b34b3abf7cb 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll @@ -26,7 +26,7 @@ class StreamCipherInit extends Cryptography::CryptographicOperation::Range { // `cipher::KeyIvInit::new`, `cipher::KeyIvInit::new_from_slices`, `rc2::Rc2::new_with_eff_key_len` or similar. exists(CallExprBase ce, string rawAlgorithmName | ce = this.asExpr().getExpr() and - ce.getStaticTarget().getName().getText() = + ce.getStaticTarget().(Function).getName().getText() = ["new", "new_from_slice", "new_with_eff_key_len", "new_from_slices"] and // extract the algorithm name from the type of `ce` or its receiver. exists(Type t, TypePath tp | diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll index c9dbf0bac13..c450670a1fc 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll @@ -2505,9 +2505,9 @@ private module Cached { ) } - /** Gets a function that `call` resolves to, if any. */ + /** Gets an item (function or tuple struct/variant) that `call` resolves to, if any. */ cached - Function resolveCallTarget(Call call) { + Addressable resolveCallTarget(Call call) { result = resolveMethodCallTarget(call) or result = resolveFunctionCallTarget(call) diff --git a/rust/ql/test/library-tests/definitions/Definitions.expected b/rust/ql/test/library-tests/definitions/Definitions.expected index 3786ab947f2..23ad4e291de 100644 --- a/rust/ql/test/library-tests/definitions/Definitions.expected +++ b/rust/ql/test/library-tests/definitions/Definitions.expected @@ -7,6 +7,7 @@ | main.rs:18:16:18:16 | T | main.rs:18:10:18:10 | T | path | | main.rs:19:23:19:23 | T | main.rs:18:10:18:10 | T | path | | main.rs:19:29:19:32 | Self | main.rs:16:5:16:24 | struct S2 | path | +| main.rs:20:13:20:14 | S2 | main.rs:16:5:16:24 | struct S2 | path | | main.rs:20:16:20:16 | x | main.rs:19:20:19:20 | x | local variable | | main.rs:29:5:29:11 | println | {EXTERNAL LOCATION} | MacroRules | path | | main.rs:29:22:29:26 | value | main.rs:29:50:29:54 | value | format argument | From b8c3a28de3e4fc7a6a617370ab14fd46652a52c9 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 10 Oct 2025 11:47:19 +0200 Subject: [PATCH 43/82] C#: Add change note. --- csharp/ql/lib/change-notes/2025-10-10-entity-locations.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2025-10-10-entity-locations.md diff --git a/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md b/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md new file mode 100644 index 00000000000..72aa663febe --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The extraction of location information for parameters, fields, constructors, destructors and user operators has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. From ef93b364da64f1bea6753c77153ce3ddab6c4624 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:08:48 +0100 Subject: [PATCH 44/82] Rust: Add test cases for the mysql library. --- .../query-tests/security/CWE-089/Cargo.lock | 394 +++++++++++++++++- .../query-tests/security/CWE-089/mysql.rs | 55 +++ .../query-tests/security/CWE-089/options.yml | 1 + 3 files changed, 444 insertions(+), 6 deletions(-) create mode 100644 rust/ql/test/query-tests/security/CWE-089/mysql.rs diff --git a/rust/ql/test/query-tests/security/CWE-089/Cargo.lock b/rust/ql/test/query-tests/security/CWE-089/Cargo.lock index 2df49df403f..217f1c4d6ea 100644 --- a/rust/ql/test/query-tests/security/CWE-089/Cargo.lock +++ b/rust/ql/test/query-tests/security/CWE-089/Cargo.lock @@ -17,6 +17,15 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -251,6 +260,21 @@ dependencies = [ "piper", ] +[[package]] +name = "btoi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad" +dependencies = [ + "num-traits", +] + +[[package]] +name = "bufstream" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" + [[package]] name = "bumpalo" version = "3.18.1" @@ -339,6 +363,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-queue" version = "0.3.12" @@ -364,6 +397,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "der" version = "0.7.10" @@ -375,6 +443,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "derive_utils" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -491,6 +570,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "flate2" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide", +] + [[package]] name = "flume" version = "0.11.1" @@ -1011,6 +1101,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -1034,9 +1130,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown", @@ -1051,6 +1147,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-enum" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d197db2f7ebf90507296df3aebaf65d69f5dce8559d8dbd82776a6cadab61bbf" +dependencies = [ + "derive_utils", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -1135,6 +1240,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1172,6 +1288,12 @@ dependencies = [ "value-bag", ] +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" + [[package]] name = "md-5" version = "0.10.6" @@ -1201,6 +1323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1214,6 +1337,83 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "mysql" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2510a735f601bab18202b07ea0a197bd1d130d3a5ce2edf4577d225f0c3ee4" +dependencies = [ + "bufstream", + "bytes", + "crossbeam-queue", + "crossbeam-utils", + "flate2", + "io-enum", + "libc", + "lru", + "mysql_common", + "named_pipe", + "pem", + "percent-encoding", + "socket2 0.5.10", + "twox-hash", + "url", +] + +[[package]] +name = "mysql-common-derive" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66f62cad7623a9cb6f8f64037f0c4f69c8db8e82914334a83c9788201c2c1bfa" +dependencies = [ + "darling", + "heck", + "num-bigint", + "proc-macro-crate", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", + "termcolor", + "thiserror", +] + +[[package]] +name = "mysql_common" +version = "0.35.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb9f371618ce723f095c61fbcdc36e8936956d2b62832f9c7648689b338e052" +dependencies = [ + "base64", + "bitflags 2.9.1", + "btoi", + "byteorder", + "bytes", + "crc32fast", + "flate2", + "getrandom 0.3.3", + "mysql-common-derive", + "num-bigint", + "num-traits", + "regex", + "saturating", + "serde", + "serde_json", + "sha1", + "sha2", + "thiserror", + "uuid", +] + +[[package]] +name = "named_pipe" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9c443cce91fc3e12f017290db75dde490d685cdaaf508d7159d7cf41f0eb2b" +dependencies = [ + "winapi", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -1231,6 +1431,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1366,6 +1576,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64", + "serde", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -1480,6 +1700,37 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -1543,6 +1794,35 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "regex" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + [[package]] name = "reqwest" version = "0.12.20" @@ -1697,6 +1977,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "saturating" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71" + [[package]] name = "schannel" version = "0.1.27" @@ -1737,18 +2023,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1817,6 +2113,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.10" @@ -2077,6 +2379,12 @@ dependencies = [ "unicode-properties", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -2148,11 +2456,21 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "test" version = "0.0.1" dependencies = [ "futures", + "mysql", "reqwest", "sqlx", ] @@ -2250,6 +2568,36 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + [[package]] name = "tower" version = "0.5.2" @@ -2333,6 +2681,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + [[package]] name = "typenum" version = "1.18.0" @@ -2389,6 +2743,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "value-bag" version = "1.11.1" @@ -2550,6 +2914,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2739,6 +3112,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs new file mode 100644 index 00000000000..711fe2be54b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -0,0 +1,55 @@ +use mysql::*; +use mysql::prelude::*; + +async fn test_mysql(url: &str) -> Result<(), Box> { + // connect through a MySQL connection pool + let mut pool = Pool::new("")?; // (this test is not runnable) + let mut conn: PooledConn = pool.get_conn()?; + let mut conn2: Conn = pool.get_conn()?.unwrap(); + + // construct queries + let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote10 + let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); + let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; + let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) + + // direct execution (safe) + let _ : Vec = conn.query(safe_query.as_str())?; + + // direct execution (unsafe) + let _ : Vec = conn.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_iter(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + + // prepared queries (safe) + let stmt = conn.prep(prepared_query.as_str())?; + let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),))?; + let _ : Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; + let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)])?; + conn.exec_drop(&stmt, (&remote_string.as_str(),)); + let _ : i64 = conn.exec_first(&stmt, (remote_string.as_str(),))?.unwrap(); + let _ : Result = conn.exec_first_opt(&stmt, (remote_string.as_str(),))?.unwrap(); + let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 })?; + let _ = conn.exec_fold_opt(&stmt, (remote_string.as_str(),), 0, |_: i64, _: Result| -> i64 { 0 })?; + let _ = conn.exec_iter(&stmt, (remote_string.as_str(),))?; + let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; + let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; + + Ok(()) +} + +fn main() { + println!("test_mysql..."); + match futures::executor::block_on(test_mysql("")) { + Ok(_) => println!(" successful!"), + Err(e) => println!(" error: {}", e), + } +} diff --git a/rust/ql/test/query-tests/security/CWE-089/options.yml b/rust/ql/test/query-tests/security/CWE-089/options.yml index 24744b7dfb4..776696a56a6 100644 --- a/rust/ql/test/query-tests/security/CWE-089/options.yml +++ b/rust/ql/test/query-tests/security/CWE-089/options.yml @@ -3,3 +3,4 @@ qltest_dependencies: - reqwest = { version = "0.12.9", features = ["blocking"] } - sqlx = { version = "0.8", features = ["mysql", "sqlite", "postgres", "runtime-async-std", "tls-native-tls"] } - futures = { version = "0.3" } + - mysql = { version = "26.0.1" } From 883e00558af2df4eca2e00e8ec05489b6597124a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:35:20 +0100 Subject: [PATCH 45/82] Rust: Add test cases for the mysql_async library. --- .../query-tests/security/CWE-089/Cargo.lock | 94 ++++++++++-- .../query-tests/security/CWE-089/mysql.rs | 134 ++++++++++++------ .../query-tests/security/CWE-089/options.yml | 1 + 3 files changed, 179 insertions(+), 50 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/Cargo.lock b/rust/ql/test/query-tests/security/CWE-089/Cargo.lock index 217f1c4d6ea..cd8ef4b1381 100644 --- a/rust/ql/test/query-tests/security/CWE-089/Cargo.lock +++ b/rust/ql/test/query-tests/security/CWE-089/Cargo.lock @@ -1199,6 +1199,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keyed_priority_queue" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" +dependencies = [ + "indexmap", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -1294,6 +1303,15 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +[[package]] +name = "lru" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown", +] + [[package]] name = "md-5" version = "0.10.6" @@ -1350,7 +1368,7 @@ dependencies = [ "flate2", "io-enum", "libc", - "lru", + "lru 0.12.5", "mysql_common", "named_pipe", "pem", @@ -1378,6 +1396,34 @@ dependencies = [ "thiserror", ] +[[package]] +name = "mysql_async" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "277ce2f2459b2af4cc6d0a0b7892381f80800832f57c533f03e2845f4ea331ea" +dependencies = [ + "bytes", + "crossbeam-queue", + "flate2", + "futures-core", + "futures-sink", + "futures-util", + "keyed_priority_queue", + "lru 0.14.0", + "mysql_common", + "pem", + "percent-encoding", + "rand 0.9.2", + "serde", + "serde_json", + "socket2 0.5.10", + "thiserror", + "tokio", + "tokio-util", + "twox-hash", + "url", +] + [[package]] name = "mysql_common" version = "0.35.5" @@ -1453,7 +1499,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -1762,8 +1808,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1773,7 +1829,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1785,6 +1851,15 @@ dependencies = [ "getrandom 0.2.16", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + [[package]] name = "redox_syscall" version = "0.5.13" @@ -1892,7 +1967,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "signature", "spki", "subtle", @@ -2110,7 +2185,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -2288,7 +2363,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand", + "rand 0.8.5", "rsa", "serde", "sha1", @@ -2326,7 +2401,7 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", @@ -2471,6 +2546,7 @@ version = "0.0.1" dependencies = [ "futures", "mysql", + "mysql_async", "reqwest", "sqlx", ] diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 711fe2be54b..33e5c83c8bf 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -1,54 +1,106 @@ -use mysql::*; -use mysql::prelude::*; +mod sync_test +{ + use mysql::*; + use mysql::prelude::*; -async fn test_mysql(url: &str) -> Result<(), Box> { - // connect through a MySQL connection pool - let mut pool = Pool::new("")?; // (this test is not runnable) - let mut conn: PooledConn = pool.get_conn()?; - let mut conn2: Conn = pool.get_conn()?.unwrap(); + pub fn test_mysql(url: &str) -> Result<(), Box> { + // connect through a MySQL connection pool + let mut pool = Pool::new("")?; // (this test is not runnable) + let mut conn: PooledConn = pool.get_conn()?; + let mut conn2: Conn = pool.get_conn()?.unwrap(); - // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote10 - let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); - let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; - let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) + // construct queries + let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote10 + let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); + let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; + let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) - // direct execution (safe) - let _ : Vec = conn.query(safe_query.as_str())?; + // direct execution (safe) + let _ : Vec = conn.query(safe_query.as_str())?; - // direct execution (unsafe) - let _ : Vec = conn.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_iter(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + // direct execution (unsafe) + let _ : Vec = conn.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_iter(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - // prepared queries (safe) - let stmt = conn.prep(prepared_query.as_str())?; - let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),))?; - let _ : Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; - let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)])?; - conn.exec_drop(&stmt, (&remote_string.as_str(),)); - let _ : i64 = conn.exec_first(&stmt, (remote_string.as_str(),))?.unwrap(); - let _ : Result = conn.exec_first_opt(&stmt, (remote_string.as_str(),))?.unwrap(); - let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 })?; - let _ = conn.exec_fold_opt(&stmt, (remote_string.as_str(),), 0, |_: i64, _: Result| -> i64 { 0 })?; - let _ = conn.exec_iter(&stmt, (remote_string.as_str(),))?; - let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; - let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; + // prepared queries (safe) + let stmt = conn.prep(prepared_query.as_str())?; + let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),))?; + let _ : Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; + let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)])?; + conn.exec_drop(&stmt, (&remote_string.as_str(),)); + let _ : i64 = conn.exec_first(&stmt, (remote_string.as_str(),))?.unwrap(); + let _ : Result = conn.exec_first_opt(&stmt, (remote_string.as_str(),))?.unwrap(); + let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 })?; + let _ = conn.exec_fold_opt(&stmt, (remote_string.as_str(),), 0, |_: i64, _: Result| -> i64 { 0 })?; + let _ = conn.exec_iter(&stmt, (remote_string.as_str(),))?; + let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; + let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; - Ok(()) + Ok(()) + } +} + +mod async_test +{ + use mysql_async::*; + use mysql_async::prelude::*; + + pub async fn test_mysql_async(url: &str) -> Result<()> { + // connect through a MySQL connection pool + let mut pool = Pool::new(""); // (this test is not runnable) + let mut conn = pool.get_conn().await?; + + // construct queries + let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote11 + let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); + let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; + let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) + + // direct execution (safe) + let _ : Vec = conn.query(safe_query.as_str()).await?; + + // direct execution (unsafe) + let _ : Vec = conn.query(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ : Option = conn.query_first(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_iter(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_stream::(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {}).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + + // prepared queries (safe) + let stmt = conn.prep(prepared_query.as_str()).await?; + let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),)).await?; + let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)]).await?; + conn.exec_drop(&stmt, (&remote_string.as_str(),)); + let _ : Option = conn.exec_first(&stmt, (remote_string.as_str(),)).await?; + let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 }).await?; + let _ = conn.exec_iter(&stmt, (remote_string.as_str(),)).await?; + let _ = conn.exec_stream::(&stmt, (remote_string.as_str(),)).await?; + let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {}).await?; + + Ok(()) + } } fn main() { println!("test_mysql..."); - match futures::executor::block_on(test_mysql("")) { + match (sync_test::test_mysql("")) { + Ok(_) => println!(" successful!"), + Err(e) => println!(" error: {}", e), + } + + println!("test_mysql_async..."); + match futures::executor::block_on(async_test::test_mysql_async("")) { Ok(_) => println!(" successful!"), Err(e) => println!(" error: {}", e), } diff --git a/rust/ql/test/query-tests/security/CWE-089/options.yml b/rust/ql/test/query-tests/security/CWE-089/options.yml index 776696a56a6..1febc233696 100644 --- a/rust/ql/test/query-tests/security/CWE-089/options.yml +++ b/rust/ql/test/query-tests/security/CWE-089/options.yml @@ -4,3 +4,4 @@ qltest_dependencies: - sqlx = { version = "0.8", features = ["mysql", "sqlite", "postgres", "runtime-async-std", "tls-native-tls"] } - futures = { version = "0.3" } - mysql = { version = "26.0.1" } + - mysql_async = { version = "0.36.1" } From f15a34f361aa9f05153d88e33e2f2c13d51c43f1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:38:25 +0100 Subject: [PATCH 46/82] Rust: Add test cases for transactions as well. --- rust/ql/test/query-tests/security/CWE-089/mysql.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 33e5c83c8bf..92377eaa493 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -45,6 +45,11 @@ mod sync_test let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; + // transactions + let mut trans = conn.start_transaction(TxOpts::default())?; + trans.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + trans.commit()?; + Ok(()) } } @@ -88,6 +93,11 @@ mod async_test let _ = conn.exec_stream::(&stmt, (remote_string.as_str(),)).await?; let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {}).await?; + // transactions + let mut trans = conn.start_transaction(TxOpts::default()).await?; + trans.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + trans.commit().await?; + Ok(()) } } From f16742bf743c1f91a7c6c04763f04d9f81a51c7e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 16:45:12 +0100 Subject: [PATCH 47/82] Rust: Add models. --- .../rust/frameworks/mysql-async.model.yml | 13 + .../codeql/rust/frameworks/mysql.model.yml | 17 + .../security/CWE-089/SqlInjection.expected | 615 ++++++++++++++---- .../query-tests/security/CWE-089/mysql.rs | 52 +- 4 files changed, 538 insertions(+), 159 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml create mode 100644 rust/ql/lib/codeql/rust/frameworks/mysql.model.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml new file mode 100644 index 00000000000..fc38ca2baed --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["<_ as mysql_async::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql_async::queryable::Queryable>::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql_async::queryable::Queryable>::query_first", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql_async::queryable::Queryable>::query_stream", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"] + - ["::query_iter", "Argument[0]", "sql-injection", "manual"] + - ["::prep", "Argument[0]", "sql-injection", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml new file mode 100644 index 00000000000..da3ee84a779 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml @@ -0,0 +1,17 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["<_ as mysql::conn::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_opt", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_first", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_first_opt", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_fold_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_iter", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query_map_opt", "Argument[0]", "sql-injection", "manual"] + - ["<_ as mysql::conn::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] + - ["::prep", "Argument[0]", "sql-injection", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 45ce48f2ef3..f58ee2343d0 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,4 +1,26 @@ #select +| mysql.rs:22:33:22:37 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:22:33:22:37 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:22:33:22:37 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:22:33:22:37 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:23:55:23:63 | query_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:23:55:23:63 | query_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:24:14:24:23 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:24:14:24:23 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:25:28:25:38 | query_first | mysql.rs:13:33:13:54 | ...::get | mysql.rs:25:28:25:38 | query_first | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:26:49:26:63 | query_first_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:26:49:26:63 | query_first_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:27:22:27:31 | query_fold | mysql.rs:13:33:13:54 | ...::get | mysql.rs:27:22:27:31 | query_fold | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:28:22:28:35 | query_fold_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:28:22:28:35 | query_fold_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:29:22:29:31 | query_iter | mysql.rs:13:33:13:54 | ...::get | mysql.rs:29:22:29:31 | query_iter | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:30:22:30:30 | query_map | mysql.rs:13:33:13:54 | ...::get | mysql.rs:30:22:30:30 | query_map | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:31:22:31:34 | query_map_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:31:22:31:34 | query_map_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:50:15:50:24 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:50:15:50:24 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:77:33:77:37 | query | mysql.rs:68:33:68:54 | ...::get | mysql.rs:77:33:77:37 | query | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:78:14:78:23 | query_drop | mysql.rs:68:33:68:54 | ...::get | mysql.rs:78:14:78:23 | query_drop | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:79:36:79:46 | query_first | mysql.rs:68:33:68:54 | ...::get | mysql.rs:79:36:79:46 | query_first | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:80:22:80:31 | query_fold | mysql.rs:68:33:68:54 | ...::get | mysql.rs:80:22:80:31 | query_fold | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:81:22:81:31 | query_iter | mysql.rs:68:33:68:54 | ...::get | mysql.rs:81:22:81:31 | query_iter | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:82:22:82:33 | query_stream | mysql.rs:68:33:68:54 | ...::get | mysql.rs:82:22:82:33 | query_stream | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:83:22:83:30 | query_map | mysql.rs:68:33:68:54 | ...::get | mysql.rs:83:22:83:30 | query_map | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:98:15:98:24 | query_drop | mysql.rs:68:33:68:54 | ...::get | mysql.rs:98:15:98:24 | query_drop | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | | sqlx.rs:77:13:77:23 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:13:77:23 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | | sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | @@ -12,180 +34,507 @@ | sqlx.rs:153:17:153:27 | ...::query | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:153:17:153:27 | ...::query | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | | sqlx.rs:188:17:188:27 | ...::query | sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:188:17:188:27 | ...::query | This query depends on a $@. | sqlx.rs:173:25:173:46 | ...::get | user-provided value | edges +| mysql.rs:13:13:13:29 | mut remote_string | mysql.rs:15:86:15:98 | remote_string | provenance | | +| mysql.rs:13:33:13:54 | ...::get | mysql.rs:13:33:13:77 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | mysql.rs:13:33:13:86 | ... .unwrap() | provenance | MaD:28 | +| mysql.rs:13:33:13:86 | ... .unwrap() | mysql.rs:13:33:13:93 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:13:33:13:93 | ... .text() [Ok] | mysql.rs:13:33:13:121 | ... .unwrap_or(...) | provenance | MaD:29 | +| mysql.rs:13:33:13:121 | ... .unwrap_or(...) | mysql.rs:13:13:13:29 | mut remote_string | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:50 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:76 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:36 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:51 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:76 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:44 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:48 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:44 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:43 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:47 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:51 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:37 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | +| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:28:15:104 | ... + ... | provenance | MaD:25 | +| mysql.rs:15:28:15:104 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | +| mysql.rs:15:85:15:98 | &remote_string [&ref] | mysql.rs:15:28:15:98 | ... + ... | provenance | MaD:24 | +| mysql.rs:15:86:15:98 | remote_string | mysql.rs:15:85:15:98 | &remote_string [&ref] | provenance | | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:23:65:23:85 | unsafe_query.as_str() | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | +| mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:24:25:24:45 | unsafe_query.as_str() | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:25:40:25:60 | unsafe_query.as_str() | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | +| mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:26:65:26:85 | unsafe_query.as_str() | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | +| mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:27:33:27:53 | unsafe_query.as_str() | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | +| mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:28:37:28:57 | unsafe_query.as_str() | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | +| mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:30:32:30:52 | unsafe_query.as_str() | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | +| mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:31:36:31:56 | unsafe_query.as_str() | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | +| mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:50:26:50:46 | unsafe_query.as_str() | mysql.rs:50:15:50:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | mysql.rs:50:15:50:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:68:13:68:29 | mut remote_string | mysql.rs:70:86:70:98 | remote_string | provenance | | +| mysql.rs:68:33:68:54 | ...::get | mysql.rs:68:33:68:77 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| mysql.rs:68:33:68:77 | ...::get(...) [Ok] | mysql.rs:68:33:68:86 | ... .unwrap() | provenance | MaD:28 | +| mysql.rs:68:33:68:86 | ... .unwrap() | mysql.rs:68:33:68:93 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:68:33:68:93 | ... .text() [Ok] | mysql.rs:68:33:68:121 | ... .unwrap_or(...) | provenance | MaD:29 | +| mysql.rs:68:33:68:121 | ... .unwrap_or(...) | mysql.rs:68:13:68:29 | mut remote_string | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:50 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:36 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:59 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:44 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:44 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:59 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:43 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:37 | unsafe_query | provenance | | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:26 | +| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:70:28:70:98 | ... + ... | mysql.rs:70:13:70:24 | unsafe_query | provenance | | +| mysql.rs:70:28:70:98 | ... + ... | mysql.rs:70:28:70:104 | ... + ... | provenance | MaD:25 | +| mysql.rs:70:28:70:104 | ... + ... | mysql.rs:70:13:70:24 | unsafe_query | provenance | | +| mysql.rs:70:85:70:98 | &remote_string [&ref] | mysql.rs:70:28:70:98 | ... + ... | provenance | MaD:24 | +| mysql.rs:70:86:70:98 | remote_string | mysql.rs:70:85:70:98 | &remote_string [&ref] | provenance | | +| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:77:39:77:59 | unsafe_query.as_str() | mysql.rs:77:33:77:37 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | mysql.rs:77:33:77:37 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:78:25:78:45 | unsafe_query.as_str() | mysql.rs:78:14:78:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | mysql.rs:78:14:78:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:79:48:79:68 | unsafe_query.as_str() | mysql.rs:79:36:79:46 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | mysql.rs:79:36:79:46 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:80:33:80:53 | unsafe_query.as_str() | mysql.rs:80:22:80:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | mysql.rs:80:22:80:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:81:33:81:53 | unsafe_query.as_str() | mysql.rs:81:22:81:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | mysql.rs:81:22:81:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:82:48:82:68 | unsafe_query.as_str() | mysql.rs:82:22:82:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | mysql.rs:82:22:82:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:83:32:83:52 | unsafe_query.as_str() | mysql.rs:83:22:83:30 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | mysql.rs:83:22:83:30 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | +| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:98:26:98:46 | unsafe_query.as_str() | mysql.rs:98:15:98:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | mysql.rs:98:15:98:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | -| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:5 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:6 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:10 | +| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:22 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:23 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:27 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:14 | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:14 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:31 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:31 | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | -| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:4 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:11 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:15 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:12 | +| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:28 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:49:9:49:21 | remote_number | sqlx.rs:52:32:52:87 | MacroExpr | provenance | | -| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:12 | +| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | sqlx.rs:49:9:49:21 | remote_number | provenance | | | sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:36 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:13 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:9 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:13 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:30 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:26 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:30 | | sqlx.rs:52:32:52:87 | ...::format(...) | sqlx.rs:52:32:52:87 | { ... } | provenance | | | sqlx.rs:52:32:52:87 | ...::must_use(...) | sqlx.rs:52:9:52:20 | safe_query_3 | provenance | | -| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:16 | -| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:17 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | +| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:33 | +| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:34 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:13 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:30 | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | | sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:42 | unsafe_query_3 | provenance | | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:13 | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:9 | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:13 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:30 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:26 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:30 | | sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | -| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:8 | +| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:25 | | sqlx.rs:55:26:55:102 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | -| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:7 | +| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:24 | | sqlx.rs:55:84:55:96 | remote_string | sqlx.rs:55:83:55:96 | &remote_string [&ref] | provenance | | | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:13 | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:9 | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:13 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:30 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:26 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:30 | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:16 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:17 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | -| sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:4 | -| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:11 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:15 | -| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:12 | +| sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:28 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | -| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:8 | +| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:25 | | sqlx.rs:102:26:102:102 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | -| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:7 | +| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:24 | | sqlx.rs:102:84:102:96 | remote_string | sqlx.rs:102:83:102:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:3 Sink:MaD:3 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:3 Sink:MaD:3 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:2 Sink:MaD:2 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:2 Sink:MaD:2 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:2 Sink:MaD:2 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:2 Sink:MaD:2 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | -| sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:4 | -| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:11 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:15 | -| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:12 | +| sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | +| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:28 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:13 | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:9 | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:13 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:26 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:30 | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | -| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:8 | +| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:25 | | sqlx.rs:175:26:175:102 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | -| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:7 | +| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:24 | | sqlx.rs:175:84:175:96 | remote_string | sqlx.rs:175:83:175:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:13 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | models -| 1 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | -| 2 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | -| 3 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | -| 4 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 5 | Source: std::env::args; ReturnValue.Element; commandargs | -| 6 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 7 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 8 | Summary: ::add; Argument[self]; ReturnValue; value | -| 9 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 14 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 15 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 16 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 17 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 1 | Sink: <_ as mysql::conn::queryable::Queryable>::query; Argument[0]; sql-injection | +| 2 | Sink: <_ as mysql::conn::queryable::Queryable>::query_drop; Argument[0]; sql-injection | +| 3 | Sink: <_ as mysql::conn::queryable::Queryable>::query_first; Argument[0]; sql-injection | +| 4 | Sink: <_ as mysql::conn::queryable::Queryable>::query_first_opt; Argument[0]; sql-injection | +| 5 | Sink: <_ as mysql::conn::queryable::Queryable>::query_fold; Argument[0]; sql-injection | +| 6 | Sink: <_ as mysql::conn::queryable::Queryable>::query_fold_opt; Argument[0]; sql-injection | +| 7 | Sink: <_ as mysql::conn::queryable::Queryable>::query_map; Argument[0]; sql-injection | +| 8 | Sink: <_ as mysql::conn::queryable::Queryable>::query_map_opt; Argument[0]; sql-injection | +| 9 | Sink: <_ as mysql::conn::queryable::Queryable>::query_opt; Argument[0]; sql-injection | +| 10 | Sink: <_ as mysql_async::queryable::Queryable>::query; Argument[0]; sql-injection | +| 11 | Sink: <_ as mysql_async::queryable::Queryable>::query_drop; Argument[0]; sql-injection | +| 12 | Sink: <_ as mysql_async::queryable::Queryable>::query_first; Argument[0]; sql-injection | +| 13 | Sink: <_ as mysql_async::queryable::Queryable>::query_fold; Argument[0]; sql-injection | +| 14 | Sink: <_ as mysql_async::queryable::Queryable>::query_map; Argument[0]; sql-injection | +| 15 | Sink: <_ as mysql_async::queryable::Queryable>::query_stream; Argument[0]; sql-injection | +| 16 | Sink: ::query_iter; Argument[0]; sql-injection | +| 17 | Sink: ::query_iter; Argument[0]; sql-injection | +| 18 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | +| 19 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | +| 20 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | +| 21 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 22 | Source: std::env::args; ReturnValue.Element; commandargs | +| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 24 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 25 | Summary: ::add; Argument[self]; ReturnValue; value | +| 26 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 27 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 28 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 29 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 30 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 31 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes +| mysql.rs:13:13:13:29 | mut remote_string | semmle.label | mut remote_string | +| mysql.rs:13:33:13:54 | ...::get | semmle.label | ...::get | +| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| mysql.rs:13:33:13:86 | ... .unwrap() | semmle.label | ... .unwrap() | +| mysql.rs:13:33:13:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| mysql.rs:13:33:13:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| mysql.rs:15:13:15:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:15:28:15:98 | ... + ... | semmle.label | ... + ... | +| mysql.rs:15:28:15:104 | ... + ... | semmle.label | ... + ... | +| mysql.rs:15:85:15:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| mysql.rs:15:86:15:98 | remote_string | semmle.label | remote_string | +| mysql.rs:22:33:22:37 | query | semmle.label | query | +| mysql.rs:22:33:22:37 | query | semmle.label | query | +| mysql.rs:22:39:22:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:23:55:23:63 | query_opt | semmle.label | query_opt | +| mysql.rs:23:65:23:76 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:23:65:23:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:24:14:24:23 | query_drop | semmle.label | query_drop | +| mysql.rs:24:25:24:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:24:25:24:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:25:28:25:38 | query_first | semmle.label | query_first | +| mysql.rs:25:40:25:51 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:25:40:25:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:26:49:26:63 | query_first_opt | semmle.label | query_first_opt | +| mysql.rs:26:65:26:76 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:26:65:26:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:27:22:27:31 | query_fold | semmle.label | query_fold | +| mysql.rs:27:33:27:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:27:33:27:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:28:22:28:35 | query_fold_opt | semmle.label | query_fold_opt | +| mysql.rs:28:37:28:48 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:28:37:28:57 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:29:22:29:31 | query_iter | semmle.label | query_iter | +| mysql.rs:29:33:29:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:30:22:30:30 | query_map | semmle.label | query_map | +| mysql.rs:30:32:30:43 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:30:32:30:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:31:22:31:34 | query_map_opt | semmle.label | query_map_opt | +| mysql.rs:31:36:31:47 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:31:36:31:56 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:32:34:32:38 | query | semmle.label | query | +| mysql.rs:32:34:32:38 | query | semmle.label | query | +| mysql.rs:32:40:32:51 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:50:15:50:24 | query_drop | semmle.label | query_drop | +| mysql.rs:50:26:50:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:50:26:50:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:68:13:68:29 | mut remote_string | semmle.label | mut remote_string | +| mysql.rs:68:33:68:54 | ...::get | semmle.label | ...::get | +| mysql.rs:68:33:68:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| mysql.rs:68:33:68:86 | ... .unwrap() | semmle.label | ... .unwrap() | +| mysql.rs:68:33:68:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| mysql.rs:68:33:68:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| mysql.rs:70:13:70:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:70:28:70:98 | ... + ... | semmle.label | ... + ... | +| mysql.rs:70:28:70:104 | ... + ... | semmle.label | ... + ... | +| mysql.rs:70:85:70:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| mysql.rs:70:86:70:98 | remote_string | semmle.label | remote_string | +| mysql.rs:77:33:77:37 | query | semmle.label | query | +| mysql.rs:77:39:77:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:77:39:77:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:78:14:78:23 | query_drop | semmle.label | query_drop | +| mysql.rs:78:25:78:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:78:25:78:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:79:36:79:46 | query_first | semmle.label | query_first | +| mysql.rs:79:48:79:59 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:79:48:79:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:80:22:80:31 | query_fold | semmle.label | query_fold | +| mysql.rs:80:33:80:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:80:33:80:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:81:22:81:31 | query_iter | semmle.label | query_iter | +| mysql.rs:81:33:81:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:81:33:81:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:82:22:82:33 | query_stream | semmle.label | query_stream | +| mysql.rs:82:48:82:59 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:82:48:82:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:83:22:83:30 | query_map | semmle.label | query_map | +| mysql.rs:83:32:83:43 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:83:32:83:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:98:15:98:24 | query_drop | semmle.label | query_drop | +| mysql.rs:98:26:98:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:98:26:98:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | | sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 92377eaa493..30f5d8b022d 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -10,29 +10,29 @@ mod sync_test let mut conn2: Conn = pool.get_conn()?.unwrap(); // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote10 + let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ Source=remote10 let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution (safe) - let _ : Vec = conn.query(safe_query.as_str())?; + let _ : Vec = conn.query(safe_query.as_str())?; // $ sql-sink // direct execution (unsafe) - let _ : Vec = conn.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_iter(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec = conn.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + conn.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_iter(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 // prepared queries (safe) - let stmt = conn.prep(prepared_query.as_str())?; + let stmt = conn.prep(prepared_query.as_str())?; // $ sql-sink let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),))?; let _ : Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)])?; @@ -47,7 +47,7 @@ mod sync_test // transactions let mut trans = conn.start_transaction(TxOpts::default())?; - trans.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + trans.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote10 trans.commit()?; Ok(()) @@ -65,25 +65,25 @@ mod async_test let mut conn = pool.get_conn().await?; // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ MISSING: Source=remote11 + let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ Source=remote11 let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution (safe) - let _ : Vec = conn.query(safe_query.as_str()).await?; + let _ : Vec = conn.query(safe_query.as_str()).await?; // $ sql-sink // direct execution (unsafe) - let _ : Vec = conn.query(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - conn.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - let _ : Option = conn.query_first(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_iter(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_stream::(unsafe_query.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {}).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + let _ : Vec = conn.query(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + conn.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ : Option = conn.query_first(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_iter(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_stream::(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {}).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 // prepared queries (safe) - let stmt = conn.prep(prepared_query.as_str()).await?; + let stmt = conn.prep(prepared_query.as_str()).await?; // $ sql-sink let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),)).await?; let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)]).await?; conn.exec_drop(&stmt, (&remote_string.as_str(),)); @@ -95,7 +95,7 @@ mod async_test // transactions let mut trans = conn.start_transaction(TxOpts::default()).await?; - trans.query_drop(unsafe_query.as_str()); // $ MISSING: sql-sink Alert[rust/sql-injection]=remote11 + trans.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote11 trans.commit().await?; Ok(()) From 859c1ef55d22c366537bfae4b113c326fda23bc3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:11:20 +0100 Subject: [PATCH 48/82] Rust: Change note. --- rust/ql/lib/change-notes/2025-10-10-mysql.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2025-10-10-mysql.md diff --git a/rust/ql/lib/change-notes/2025-10-10-mysql.md b/rust/ql/lib/change-notes/2025-10-10-mysql.md new file mode 100644 index 00000000000..037f813a856 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-10-10-mysql.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added models for the `mysql` and `mysql_async` libraries. From c102ce41b740ab867b037125be459738b5629581 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:12:48 +0100 Subject: [PATCH 49/82] Rust: Claim support for the two libraries. --- docs/codeql/reusables/supported-frameworks.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/codeql/reusables/supported-frameworks.rst b/docs/codeql/reusables/supported-frameworks.rst index e9981014ef5..472e463cf79 100644 --- a/docs/codeql/reusables/supported-frameworks.rst +++ b/docs/codeql/reusables/supported-frameworks.rst @@ -336,6 +336,8 @@ and the CodeQL library pack ``codeql/rust-all`` (`changelog `__, Logging library `md5 `__, Utility library `memchr `__, Utility library + `mysql `__, Database + `mysql_async `__, Database `once_cell `__, Utility library `poem `__, Web framework `postgres `__, Database From 106bad2764a8478dfd30f46e08bac3c5b5cdc771 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:17:08 +0100 Subject: [PATCH 50/82] Rust: Add test cases for bad use of prepared statements as well. --- .../security/CWE-089/SqlInjection.expected | 744 +++++++++--------- .../query-tests/security/CWE-089/mysql.rs | 8 + 2 files changed, 395 insertions(+), 357 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index f58ee2343d0..cf5529c7a99 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -12,15 +12,17 @@ | mysql.rs:31:22:31:34 | query_map_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:31:22:31:34 | query_map_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:50:15:50:24 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:50:15:50:24 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:77:33:77:37 | query | mysql.rs:68:33:68:54 | ...::get | mysql.rs:77:33:77:37 | query | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:78:14:78:23 | query_drop | mysql.rs:68:33:68:54 | ...::get | mysql.rs:78:14:78:23 | query_drop | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:79:36:79:46 | query_first | mysql.rs:68:33:68:54 | ...::get | mysql.rs:79:36:79:46 | query_first | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:80:22:80:31 | query_fold | mysql.rs:68:33:68:54 | ...::get | mysql.rs:80:22:80:31 | query_fold | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:81:22:81:31 | query_iter | mysql.rs:68:33:68:54 | ...::get | mysql.rs:81:22:81:31 | query_iter | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:82:22:82:33 | query_stream | mysql.rs:68:33:68:54 | ...::get | mysql.rs:82:22:82:33 | query_stream | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:83:22:83:30 | query_map | mysql.rs:68:33:68:54 | ...::get | mysql.rs:83:22:83:30 | query_map | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | -| mysql.rs:98:15:98:24 | query_drop | mysql.rs:68:33:68:54 | ...::get | mysql.rs:98:15:98:24 | query_drop | This query depends on a $@. | mysql.rs:68:33:68:54 | ...::get | user-provided value | +| mysql.rs:49:26:49:29 | prep | mysql.rs:13:33:13:54 | ...::get | mysql.rs:49:26:49:29 | prep | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:54:15:54:24 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:54:15:54:24 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | +| mysql.rs:81:33:81:37 | query | mysql.rs:72:33:72:54 | ...::get | mysql.rs:81:33:81:37 | query | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:82:14:82:23 | query_drop | mysql.rs:72:33:72:54 | ...::get | mysql.rs:82:14:82:23 | query_drop | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:83:36:83:46 | query_first | mysql.rs:72:33:72:54 | ...::get | mysql.rs:83:36:83:46 | query_first | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:84:22:84:31 | query_fold | mysql.rs:72:33:72:54 | ...::get | mysql.rs:84:22:84:31 | query_fold | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:85:22:85:31 | query_iter | mysql.rs:72:33:72:54 | ...::get | mysql.rs:85:22:85:31 | query_iter | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:86:22:86:33 | query_stream | mysql.rs:72:33:72:54 | ...::get | mysql.rs:86:22:86:33 | query_stream | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:87:22:87:30 | query_map | mysql.rs:72:33:72:54 | ...::get | mysql.rs:87:22:87:30 | query_map | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:101:26:101:29 | prep | mysql.rs:72:33:72:54 | ...::get | mysql.rs:101:26:101:29 | prep | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:106:15:106:24 | query_drop | mysql.rs:72:33:72:54 | ...::get | mysql.rs:106:15:106:24 | query_drop | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | | sqlx.rs:77:13:77:23 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:13:77:23 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | | sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | @@ -35,366 +37,384 @@ | sqlx.rs:188:17:188:27 | ...::query | sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:188:17:188:27 | ...::query | This query depends on a $@. | sqlx.rs:173:25:173:46 | ...::get | user-provided value | edges | mysql.rs:13:13:13:29 | mut remote_string | mysql.rs:15:86:15:98 | remote_string | provenance | | -| mysql.rs:13:33:13:54 | ...::get | mysql.rs:13:33:13:77 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | mysql.rs:13:33:13:86 | ... .unwrap() | provenance | MaD:28 | -| mysql.rs:13:33:13:86 | ... .unwrap() | mysql.rs:13:33:13:93 | ... .text() [Ok] | provenance | MaD:32 | -| mysql.rs:13:33:13:93 | ... .text() [Ok] | mysql.rs:13:33:13:121 | ... .unwrap_or(...) | provenance | MaD:29 | +| mysql.rs:13:33:13:54 | ...::get | mysql.rs:13:33:13:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | mysql.rs:13:33:13:86 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:13:33:13:86 | ... .unwrap() | mysql.rs:13:33:13:93 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:13:33:13:93 | ... .text() [Ok] | mysql.rs:13:33:13:121 | ... .unwrap_or(...) | provenance | MaD:31 | | mysql.rs:13:33:13:121 | ... .unwrap_or(...) | mysql.rs:13:13:13:29 | mut remote_string | provenance | | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:50 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:76 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:36 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:51 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:76 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:44 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:48 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:44 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:43 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:47 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:51 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:37 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() | provenance | MaD:30 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:42 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:37 | unsafe_query | provenance | | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:32 | | mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | -| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:28:15:104 | ... + ... | provenance | MaD:25 | +| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:28:15:104 | ... + ... | provenance | MaD:27 | | mysql.rs:15:28:15:104 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | -| mysql.rs:15:85:15:98 | &remote_string [&ref] | mysql.rs:15:28:15:98 | ... + ... | provenance | MaD:24 | +| mysql.rs:15:85:15:98 | &remote_string [&ref] | mysql.rs:15:28:15:98 | ... + ... | provenance | MaD:26 | | mysql.rs:15:86:15:98 | remote_string | mysql.rs:15:85:15:98 | &remote_string [&ref] | provenance | | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:23:65:23:85 | unsafe_query.as_str() | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:24:25:24:45 | unsafe_query.as_str() | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:25:40:25:60 | unsafe_query.as_str() | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:26:65:26:85 | unsafe_query.as_str() | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:27:33:27:53 | unsafe_query.as_str() | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:28:37:28:57 | unsafe_query.as_str() | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:16 Sink:MaD:16 | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:16 Sink:MaD:16 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:30:32:30:52 | unsafe_query.as_str() | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:31:36:31:56 | unsafe_query.as_str() | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:50:26:50:37 | unsafe_query | mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:50:26:50:46 | unsafe_query.as_str() | mysql.rs:50:15:50:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | mysql.rs:50:15:50:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:68:13:68:29 | mut remote_string | mysql.rs:70:86:70:98 | remote_string | provenance | | -| mysql.rs:68:33:68:54 | ...::get | mysql.rs:68:33:68:77 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| mysql.rs:68:33:68:77 | ...::get(...) [Ok] | mysql.rs:68:33:68:86 | ... .unwrap() | provenance | MaD:28 | -| mysql.rs:68:33:68:86 | ... .unwrap() | mysql.rs:68:33:68:93 | ... .text() [Ok] | provenance | MaD:32 | -| mysql.rs:68:33:68:93 | ... .text() [Ok] | mysql.rs:68:33:68:121 | ... .unwrap_or(...) | provenance | MaD:29 | -| mysql.rs:68:33:68:121 | ... .unwrap_or(...) | mysql.rs:68:13:68:29 | mut remote_string | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:50 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:36 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:59 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:44 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:44 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:59 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:43 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:37 | unsafe_query | provenance | | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:26 | -| mysql.rs:70:13:70:24 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() | provenance | MaD:30 | -| mysql.rs:70:28:70:98 | ... + ... | mysql.rs:70:13:70:24 | unsafe_query | provenance | | -| mysql.rs:70:28:70:98 | ... + ... | mysql.rs:70:28:70:104 | ... + ... | provenance | MaD:25 | -| mysql.rs:70:28:70:104 | ... + ... | mysql.rs:70:13:70:24 | unsafe_query | provenance | | -| mysql.rs:70:85:70:98 | &remote_string [&ref] | mysql.rs:70:28:70:98 | ... + ... | provenance | MaD:24 | -| mysql.rs:70:86:70:98 | remote_string | mysql.rs:70:85:70:98 | &remote_string [&ref] | provenance | | -| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:77:39:77:50 | unsafe_query | mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:77:39:77:59 | unsafe_query.as_str() | mysql.rs:77:33:77:37 | query | provenance | MaD:10 Sink:MaD:10 | -| mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | mysql.rs:77:33:77:37 | query | provenance | MaD:10 Sink:MaD:10 | -| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:78:25:78:36 | unsafe_query | mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:78:25:78:45 | unsafe_query.as_str() | mysql.rs:78:14:78:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | mysql.rs:78:14:78:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:79:48:79:59 | unsafe_query | mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:79:48:79:68 | unsafe_query.as_str() | mysql.rs:79:36:79:46 | query_first | provenance | MaD:12 Sink:MaD:12 | -| mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | mysql.rs:79:36:79:46 | query_first | provenance | MaD:12 Sink:MaD:12 | -| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:80:33:80:44 | unsafe_query | mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:80:33:80:53 | unsafe_query.as_str() | mysql.rs:80:22:80:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | -| mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | mysql.rs:80:22:80:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | -| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:81:33:81:44 | unsafe_query | mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:81:33:81:53 | unsafe_query.as_str() | mysql.rs:81:22:81:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | -| mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | mysql.rs:81:22:81:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | -| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:82:48:82:59 | unsafe_query | mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:82:48:82:68 | unsafe_query.as_str() | mysql.rs:82:22:82:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | -| mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | mysql.rs:82:22:82:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | -| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:83:32:83:43 | unsafe_query | mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:83:32:83:52 | unsafe_query.as_str() | mysql.rs:83:22:83:30 | query_map | provenance | MaD:14 Sink:MaD:14 | -| mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | mysql.rs:83:22:83:30 | query_map | provenance | MaD:14 Sink:MaD:14 | -| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:26 | -| mysql.rs:98:26:98:37 | unsafe_query | mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | provenance | MaD:30 | -| mysql.rs:98:26:98:46 | unsafe_query.as_str() | mysql.rs:98:15:98:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | mysql.rs:98:15:98:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:49:31:49:51 | unsafe_query.as_str() | mysql.rs:49:26:49:29 | prep | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | mysql.rs:49:26:49:29 | prep | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:54:26:54:46 | unsafe_query.as_str() | mysql.rs:54:15:54:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | mysql.rs:54:15:54:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:72:13:72:29 | mut remote_string | mysql.rs:74:86:74:98 | remote_string | provenance | | +| mysql.rs:72:33:72:54 | ...::get | mysql.rs:72:33:72:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:72:33:72:77 | ...::get(...) [Ok] | mysql.rs:72:33:72:86 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:72:33:72:86 | ... .unwrap() | mysql.rs:72:33:72:93 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:72:33:72:93 | ... .text() [Ok] | mysql.rs:72:33:72:121 | ... .unwrap_or(...) | provenance | MaD:31 | +| mysql.rs:72:33:72:121 | ... .unwrap_or(...) | mysql.rs:72:13:72:29 | mut remote_string | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:50 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:36 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:59 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:44 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:44 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:59 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:43 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:42 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:37 | unsafe_query | provenance | | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:74:28:74:98 | ... + ... | mysql.rs:74:13:74:24 | unsafe_query | provenance | | +| mysql.rs:74:28:74:98 | ... + ... | mysql.rs:74:28:74:104 | ... + ... | provenance | MaD:27 | +| mysql.rs:74:28:74:104 | ... + ... | mysql.rs:74:13:74:24 | unsafe_query | provenance | | +| mysql.rs:74:85:74:98 | &remote_string [&ref] | mysql.rs:74:28:74:98 | ... + ... | provenance | MaD:26 | +| mysql.rs:74:86:74:98 | remote_string | mysql.rs:74:85:74:98 | &remote_string [&ref] | provenance | | +| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:81:39:81:59 | unsafe_query.as_str() | mysql.rs:81:33:81:37 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | mysql.rs:81:33:81:37 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:82:25:82:45 | unsafe_query.as_str() | mysql.rs:82:14:82:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | mysql.rs:82:14:82:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:83:48:83:68 | unsafe_query.as_str() | mysql.rs:83:36:83:46 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | mysql.rs:83:36:83:46 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:84:33:84:53 | unsafe_query.as_str() | mysql.rs:84:22:84:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | mysql.rs:84:22:84:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:85:33:85:53 | unsafe_query.as_str() | mysql.rs:85:22:85:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | +| mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | mysql.rs:85:22:85:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | +| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:86:48:86:68 | unsafe_query.as_str() | mysql.rs:86:22:86:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | mysql.rs:86:22:86:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:87:32:87:52 | unsafe_query.as_str() | mysql.rs:87:22:87:30 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | mysql.rs:87:22:87:30 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:101:31:101:51 | unsafe_query.as_str() | mysql.rs:101:26:101:29 | prep | provenance | MaD:18 Sink:MaD:18 | +| mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | mysql.rs:101:26:101:29 | prep | provenance | MaD:18 Sink:MaD:18 | +| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:106:26:106:46 | unsafe_query.as_str() | mysql.rs:106:15:106:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | mysql.rs:106:15:106:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | -| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:22 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:23 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:27 | +| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:25 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:31 | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:31 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:33 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:33 | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | -| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:28 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:29 | +| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:49:9:49:21 | remote_number | sqlx.rs:52:32:52:87 | MacroExpr | provenance | | -| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:29 | +| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | sqlx.rs:49:9:49:21 | remote_number | provenance | | | sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:36 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:30 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:26 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:30 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:32 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:28 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:32 | | sqlx.rs:52:32:52:87 | ...::format(...) | sqlx.rs:52:32:52:87 | { ... } | provenance | | | sqlx.rs:52:32:52:87 | ...::must_use(...) | sqlx.rs:52:9:52:20 | safe_query_3 | provenance | | -| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:33 | -| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:34 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:35 | +| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:36 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:30 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:32 | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | | sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:42 | unsafe_query_3 | provenance | | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:30 | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:26 | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:30 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:32 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:28 | +| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:32 | | sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | -| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:25 | +| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:55:26:55:102 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | -| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:24 | +| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:55:84:55:96 | remote_string | sqlx.rs:55:83:55:96 | &remote_string [&ref] | provenance | | | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:30 | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:26 | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:30 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:32 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:28 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:32 | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:35 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:36 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | -| sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:28 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:29 | +| sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | -| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:25 | +| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:102:26:102:102 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | -| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:24 | +| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:102:84:102:96 | remote_string | sqlx.rs:102:83:102:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:20 Sink:MaD:20 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:20 Sink:MaD:20 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:19 Sink:MaD:19 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:22 Sink:MaD:22 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:22 Sink:MaD:22 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | -| sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:28 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:29 | +| sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:30 | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:26 | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:30 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:32 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:28 | +| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:32 | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | -| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:25 | +| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:175:26:175:102 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | -| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:24 | +| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:175:84:175:96 | remote_string | sqlx.rs:175:83:175:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:26 | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:30 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:18 Sink:MaD:18 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:32 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | models | 1 | Sink: <_ as mysql::conn::queryable::Queryable>::query; Argument[0]; sql-injection | | 2 | Sink: <_ as mysql::conn::queryable::Queryable>::query_drop; Argument[0]; sql-injection | @@ -411,25 +431,27 @@ models | 13 | Sink: <_ as mysql_async::queryable::Queryable>::query_fold; Argument[0]; sql-injection | | 14 | Sink: <_ as mysql_async::queryable::Queryable>::query_map; Argument[0]; sql-injection | | 15 | Sink: <_ as mysql_async::queryable::Queryable>::query_stream; Argument[0]; sql-injection | -| 16 | Sink: ::query_iter; Argument[0]; sql-injection | -| 17 | Sink: ::query_iter; Argument[0]; sql-injection | -| 18 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | -| 19 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | -| 20 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | -| 21 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 22 | Source: std::env::args; ReturnValue.Element; commandargs | -| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 25 | Summary: ::add; Argument[self]; ReturnValue; value | -| 26 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 27 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 28 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 29 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 30 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 31 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 16 | Sink: ::prep; Argument[0]; sql-injection | +| 17 | Sink: ::query_iter; Argument[0]; sql-injection | +| 18 | Sink: ::prep; Argument[0]; sql-injection | +| 19 | Sink: ::query_iter; Argument[0]; sql-injection | +| 20 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | +| 21 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | +| 22 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | +| 23 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 24 | Source: std::env::args; ReturnValue.Element; commandargs | +| 25 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 26 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 27 | Summary: ::add; Argument[self]; ReturnValue; value | +| 28 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 29 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 30 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 31 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 32 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 33 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 36 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | mysql.rs:13:13:13:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:13:33:13:54 | ...::get | semmle.label | ...::get | @@ -488,53 +510,61 @@ nodes | mysql.rs:32:40:32:51 | unsafe_query | semmle.label | unsafe_query | | mysql.rs:32:40:32:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:50:15:50:24 | query_drop | semmle.label | query_drop | -| mysql.rs:50:26:50:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:50:26:50:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:50:26:50:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:68:13:68:29 | mut remote_string | semmle.label | mut remote_string | -| mysql.rs:68:33:68:54 | ...::get | semmle.label | ...::get | -| mysql.rs:68:33:68:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | -| mysql.rs:68:33:68:86 | ... .unwrap() | semmle.label | ... .unwrap() | -| mysql.rs:68:33:68:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | -| mysql.rs:68:33:68:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| mysql.rs:70:13:70:24 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:70:28:70:98 | ... + ... | semmle.label | ... + ... | -| mysql.rs:70:28:70:104 | ... + ... | semmle.label | ... + ... | -| mysql.rs:70:85:70:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | -| mysql.rs:70:86:70:98 | remote_string | semmle.label | remote_string | -| mysql.rs:77:33:77:37 | query | semmle.label | query | -| mysql.rs:77:39:77:50 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:77:39:77:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:77:39:77:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:78:14:78:23 | query_drop | semmle.label | query_drop | -| mysql.rs:78:25:78:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:78:25:78:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:78:25:78:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:79:36:79:46 | query_first | semmle.label | query_first | -| mysql.rs:79:48:79:59 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:79:48:79:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:79:48:79:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:80:22:80:31 | query_fold | semmle.label | query_fold | -| mysql.rs:80:33:80:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:80:33:80:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:80:33:80:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:81:22:81:31 | query_iter | semmle.label | query_iter | -| mysql.rs:81:33:81:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:81:33:81:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:81:33:81:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:82:22:82:33 | query_stream | semmle.label | query_stream | -| mysql.rs:82:48:82:59 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:82:48:82:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:82:48:82:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:83:22:83:30 | query_map | semmle.label | query_map | -| mysql.rs:83:32:83:43 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:83:32:83:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:83:32:83:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:98:15:98:24 | query_drop | semmle.label | query_drop | -| mysql.rs:98:26:98:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:98:26:98:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:98:26:98:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:49:26:49:29 | prep | semmle.label | prep | +| mysql.rs:49:31:49:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:49:31:49:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:54:15:54:24 | query_drop | semmle.label | query_drop | +| mysql.rs:54:26:54:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:54:26:54:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:72:13:72:29 | mut remote_string | semmle.label | mut remote_string | +| mysql.rs:72:33:72:54 | ...::get | semmle.label | ...::get | +| mysql.rs:72:33:72:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| mysql.rs:72:33:72:86 | ... .unwrap() | semmle.label | ... .unwrap() | +| mysql.rs:72:33:72:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| mysql.rs:72:33:72:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| mysql.rs:74:13:74:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:74:28:74:98 | ... + ... | semmle.label | ... + ... | +| mysql.rs:74:28:74:104 | ... + ... | semmle.label | ... + ... | +| mysql.rs:74:85:74:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| mysql.rs:74:86:74:98 | remote_string | semmle.label | remote_string | +| mysql.rs:81:33:81:37 | query | semmle.label | query | +| mysql.rs:81:39:81:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:81:39:81:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:82:14:82:23 | query_drop | semmle.label | query_drop | +| mysql.rs:82:25:82:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:82:25:82:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:83:36:83:46 | query_first | semmle.label | query_first | +| mysql.rs:83:48:83:59 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:83:48:83:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:84:22:84:31 | query_fold | semmle.label | query_fold | +| mysql.rs:84:33:84:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:84:33:84:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:85:22:85:31 | query_iter | semmle.label | query_iter | +| mysql.rs:85:33:85:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:85:33:85:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:86:22:86:33 | query_stream | semmle.label | query_stream | +| mysql.rs:86:48:86:59 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:86:48:86:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:87:22:87:30 | query_map | semmle.label | query_map | +| mysql.rs:87:32:87:43 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:87:32:87:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:101:26:101:29 | prep | semmle.label | prep | +| mysql.rs:101:31:101:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:101:31:101:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:106:15:106:24 | query_drop | semmle.label | query_drop | +| mysql.rs:106:26:106:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:106:26:106:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | | sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 30f5d8b022d..142dfc3aa9f 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -45,6 +45,10 @@ mod sync_test let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; + // prepared queries (unsafe use) + let stmt2 = conn.prep(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + // ... + // transactions let mut trans = conn.start_transaction(TxOpts::default())?; trans.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote10 @@ -93,6 +97,10 @@ mod async_test let _ = conn.exec_stream::(&stmt, (remote_string.as_str(),)).await?; let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {}).await?; + // prepared queries (unsafe use) + let stmt2 = conn.prep(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + // ... + // transactions let mut trans = conn.start_transaction(TxOpts::default()).await?; trans.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote11 From 257745284905ed49bf2342a85ece6708a853eaf4 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Sun, 12 Oct 2025 08:09:08 +0200 Subject: [PATCH 51/82] C#: Add neutral model for `System.ComponentModel.PropertyDescriptor.GetValue` --- csharp/ql/lib/ext/System.ComponentModel.model.yml | 5 +++++ .../library-tests/dataflow/library/FlowSummaries.expected | 4 ++-- .../dataflow/library/FlowSummariesFiltered.expected | 1 - 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/ext/System.ComponentModel.model.yml b/csharp/ql/lib/ext/System.ComponentModel.model.yml index d98c97727fb..a3b561583e3 100644 --- a/csharp/ql/lib/ext/System.ComponentModel.model.yml +++ b/csharp/ql/lib/ext/System.ComponentModel.model.yml @@ -36,3 +36,8 @@ extensions: - ["System.ComponentModel", "PropertyDescriptorCollection", False, "set_Item", "(System.Int32,System.Object)", "", "Argument[0]", "Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]", "value", "manual"] - ["System.ComponentModel", "PropertyDescriptorCollection", False, "set_Item", "(System.Int32,System.Object)", "", "Argument[1]", "Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]", "value", "manual"] - ["System.ComponentModel", "PropertyDescriptorCollection", False, "set_Item", "(System.Object,System.Object)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] + - addsTo: + pack: codeql/csharp-all + extensible: neutralModel + data: + - ["System.ComponentModel", "PropertyDescriptor", "GetValue", "(System.Object)", "summary", "manual"] \ No newline at end of file diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected index 36e23003fcc..8ffcd84e54b 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected @@ -3715,7 +3715,6 @@ summary | Newtonsoft.Json.Linq;JObject;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);Argument[0];Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key];value;manual | | Newtonsoft.Json.Linq;JObject;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);Argument[1];Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value];value;manual | | Newtonsoft.Json.Linq;JObject;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);Argument[1];Argument[this].Element;value;manual | -| Newtonsoft.Json.Linq;JPropertyDescriptor;GetValue;(System.Object);Argument[0];ReturnValue;taint;dfc-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;ResetValue;(System.Object);Argument[this];Argument[0];taint;df-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;SetValue;(System.Object,System.Object);Argument[0];Argument[this];taint;df-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;SetValue;(System.Object,System.Object);Argument[1];Argument[0];taint;df-generated | @@ -9085,7 +9084,6 @@ summary | System.ComponentModel;PropertyDescriptor;FillAttributes;(System.Collections.IList);Argument[this];Argument[0].Element;taint;df-generated | | System.ComponentModel;PropertyDescriptor;GetEditor;(System.Type);Argument[this];ReturnValue;taint;df-generated | | System.ComponentModel;PropertyDescriptor;GetInvocationTarget;(System.Type,System.Object);Argument[1];ReturnValue;value;dfc-generated | -| System.ComponentModel;PropertyDescriptor;GetValue;(System.Object);Argument[0];ReturnValue;taint;dfc-generated | | System.ComponentModel;PropertyDescriptor;RemoveValueChanged;(System.Object,System.EventHandler);Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.ComponentModel;PropertyDescriptor;ResetValue;(System.Object);Argument[this];Argument[0];taint;df-generated | | System.ComponentModel;PropertyDescriptor;SetValue;(System.Object,System.Object);Argument[0];Argument[this];taint;df-generated | @@ -25715,6 +25713,7 @@ neutral | Newtonsoft.Json.Linq;JObject;remove_PropertyChanged;(System.ComponentModel.PropertyChangedEventHandler);summary;df-generated | | Newtonsoft.Json.Linq;JObject;remove_PropertyChanging;(System.ComponentModel.PropertyChangingEventHandler);summary;df-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;CanResetValue;(System.Object);summary;df-generated | +| Newtonsoft.Json.Linq;JPropertyDescriptor;GetValue;(System.Object);summary;manual | | Newtonsoft.Json.Linq;JPropertyDescriptor;ShouldSerializeValue;(System.Object);summary;df-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;get_ComponentType;();summary;df-generated | | Newtonsoft.Json.Linq;JPropertyDescriptor;get_IsReadOnly;();summary;df-generated | @@ -28812,6 +28811,7 @@ neutral | System.ComponentModel;PropertyDescriptor;GetChildProperties;(System.Object,System.Attribute[]);summary;df-generated | | System.ComponentModel;PropertyDescriptor;GetHashCode;();summary;df-generated | | System.ComponentModel;PropertyDescriptor;GetTypeFromName;(System.String);summary;df-generated | +| System.ComponentModel;PropertyDescriptor;GetValue;(System.Object);summary;manual | | System.ComponentModel;PropertyDescriptor;GetValueChangedHandler;(System.Object);summary;df-generated | | System.ComponentModel;PropertyDescriptor;OnValueChanged;(System.Object,System.EventArgs);summary;df-generated | | System.ComponentModel;PropertyDescriptor;PropertyDescriptor;(System.ComponentModel.MemberDescriptor);summary;df-generated | diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected index 25ac85e9548..c885864a31e 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected @@ -6727,7 +6727,6 @@ | System.ComponentModel;PropertyChangingEventHandler;BeginInvoke;(System.Object,System.ComponentModel.PropertyChangingEventArgs,System.AsyncCallback,System.Object);Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.ComponentModel;PropertyDescriptor;AddValueChanged;(System.Object,System.EventHandler);Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.ComponentModel;PropertyDescriptor;GetEditor;(System.Type);Argument[this];ReturnValue;taint;df-generated | -| System.ComponentModel;PropertyDescriptor;GetValue;(System.Object);Argument[0];ReturnValue;taint;dfc-generated | | System.ComponentModel;PropertyDescriptor;RemoveValueChanged;(System.Object,System.EventHandler);Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.ComponentModel;PropertyDescriptor;ResetValue;(System.Object);Argument[this];Argument[0];taint;df-generated | | System.ComponentModel;PropertyDescriptor;SetValue;(System.Object,System.Object);Argument[0];Argument[this];taint;df-generated | From 500421d891b0967ef5fe8465adbab4ea1a32cafa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 03:14:48 +0000 Subject: [PATCH 52/82] Bump the extractor-dependencies group in /go/extractor with 2 updates Bumps the extractor-dependencies group in /go/extractor with 2 updates: [golang.org/x/mod](https://github.com/golang/mod) and [golang.org/x/tools](https://github.com/golang/tools). Updates `golang.org/x/mod` from 0.28.0 to 0.29.0 - [Commits](https://github.com/golang/mod/compare/v0.28.0...v0.29.0) Updates `golang.org/x/tools` from 0.37.0 to 0.38.0 - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.37.0...v0.38.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.29.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies - dependency-name: golang.org/x/tools dependency-version: 0.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies ... Signed-off-by: dependabot[bot] --- go/extractor/go.mod | 4 ++-- go/extractor/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 3369f28a954..e8cdde572e1 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -9,8 +9,8 @@ toolchain go1.25.0 // when adding or removing dependencies, run // bazel mod tidy require ( - golang.org/x/mod v0.28.0 - golang.org/x/tools v0.37.0 + golang.org/x/mod v0.29.0 + golang.org/x/tools v0.38.0 ) require golang.org/x/sync v0.17.0 // indirect diff --git a/go/extractor/go.sum b/go/extractor/go.sum index 1fa55e6db7c..9b34f09461c 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -1,8 +1,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= From c4b27d5f281697ca033a2aa4a20e84db1eeabd98 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 13 Oct 2025 13:50:43 +0000 Subject: [PATCH 53/82] Python: Fix `ImportError` in `imp.py` under Python 3.14 It seems `_ERR_MSG` was silently removed in Python 3.14, leading to an `ImportError` when running the extractor. To fix this, we explicitly set `_ERR_MSG` when the existing import fails (using `_ERR_MSG_PREFIX` which is available in Python 3.14+, along with the bits that make up the difference between this and `_ERR_MSG`). --- python/extractor/imp.py | 9 ++++++++- python/extractor/semmle/util.py | 2 +- .../2025-10-13-fix-importerror-on-python-3.14.md | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md diff --git a/python/extractor/imp.py b/python/extractor/imp.py index 6a0685559fd..8d703250b67 100644 --- a/python/extractor/imp.py +++ b/python/extractor/imp.py @@ -17,9 +17,16 @@ except ImportError: # Platform doesn't support dynamic loading. create_dynamic = None -from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name +from importlib._bootstrap import _exec, _load, _builtin_from_name from importlib._bootstrap_external import SourcelessFileLoader +# In Python 3.14, `_ERR_MSG` was removed in favor of `_ERR_MSG_PREFIX`. +try: + from importlib._bootstrap import _ERR_MSG +except ImportError: + from importlib._bootstrap import _ERR_MSG_PREFIX + _ERR_MSG = _ERR_MSG_PREFIX + '{name!r}' + from importlib import machinery from importlib import util import importlib diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 8196f76e437..2f6a18ac7a9 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ from io import BytesIO #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.4" +VERSION = "7.1.5" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md b/python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md new file mode 100644 index 00000000000..d2eefde0e11 --- /dev/null +++ b/python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* The Python extractor no longer crashes with an `ImportError` when run using Python 3.14. From 54aefe0dce9012b3dba28b828ea2d3b5d35023d2 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 29 Sep 2025 15:14:28 +0100 Subject: [PATCH 54/82] Copy experimental query to main --- .../CWE-1004/SensitiveCookieNotHttpOnly.java | 44 ++++ .../CWE-1004/SensitiveCookieNotHttpOnly.qhelp | 27 +++ .../CWE-1004/SensitiveCookieNotHttpOnly.ql | 223 ++++++++++++++++++ 3 files changed, 294 insertions(+) create mode 100644 java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java create mode 100644 java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp create mode 100644 java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java new file mode 100644 index 00000000000..48d80707ff8 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java @@ -0,0 +1,44 @@ +class SensitiveCookieNotHttpOnly { + // GOOD - Create a sensitive cookie with the `HttpOnly` flag set. + public void addCookie(String jwt_token, HttpServletRequest request, HttpServletResponse response) { + Cookie jwtCookie =new Cookie("jwt_token", jwt_token); + jwtCookie.setPath("/"); + jwtCookie.setMaxAge(3600*24*7); + jwtCookie.setHttpOnly(true); + response.addCookie(jwtCookie); + } + + // BAD - Create a sensitive cookie without the `HttpOnly` flag set. + public void addCookie2(String jwt_token, String userId, HttpServletRequest request, HttpServletResponse response) { + Cookie jwtCookie =new Cookie("jwt_token", jwt_token); + jwtCookie.setPath("/"); + jwtCookie.setMaxAge(3600*24*7); + response.addCookie(jwtCookie); + } + + // GOOD - Set a sensitive cookie header with the `HttpOnly` flag set. + public void addCookie3(String authId, HttpServletRequest request, HttpServletResponse response) { + response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure"); + } + + // BAD - Set a sensitive cookie header without the `HttpOnly` flag set. + public void addCookie4(String authId, HttpServletRequest request, HttpServletResponse response) { + response.addHeader("Set-Cookie", "token=" +authId + ";Secure"); + } + + // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through string concatenation. + public void addCookie5(String accessKey, HttpServletRequest request, HttpServletResponse response) { + response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true) + ";HttpOnly"); + } + + // BAD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. + public void addCookie6(String accessKey, HttpServletRequest request, HttpServletResponse response) { + response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true).toString()); + } + + // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through the constructor. + public void addCookie7(String accessKey, HttpServletRequest request, HttpServletResponse response) { + NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true); + response.setHeader("Set-Cookie", accessKeyCookie.toString()); + } +} diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp new file mode 100644 index 00000000000..ee3e8a4181a --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp @@ -0,0 +1,27 @@ + + + + +

    Cross-Site Scripting (XSS) is categorized as one of the OWASP Top 10 Security Vulnerabilities. The HttpOnly flag directs compatible browsers to prevent client-side script from accessing cookies. Including the HttpOnly flag in the Set-Cookie HTTP response header for a sensitive cookie helps mitigate the risk associated with XSS where an attacker's script code attempts to read the contents of a cookie and exfiltrate information obtained.

    +
    + + +

    Use the HttpOnly flag when generating a cookie containing sensitive information to help mitigate the risk of client side script accessing the protected cookie.

    +
    + + +

    The following example shows two ways of generating sensitive cookies. In the 'BAD' cases, the HttpOnly flag is not set. In the 'GOOD' cases, the HttpOnly flag is set.

    + +
    + + +
  • + PortSwigger: + Cookie without HttpOnly flag set +
  • +
  • + OWASP: + HttpOnly +
  • +
    +
    diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql new file mode 100644 index 00000000000..d2d596c23fa --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -0,0 +1,223 @@ +/** + * @name Sensitive cookies without the HttpOnly response header set + * @description Sensitive cookies without the 'HttpOnly' flag set leaves session cookies vulnerable to + * an XSS attack. + * @kind path-problem + * @problem.severity warning + * @precision medium + * @id java/sensitive-cookie-not-httponly + * @tags security + * external/cwe/cwe-1004 + */ + +/* + * Sketch of the structure of this query: we track cookie names that appear to be sensitive + * (e.g. `session` or `token`) to a `ServletResponse.addHeader(...)` or `.addCookie(...)` + * method that does not set the `httpOnly` flag. Subsidiary configurations + * `MatchesHttpOnlyConfiguration` and `SetHttpOnlyInCookieConfiguration` are used to establish + * when the `httpOnly` flag is likely to have been set, before configuration + * `MissingHttpOnlyConfiguration` establishes that a non-`httpOnly` cookie has a sensitive-seeming name. + */ + +import java +import semmle.code.java.dataflow.FlowSteps +import semmle.code.java.frameworks.Servlets +import semmle.code.java.dataflow.TaintTracking +import MissingHttpOnlyFlow::PathGraph + +/** Gets a regular expression for matching common names of sensitive cookies. */ +string getSensitiveCookieNameRegex() { result = "(?i).*(auth|session|token|key|credential).*" } + +/** Gets a regular expression for matching CSRF cookies. */ +string getCsrfCookieNameRegex() { result = "(?i).*(csrf).*" } + +/** + * Holds if a string is concatenated with the name of a sensitive cookie. Excludes CSRF cookies since + * they are special cookies implementing the Synchronizer Token Pattern that can be used in JavaScript. + */ +predicate isSensitiveCookieNameExpr(Expr expr) { + exists(string s | s = expr.(CompileTimeConstantExpr).getStringValue() | + s.regexpMatch(getSensitiveCookieNameRegex()) and not s.regexpMatch(getCsrfCookieNameRegex()) + ) + or + isSensitiveCookieNameExpr(expr.(AddExpr).getAnOperand()) +} + +/** A sensitive cookie name. */ +class SensitiveCookieNameExpr extends Expr { + SensitiveCookieNameExpr() { isSensitiveCookieNameExpr(this) } +} + +/** A method call that sets a `Set-Cookie` header. */ +class SetCookieMethodCall extends MethodCall { + SetCookieMethodCall() { + ( + this.getMethod() instanceof ResponseAddHeaderMethod or + this.getMethod() instanceof ResponseSetHeaderMethod + ) and + this.getArgument(0).(CompileTimeConstantExpr).getStringValue().toLowerCase() = "set-cookie" + } +} + +/** + * A taint configuration tracking flow from the text `httponly` to argument 1 of + * `SetCookieMethodCall`. + */ +module MatchesHttpOnlyConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr().(CompileTimeConstantExpr).getStringValue().toLowerCase().matches("%httponly%") + } + + predicate isSink(DataFlow::Node sink) { + sink.asExpr() = any(SetCookieMethodCall ma).getArgument(1) + } +} + +module MatchesHttpOnlyFlow = TaintTracking::Global; + +/** A class descended from `javax.servlet.http.Cookie`. */ +class CookieClass extends RefType { + CookieClass() { this.getAnAncestor().hasQualifiedName("javax.servlet.http", "Cookie") } +} + +/** Holds if `expr` is any boolean-typed expression other than literal `false`. */ +// Inlined because this could be a very large result set if computed out of context +pragma[inline] +predicate mayBeBooleanTrue(Expr expr) { + expr.getType() instanceof BooleanType and + not expr.(CompileTimeConstantExpr).getBooleanValue() = false +} + +/** Holds if the method call may set the `HttpOnly` flag. */ +predicate setsCookieHttpOnly(MethodCall ma) { + ma.getMethod().getName() = "setHttpOnly" and + // any use of setHttpOnly(x) where x isn't false is probably safe + mayBeBooleanTrue(ma.getArgument(0)) +} + +/** Holds if `ma` removes a cookie. */ +predicate removesCookie(MethodCall ma) { + ma.getMethod().getName() = "setMaxAge" and + ma.getArgument(0).(IntegerLiteral).getIntValue() = 0 +} + +/** + * Holds if the MethodCall `ma` is a test method call indicated by: + * a) in a test directory such as `src/test/java` + * b) in a test package whose name has the word `test` + * c) in a test class whose name has the word `test` + * d) in a test class implementing a test framework such as JUnit or TestNG + */ +predicate isTestMethod(MethodCall ma) { + exists(Method m | + m = ma.getEnclosingCallable() and + ( + m.getDeclaringType().getName().toLowerCase().matches("%test%") or // Simple check to exclude test classes to reduce FPs + m.getDeclaringType().getPackage().getName().toLowerCase().matches("%test%") or // Simple check to exclude classes in test packages to reduce FPs + exists(m.getLocation().getFile().getAbsolutePath().indexOf("/src/test/java")) or // Match test directory structure of build tools like maven + m instanceof TestMethod // Test method of a test case implementing a test framework such as JUnit or TestNG + ) + ) +} + +/** + * A taint configuration tracking flow of a method that sets the `HttpOnly` flag, + * or one that removes a cookie, to a `ServletResponse.addCookie` call. + */ +module SetHttpOnlyOrRemovesCookieConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr() = + any(MethodCall ma | setsCookieHttpOnly(ma) or removesCookie(ma)).getQualifier() + } + + predicate isSink(DataFlow::Node sink) { + sink.asExpr() = + any(MethodCall ma | ma.getMethod() instanceof ResponseAddCookieMethod).getArgument(0) + } +} + +module SetHttpOnlyOrRemovesCookieFlow = TaintTracking::Global; + +/** + * A cookie that is added to an HTTP response and which doesn't have `httpOnly` set, used as a sink + * in `MissingHttpOnlyConfiguration`. + */ +class CookieResponseSink extends DataFlow::ExprNode { + CookieResponseSink() { + exists(MethodCall ma | + ( + ma.getMethod() instanceof ResponseAddCookieMethod and + this.getExpr() = ma.getArgument(0) and + not SetHttpOnlyOrRemovesCookieFlow::flowTo(this) + or + ma instanceof SetCookieMethodCall and + this.getExpr() = ma.getArgument(1) and + not MatchesHttpOnlyFlow::flowTo(this) // response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure") + ) and + not isTestMethod(ma) // Test class or method + ) + } +} + +/** Holds if `cie` is an invocation of a JAX-RS `NewCookie` constructor that sets `HttpOnly` to true. */ +predicate setsHttpOnlyInNewCookie(ClassInstanceExpr cie) { + cie.getConstructedType().hasQualifiedName(["javax.ws.rs.core", "jakarta.ws.rs.core"], "NewCookie") and + ( + cie.getNumArgument() = 6 and + mayBeBooleanTrue(cie.getArgument(5)) // NewCookie(Cookie cookie, String comment, int maxAge, Date expiry, boolean secure, boolean httpOnly) + or + cie.getNumArgument() = 8 and + cie.getArgument(6).getType() instanceof BooleanType and + mayBeBooleanTrue(cie.getArgument(7)) // NewCookie(String name, String value, String path, String domain, String comment, int maxAge, boolean secure, boolean httpOnly) + or + cie.getNumArgument() = 10 and + mayBeBooleanTrue(cie.getArgument(9)) // NewCookie(String name, String value, String path, String domain, int version, String comment, int maxAge, Date expiry, boolean secure, boolean httpOnly) + ) +} + +/** + * A taint configuration tracking flow from a sensitive cookie without the `HttpOnly` flag + * set to its HTTP response. + */ +module MissingHttpOnlyConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asExpr() instanceof SensitiveCookieNameExpr } + + predicate isSink(DataFlow::Node sink) { sink instanceof CookieResponseSink } + + predicate isBarrier(DataFlow::Node node) { + // JAX-RS's `new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true)` and similar + setsHttpOnlyInNewCookie(node.asExpr()) + } + + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { + exists( + ConstructorCall cc // new Cookie(...) + | + cc.getConstructedType() instanceof CookieClass and + pred.asExpr() = cc.getAnArgument() and + succ.asExpr() = cc + ) + or + exists( + MethodCall ma // cookie.toString() + | + ma.getMethod().getName() = "toString" and + ma.getQualifier().getType() instanceof CookieClass and + pred.asExpr() = ma.getQualifier() and + succ.asExpr() = ma + ) + } +} + +module MissingHttpOnlyFlow = TaintTracking::Global; + +deprecated query predicate problems( + DataFlow::Node sinkNode, MissingHttpOnlyFlow::PathNode source, MissingHttpOnlyFlow::PathNode sink, + string message1, DataFlow::Node sourceNode, string message2 +) { + MissingHttpOnlyFlow::flowPath(source, sink) and + sinkNode = sink.getNode() and + message1 = "$@ doesn't have the HttpOnly flag set." and + sourceNode = source.getNode() and + message2 = "This sensitive cookie" +} From e1cf3d30d2447b779ec3bc847f9262e1f90d3866 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 1 Oct 2025 11:20:11 +0100 Subject: [PATCH 55/82] Update documentation, rename things and add more comments to explain how the implementation works, remove filter for test code (prefer to filter in code scanning ui than in query logic) --- .../CWE-1004/SensitiveCookieNotHttpOnly.qhelp | 7 +- .../CWE-1004/SensitiveCookieNotHttpOnly.ql | 70 +++++++------------ 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp index ee3e8a4181a..71e016510e2 100644 --- a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp @@ -2,11 +2,13 @@ -

    Cross-Site Scripting (XSS) is categorized as one of the OWASP Top 10 Security Vulnerabilities. The HttpOnly flag directs compatible browsers to prevent client-side script from accessing cookies. Including the HttpOnly flag in the Set-Cookie HTTP response header for a sensitive cookie helps mitigate the risk associated with XSS where an attacker's script code attempts to read the contents of a cookie and exfiltrate information obtained.

    +

    Cookies without the HttpOnly flag set are accessible to client-side scripts (such as JavaScript) running in the same origin. +In case of a Cross-Site Scripting (XSS) vulnerability, the cookie can be stolen by a malicious script. +If a sensitive cookie does not need to be accessed directly by client-side scripts, the HttpOnly flag should be set.

    -

    Use the HttpOnly flag when generating a cookie containing sensitive information to help mitigate the risk of client side script accessing the protected cookie.

    +

    Use the HttpOnly flag when generating a cookie containing sensitive information to help mitigate the risk of client-side scripts accessing the protected cookie.

    @@ -23,5 +25,6 @@ OWASP: HttpOnly +
  • MDN: Set-Cookie HttpOnly.
  • diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql index d2d596c23fa..41b2c95c870 100644 --- a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -14,7 +14,7 @@ * Sketch of the structure of this query: we track cookie names that appear to be sensitive * (e.g. `session` or `token`) to a `ServletResponse.addHeader(...)` or `.addCookie(...)` * method that does not set the `httpOnly` flag. Subsidiary configurations - * `MatchesHttpOnlyConfiguration` and `SetHttpOnlyInCookieConfiguration` are used to establish + * `MatchesHttpOnlyToRawHeaderConfiguration` and `SetHttpOnlyInCookieConfiguration` are used to establish * when the `httpOnly` flag is likely to have been set, before configuration * `MissingHttpOnlyConfiguration` establishes that a non-`httpOnly` cookie has a sensitive-seeming name. */ @@ -49,8 +49,8 @@ class SensitiveCookieNameExpr extends Expr { } /** A method call that sets a `Set-Cookie` header. */ -class SetCookieMethodCall extends MethodCall { - SetCookieMethodCall() { +class SetCookieRawHeaderMethodCall extends MethodCall { + SetCookieRawHeaderMethodCall() { ( this.getMethod() instanceof ResponseAddHeaderMethod or this.getMethod() instanceof ResponseSetHeaderMethod @@ -61,19 +61,19 @@ class SetCookieMethodCall extends MethodCall { /** * A taint configuration tracking flow from the text `httponly` to argument 1 of - * `SetCookieMethodCall`. + * `SetCookieRawHeaderMethodCall`. */ -module MatchesHttpOnlyConfig implements DataFlow::ConfigSig { +module MatchesHttpOnlyToRawHeaderConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(CompileTimeConstantExpr).getStringValue().toLowerCase().matches("%httponly%") } predicate isSink(DataFlow::Node sink) { - sink.asExpr() = any(SetCookieMethodCall ma).getArgument(1) + sink.asExpr() = any(SetCookieRawHeaderMethodCall ma).getArgument(1) } } -module MatchesHttpOnlyFlow = TaintTracking::Global; +module MatchesHttpOnlyToRawHeaderFlow = TaintTracking::Global; /** A class descended from `javax.servlet.http.Cookie`. */ class CookieClass extends RefType { @@ -101,30 +101,11 @@ predicate removesCookie(MethodCall ma) { ma.getArgument(0).(IntegerLiteral).getIntValue() = 0 } -/** - * Holds if the MethodCall `ma` is a test method call indicated by: - * a) in a test directory such as `src/test/java` - * b) in a test package whose name has the word `test` - * c) in a test class whose name has the word `test` - * d) in a test class implementing a test framework such as JUnit or TestNG - */ -predicate isTestMethod(MethodCall ma) { - exists(Method m | - m = ma.getEnclosingCallable() and - ( - m.getDeclaringType().getName().toLowerCase().matches("%test%") or // Simple check to exclude test classes to reduce FPs - m.getDeclaringType().getPackage().getName().toLowerCase().matches("%test%") or // Simple check to exclude classes in test packages to reduce FPs - exists(m.getLocation().getFile().getAbsolutePath().indexOf("/src/test/java")) or // Match test directory structure of build tools like maven - m instanceof TestMethod // Test method of a test case implementing a test framework such as JUnit or TestNG - ) - ) -} - /** * A taint configuration tracking flow of a method that sets the `HttpOnly` flag, * or one that removes a cookie, to a `ServletResponse.addCookie` call. */ -module SetHttpOnlyOrRemovesCookieConfig implements DataFlow::ConfigSig { +module SetHttpOnlyOrRemovesCookieToAddCookieConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr() = any(MethodCall ma | setsCookieHttpOnly(ma) or removesCookie(ma)).getQualifier() @@ -136,25 +117,25 @@ module SetHttpOnlyOrRemovesCookieConfig implements DataFlow::ConfigSig { } } -module SetHttpOnlyOrRemovesCookieFlow = TaintTracking::Global; +module SetHttpOnlyOrRemovesCookieToAddCookieFlow = + TaintTracking::Global; /** * A cookie that is added to an HTTP response and which doesn't have `httpOnly` set, used as a sink * in `MissingHttpOnlyConfiguration`. */ -class CookieResponseSink extends DataFlow::ExprNode { - CookieResponseSink() { +class CookieResponseWithoutHttpOnlySink extends DataFlow::ExprNode { + CookieResponseWithoutHttpOnlySink() { exists(MethodCall ma | ( ma.getMethod() instanceof ResponseAddCookieMethod and this.getExpr() = ma.getArgument(0) and - not SetHttpOnlyOrRemovesCookieFlow::flowTo(this) + not SetHttpOnlyOrRemovesCookieToAddCookieFlow::flowTo(this) or - ma instanceof SetCookieMethodCall and + ma instanceof SetCookieRawHeaderMethodCall and this.getExpr() = ma.getArgument(1) and - not MatchesHttpOnlyFlow::flowTo(this) // response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure") - ) and - not isTestMethod(ma) // Test class or method + not MatchesHttpOnlyToRawHeaderFlow::flowTo(this) // response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure") + ) ) } } @@ -178,14 +159,18 @@ predicate setsHttpOnlyInNewCookie(ClassInstanceExpr cie) { /** * A taint configuration tracking flow from a sensitive cookie without the `HttpOnly` flag * set to its HTTP response. + * Tracks string literals containing sensitive names (`SensitiveNameExpr`), to an `addCookie` call (as a `Cookie` object) + * or an `addHeader` call (as a string) (`CookieResponseWithoutHttpOnly`). + * Passes through `Cookie` constructors and `toString` calls. */ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr() instanceof SensitiveCookieNameExpr } - predicate isSink(DataFlow::Node sink) { sink instanceof CookieResponseSink } + predicate isSink(DataFlow::Node sink) { sink instanceof CookieResponseWithoutHttpOnlySink } predicate isBarrier(DataFlow::Node node) { // JAX-RS's `new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true)` and similar + // Cookie constructors, but barriers to considering the flow of the sensitive name, as httponly flag is set. setsHttpOnlyInNewCookie(node.asExpr()) } @@ -211,13 +196,6 @@ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { module MissingHttpOnlyFlow = TaintTracking::Global; -deprecated query predicate problems( - DataFlow::Node sinkNode, MissingHttpOnlyFlow::PathNode source, MissingHttpOnlyFlow::PathNode sink, - string message1, DataFlow::Node sourceNode, string message2 -) { - MissingHttpOnlyFlow::flowPath(source, sink) and - sinkNode = sink.getNode() and - message1 = "$@ doesn't have the HttpOnly flag set." and - sourceNode = source.getNode() and - message2 = "This sensitive cookie" -} +from MissingHttpOnlyFlow::PathNode source, MissingHttpOnlyFlow::PathNode sink +where MissingHttpOnlyFlow::flowPath(source, sink) +select sink, source, sink, "$@ doesn't have the HttpOnly flag set.", source, "This sensitive cookie" From c799f9381140d28844a1654c323a1455c9e689e2 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 1 Oct 2025 16:48:09 +0100 Subject: [PATCH 56/82] Update tests and add inline expectations --- .../CWE-1004/SensitiveCookieNotHttpOnly.ql | 3 +- .../SensitiveCookieNotHttpOnly.expected | 60 +++++++ .../CWE-1004/SensitiveCookieNotHttpOnly.java | 164 ++++++++++++++++++ .../CWE-1004/SensitiveCookieNotHttpOnly.qlref | 2 + .../query-tests/security/CWE-1004/options | 1 + 5 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected create mode 100644 java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java create mode 100644 java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref create mode 100644 java/ql/test/query-tests/security/CWE-1004/options diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql index 41b2c95c870..4eae5f1ee4e 100644 --- a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -23,7 +23,6 @@ import java import semmle.code.java.dataflow.FlowSteps import semmle.code.java.frameworks.Servlets import semmle.code.java.dataflow.TaintTracking -import MissingHttpOnlyFlow::PathGraph /** Gets a regular expression for matching common names of sensitive cookies. */ string getSensitiveCookieNameRegex() { result = "(?i).*(auth|session|token|key|credential).*" } @@ -196,6 +195,8 @@ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { module MissingHttpOnlyFlow = TaintTracking::Global; +import MissingHttpOnlyFlow::PathGraph + from MissingHttpOnlyFlow::PathNode source, MissingHttpOnlyFlow::PathNode sink where MissingHttpOnlyFlow::flowPath(source, sink) select sink, source, sink, "$@ doesn't have the HttpOnly flag set.", source, "This sensitive cookie" diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected new file mode 100644 index 00000000000..71c73f3921e --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected @@ -0,0 +1,60 @@ +#select +| SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | This sensitive cookie | +| SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | This sensitive cookie | +edges +| SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | provenance | | +| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | provenance | Sink:MaD:46211 | +| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | Config | +| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | MaD:46217 | +| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | provenance | MaD:46260 Sink:MaD:46214 | +| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | provenance | MaD:46298 | +| SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | provenance | | +| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | provenance | MaD:46298 | +| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | provenance | MaD:46260 | +| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | provenance | Sink:MaD:46214 | +| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | provenance | | +| SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | provenance | | +| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | Config | +| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | MaD:46217 | +| SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | provenance | | +| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | provenance | Sink:MaD:46211 | +nodes +| SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | semmle.label | "jwt_token" : String | +| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | +| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | semmle.label | tokenCookieStr : String | +| SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | semmle.label | jwtCookie | +| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | semmle.label | "token=" : String | +| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | semmle.label | ... + ... : String | +| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | semmle.label | ... + ... | +| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | semmle.label | new NewCookie(...) : NewCookie | +| SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | semmle.label | toString(...) | +| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | semmle.label | "session-access-key" : String | +| SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | semmle.label | new NewCookie(...) : NewCookie | +| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | semmle.label | "session-access-key" : String | +| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | semmle.label | accessKeyCookie : NewCookie | +| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | semmle.label | toString(...) : String | +| SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | semmle.label | keyStr | +| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | semmle.label | "token=" : String | +| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | semmle.label | ... + ... : String | +| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | semmle.label | ... + ... : String | +| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | semmle.label | secString | +| SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | semmle.label | "Presto-UI-Token" : String | +| SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | +| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | semmle.label | PRESTO_UI_COOKIE : String | +| SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | semmle.label | cookie : Cookie | +| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | semmle.label | createAuthenticationCookie(...) : Cookie | +| SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | semmle.label | cookie | +subpaths diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java new file mode 100644 index 00000000000..a57a502336f --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java @@ -0,0 +1,164 @@ +import java.io.IOException; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; + +import javax.ws.rs.core.NewCookie; + +import org.springframework.security.web.csrf.CsrfToken; + +class SensitiveCookieNotHttpOnly { + // GOOD - Tests adding a sensitive cookie with the `HttpOnly` flag set. + public void addCookie(String jwt_token, HttpServletRequest request, HttpServletResponse response) { + Cookie jwtCookie = new Cookie("jwt_token", jwt_token); + jwtCookie.setPath("/"); + jwtCookie.setMaxAge(3600*24*7); + jwtCookie.setHttpOnly(true); + response.addCookie(jwtCookie); + } + + // BAD - Tests adding a sensitive cookie without the `HttpOnly` flag set. + public void addCookie2(String jwt_token, String userId, HttpServletRequest request, HttpServletResponse response) { + String tokenCookieStr = "jwt_token"; // $Source + Cookie jwtCookie = new Cookie(tokenCookieStr, jwt_token); + Cookie userIdCookie = new Cookie("user_id", userId); + jwtCookie.setPath("/"); + userIdCookie.setPath("/"); + jwtCookie.setMaxAge(3600*24*7); + userIdCookie.setMaxAge(3600*24*7); + response.addCookie(jwtCookie); // $Alert + response.addCookie(userIdCookie); + } + + // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set. + public void addCookie3(String authId, HttpServletRequest request, HttpServletResponse response) { + response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure"); + } + + // BAD - Tests set a sensitive cookie header without the `HttpOnly` flag set. + public void addCookie4(String authId, HttpServletRequest request, HttpServletResponse response) { + response.addHeader("Set-Cookie", "token=" +authId + ";Secure"); // $Alert + } + + // GOOD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through string concatenation. + public void addCookie5(String accessKey, HttpServletRequest request, HttpServletResponse response) { + response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true) + ";HttpOnly"); + } + + // BAD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. + public void addCookie6(String accessKey, HttpServletRequest request, HttpServletResponse response) { + response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true).toString()); // $Alert + } + + // GOOD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through the constructor. + public void addCookie7(String accessKey, HttpServletRequest request, HttpServletResponse response) { + NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true); + response.setHeader("Set-Cookie", accessKeyCookie.toString()); + } + + // BAD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. + public void addCookie8(String accessKey, HttpServletRequest request, HttpServletResponse response) { + NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, 0, null, 86400, true); // $Source + String keyStr = accessKeyCookie.toString(); + response.setHeader("Set-Cookie", keyStr); // $Alert + } + + // BAD - Tests set a sensitive cookie header using a variable without the `HttpOnly` flag set. + public void addCookie9(String authId, HttpServletRequest request, HttpServletResponse response) { + String secString = "token=" +authId + ";Secure"; // $Source + response.addHeader("Set-Cookie", secString); // $Alert + } + + // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set using `String.format(...)`. + public void addCookie10(HttpServletRequest request, HttpServletResponse response) { + response.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly", "sessionkey", request.getSession().getAttribute("sessionkey"))); + } + + public Cookie createHttpOnlyAuthenticationCookie(HttpServletRequest request, String jwt) { + String PRESTO_UI_COOKIE = "Presto-UI-Token"; + Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); + cookie.setHttpOnly(true); + cookie.setPath("/ui"); + return cookie; + } + + public Cookie createAuthenticationCookie(HttpServletRequest request, String jwt) { + String PRESTO_UI_COOKIE = "Presto-UI-Token"; // $Source + Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); + cookie.setPath("/ui"); + return cookie; + } + + public Cookie removeAuthenticationCookie(HttpServletRequest request, String jwt) { + String PRESTO_UI_COOKIE = "Presto-UI-Token"; + Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); + cookie.setPath("/ui"); + cookie.setMaxAge(0); + return cookie; + } + + // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set using a wrapper method. + public void addCookie11(HttpServletRequest request, HttpServletResponse response, String jwt) { + Cookie cookie = createHttpOnlyAuthenticationCookie(request, jwt); + response.addCookie(cookie); + } + + // BAD - Tests set a sensitive cookie header without the `HttpOnly` flag set using a wrapper method. + public void addCookie12(HttpServletRequest request, HttpServletResponse response, String jwt) { + Cookie cookie = createAuthenticationCookie(request, jwt); + response.addCookie(cookie); // $Alert + } + + // GOOD - Tests remove a sensitive cookie header without the `HttpOnly` flag set using a wrapper method. + public void addCookie13(HttpServletRequest request, HttpServletResponse response, String jwt) { + Cookie cookie = removeAuthenticationCookie(request, jwt); + response.addCookie(cookie); + } + + private Cookie createCookie(String name, String value, Boolean httpOnly){ + Cookie cookie = null; + cookie = new Cookie(name, value); + cookie.setDomain("/"); + cookie.setHttpOnly(httpOnly); + + //for production https + cookie.setSecure(true); + + cookie.setMaxAge(60*60*24*30); + cookie.setPath("/"); + + return cookie; + } + + // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set through a boolean variable using a wrapper method. + public void addCookie14(HttpServletRequest request, HttpServletResponse response, String refreshToken) { + response.addCookie(createCookie("refresh_token", refreshToken, true)); + } + + // BAD (but not detected) - Tests set a sensitive cookie header with the `HttpOnly` flag not set through a boolean variable using a wrapper method. + // This example is missed because the `cookie.setHttpOnly` call in `createCookie` is thought to maybe set the HTTP-only flag, and the `cookie` + // object flows to this `addCookie` call. + public void addCookie15(HttpServletRequest request, HttpServletResponse response, String refreshToken) { + response.addCookie(createCookie("refresh_token", refreshToken, false)); // $MISSING:Alert + } + + // GOOD - CSRF token doesn't need to have the `HttpOnly` flag set. + public void addCsrfCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // Spring put the CSRF token in session attribute "_csrf" + CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf"); + + // Send the cookie only if the token has changed + String actualToken = request.getHeader("X-CSRF-TOKEN"); + if (actualToken == null || !actualToken.equals(csrfToken.getToken())) { + // Session cookie that can be used by AngularJS + String pCookieName = "CSRF-TOKEN"; + Cookie cookie = new Cookie(pCookieName, csrfToken.getToken()); + cookie.setMaxAge(-1); + cookie.setHttpOnly(false); + cookie.setPath("/"); + response.addCookie(cookie); + } + } +} diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref new file mode 100644 index 00000000000..e3b99f6e685 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref @@ -0,0 +1,2 @@ +query: Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-1004/options b/java/ql/test/query-tests/security/CWE-1004/options new file mode 100644 index 00000000000..0db0b6e7242 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-1004/options @@ -0,0 +1 @@ +// semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/springframework-5.8.x From c4781146c0f7497ded8090b532f9f84411159391 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 2 Oct 2025 09:59:44 +0100 Subject: [PATCH 57/82] Remove experimental query and tests --- .../CWE-1004/SensitiveCookieNotHttpOnly.java | 44 ---- .../CWE-1004/SensitiveCookieNotHttpOnly.qhelp | 27 --- .../CWE-1004/SensitiveCookieNotHttpOnly.ql | 224 ------------------ .../SensitiveCookieNotHttpOnly.expected | 67 ------ .../CWE-1004/SensitiveCookieNotHttpOnly.java | 164 ------------- .../CWE-1004/SensitiveCookieNotHttpOnly.qlref | 2 - .../query-tests/security/CWE-1004/options | 1 - 7 files changed, 529 deletions(-) delete mode 100644 java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java delete mode 100644 java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp delete mode 100644 java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql delete mode 100644 java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected delete mode 100644 java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java delete mode 100644 java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref delete mode 100644 java/ql/test/experimental/query-tests/security/CWE-1004/options diff --git a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java b/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java deleted file mode 100644 index 48d80707ff8..00000000000 --- a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.java +++ /dev/null @@ -1,44 +0,0 @@ -class SensitiveCookieNotHttpOnly { - // GOOD - Create a sensitive cookie with the `HttpOnly` flag set. - public void addCookie(String jwt_token, HttpServletRequest request, HttpServletResponse response) { - Cookie jwtCookie =new Cookie("jwt_token", jwt_token); - jwtCookie.setPath("/"); - jwtCookie.setMaxAge(3600*24*7); - jwtCookie.setHttpOnly(true); - response.addCookie(jwtCookie); - } - - // BAD - Create a sensitive cookie without the `HttpOnly` flag set. - public void addCookie2(String jwt_token, String userId, HttpServletRequest request, HttpServletResponse response) { - Cookie jwtCookie =new Cookie("jwt_token", jwt_token); - jwtCookie.setPath("/"); - jwtCookie.setMaxAge(3600*24*7); - response.addCookie(jwtCookie); - } - - // GOOD - Set a sensitive cookie header with the `HttpOnly` flag set. - public void addCookie3(String authId, HttpServletRequest request, HttpServletResponse response) { - response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure"); - } - - // BAD - Set a sensitive cookie header without the `HttpOnly` flag set. - public void addCookie4(String authId, HttpServletRequest request, HttpServletResponse response) { - response.addHeader("Set-Cookie", "token=" +authId + ";Secure"); - } - - // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through string concatenation. - public void addCookie5(String accessKey, HttpServletRequest request, HttpServletResponse response) { - response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true) + ";HttpOnly"); - } - - // BAD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. - public void addCookie6(String accessKey, HttpServletRequest request, HttpServletResponse response) { - response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true).toString()); - } - - // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through the constructor. - public void addCookie7(String accessKey, HttpServletRequest request, HttpServletResponse response) { - NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true); - response.setHeader("Set-Cookie", accessKeyCookie.toString()); - } -} diff --git a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp b/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp deleted file mode 100644 index ee3e8a4181a..00000000000 --- a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.qhelp +++ /dev/null @@ -1,27 +0,0 @@ - - - - -

    Cross-Site Scripting (XSS) is categorized as one of the OWASP Top 10 Security Vulnerabilities. The HttpOnly flag directs compatible browsers to prevent client-side script from accessing cookies. Including the HttpOnly flag in the Set-Cookie HTTP response header for a sensitive cookie helps mitigate the risk associated with XSS where an attacker's script code attempts to read the contents of a cookie and exfiltrate information obtained.

    -
    - - -

    Use the HttpOnly flag when generating a cookie containing sensitive information to help mitigate the risk of client side script accessing the protected cookie.

    -
    - - -

    The following example shows two ways of generating sensitive cookies. In the 'BAD' cases, the HttpOnly flag is not set. In the 'GOOD' cases, the HttpOnly flag is set.

    - -
    - - -
  • - PortSwigger: - Cookie without HttpOnly flag set -
  • -
  • - OWASP: - HttpOnly -
  • -
    -
    diff --git a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql deleted file mode 100644 index fa5237d32bb..00000000000 --- a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @name Sensitive cookies without the HttpOnly response header set - * @description Sensitive cookies without the 'HttpOnly' flag set leaves session cookies vulnerable to - * an XSS attack. - * @kind path-problem - * @problem.severity warning - * @precision medium - * @id java/sensitive-cookie-not-httponly - * @tags security - * experimental - * external/cwe/cwe-1004 - */ - -/* - * Sketch of the structure of this query: we track cookie names that appear to be sensitive - * (e.g. `session` or `token`) to a `ServletResponse.addHeader(...)` or `.addCookie(...)` - * method that does not set the `httpOnly` flag. Subsidiary configurations - * `MatchesHttpOnlyConfiguration` and `SetHttpOnlyInCookieConfiguration` are used to establish - * when the `httpOnly` flag is likely to have been set, before configuration - * `MissingHttpOnlyConfiguration` establishes that a non-`httpOnly` cookie has a sensitive-seeming name. - */ - -import java -import semmle.code.java.dataflow.FlowSteps -import semmle.code.java.frameworks.Servlets -import semmle.code.java.dataflow.TaintTracking -import MissingHttpOnlyFlow::PathGraph - -/** Gets a regular expression for matching common names of sensitive cookies. */ -string getSensitiveCookieNameRegex() { result = "(?i).*(auth|session|token|key|credential).*" } - -/** Gets a regular expression for matching CSRF cookies. */ -string getCsrfCookieNameRegex() { result = "(?i).*(csrf).*" } - -/** - * Holds if a string is concatenated with the name of a sensitive cookie. Excludes CSRF cookies since - * they are special cookies implementing the Synchronizer Token Pattern that can be used in JavaScript. - */ -predicate isSensitiveCookieNameExpr(Expr expr) { - exists(string s | s = expr.(CompileTimeConstantExpr).getStringValue() | - s.regexpMatch(getSensitiveCookieNameRegex()) and not s.regexpMatch(getCsrfCookieNameRegex()) - ) - or - isSensitiveCookieNameExpr(expr.(AddExpr).getAnOperand()) -} - -/** A sensitive cookie name. */ -class SensitiveCookieNameExpr extends Expr { - SensitiveCookieNameExpr() { isSensitiveCookieNameExpr(this) } -} - -/** A method call that sets a `Set-Cookie` header. */ -class SetCookieMethodCall extends MethodCall { - SetCookieMethodCall() { - ( - this.getMethod() instanceof ResponseAddHeaderMethod or - this.getMethod() instanceof ResponseSetHeaderMethod - ) and - this.getArgument(0).(CompileTimeConstantExpr).getStringValue().toLowerCase() = "set-cookie" - } -} - -/** - * A taint configuration tracking flow from the text `httponly` to argument 1 of - * `SetCookieMethodCall`. - */ -module MatchesHttpOnlyConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.asExpr().(CompileTimeConstantExpr).getStringValue().toLowerCase().matches("%httponly%") - } - - predicate isSink(DataFlow::Node sink) { - sink.asExpr() = any(SetCookieMethodCall ma).getArgument(1) - } -} - -module MatchesHttpOnlyFlow = TaintTracking::Global; - -/** A class descended from `javax.servlet.http.Cookie`. */ -class CookieClass extends RefType { - CookieClass() { this.getAnAncestor().hasQualifiedName("javax.servlet.http", "Cookie") } -} - -/** Holds if `expr` is any boolean-typed expression other than literal `false`. */ -// Inlined because this could be a very large result set if computed out of context -pragma[inline] -predicate mayBeBooleanTrue(Expr expr) { - expr.getType() instanceof BooleanType and - not expr.(CompileTimeConstantExpr).getBooleanValue() = false -} - -/** Holds if the method call may set the `HttpOnly` flag. */ -predicate setsCookieHttpOnly(MethodCall ma) { - ma.getMethod().getName() = "setHttpOnly" and - // any use of setHttpOnly(x) where x isn't false is probably safe - mayBeBooleanTrue(ma.getArgument(0)) -} - -/** Holds if `ma` removes a cookie. */ -predicate removesCookie(MethodCall ma) { - ma.getMethod().getName() = "setMaxAge" and - ma.getArgument(0).(IntegerLiteral).getIntValue() = 0 -} - -/** - * Holds if the MethodCall `ma` is a test method call indicated by: - * a) in a test directory such as `src/test/java` - * b) in a test package whose name has the word `test` - * c) in a test class whose name has the word `test` - * d) in a test class implementing a test framework such as JUnit or TestNG - */ -predicate isTestMethod(MethodCall ma) { - exists(Method m | - m = ma.getEnclosingCallable() and - ( - m.getDeclaringType().getName().toLowerCase().matches("%test%") or // Simple check to exclude test classes to reduce FPs - m.getDeclaringType().getPackage().getName().toLowerCase().matches("%test%") or // Simple check to exclude classes in test packages to reduce FPs - exists(m.getLocation().getFile().getAbsolutePath().indexOf("/src/test/java")) or // Match test directory structure of build tools like maven - m instanceof TestMethod // Test method of a test case implementing a test framework such as JUnit or TestNG - ) - ) -} - -/** - * A taint configuration tracking flow of a method that sets the `HttpOnly` flag, - * or one that removes a cookie, to a `ServletResponse.addCookie` call. - */ -module SetHttpOnlyOrRemovesCookieConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.asExpr() = - any(MethodCall ma | setsCookieHttpOnly(ma) or removesCookie(ma)).getQualifier() - } - - predicate isSink(DataFlow::Node sink) { - sink.asExpr() = - any(MethodCall ma | ma.getMethod() instanceof ResponseAddCookieMethod).getArgument(0) - } -} - -module SetHttpOnlyOrRemovesCookieFlow = TaintTracking::Global; - -/** - * A cookie that is added to an HTTP response and which doesn't have `httpOnly` set, used as a sink - * in `MissingHttpOnlyConfiguration`. - */ -class CookieResponseSink extends DataFlow::ExprNode { - CookieResponseSink() { - exists(MethodCall ma | - ( - ma.getMethod() instanceof ResponseAddCookieMethod and - this.getExpr() = ma.getArgument(0) and - not SetHttpOnlyOrRemovesCookieFlow::flowTo(this) - or - ma instanceof SetCookieMethodCall and - this.getExpr() = ma.getArgument(1) and - not MatchesHttpOnlyFlow::flowTo(this) // response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure") - ) and - not isTestMethod(ma) // Test class or method - ) - } -} - -/** Holds if `cie` is an invocation of a JAX-RS `NewCookie` constructor that sets `HttpOnly` to true. */ -predicate setsHttpOnlyInNewCookie(ClassInstanceExpr cie) { - cie.getConstructedType().hasQualifiedName(["javax.ws.rs.core", "jakarta.ws.rs.core"], "NewCookie") and - ( - cie.getNumArgument() = 6 and - mayBeBooleanTrue(cie.getArgument(5)) // NewCookie(Cookie cookie, String comment, int maxAge, Date expiry, boolean secure, boolean httpOnly) - or - cie.getNumArgument() = 8 and - cie.getArgument(6).getType() instanceof BooleanType and - mayBeBooleanTrue(cie.getArgument(7)) // NewCookie(String name, String value, String path, String domain, String comment, int maxAge, boolean secure, boolean httpOnly) - or - cie.getNumArgument() = 10 and - mayBeBooleanTrue(cie.getArgument(9)) // NewCookie(String name, String value, String path, String domain, int version, String comment, int maxAge, Date expiry, boolean secure, boolean httpOnly) - ) -} - -/** - * A taint configuration tracking flow from a sensitive cookie without the `HttpOnly` flag - * set to its HTTP response. - */ -module MissingHttpOnlyConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source.asExpr() instanceof SensitiveCookieNameExpr } - - predicate isSink(DataFlow::Node sink) { sink instanceof CookieResponseSink } - - predicate isBarrier(DataFlow::Node node) { - // JAX-RS's `new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true)` and similar - setsHttpOnlyInNewCookie(node.asExpr()) - } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists( - ConstructorCall cc // new Cookie(...) - | - cc.getConstructedType() instanceof CookieClass and - pred.asExpr() = cc.getAnArgument() and - succ.asExpr() = cc - ) - or - exists( - MethodCall ma // cookie.toString() - | - ma.getMethod().getName() = "toString" and - ma.getQualifier().getType() instanceof CookieClass and - pred.asExpr() = ma.getQualifier() and - succ.asExpr() = ma - ) - } -} - -module MissingHttpOnlyFlow = TaintTracking::Global; - -deprecated query predicate problems( - DataFlow::Node sinkNode, MissingHttpOnlyFlow::PathNode source, MissingHttpOnlyFlow::PathNode sink, - string message1, DataFlow::Node sourceNode, string message2 -) { - MissingHttpOnlyFlow::flowPath(source, sink) and - sinkNode = sink.getNode() and - message1 = "$@ doesn't have the HttpOnly flag set." and - sourceNode = source.getNode() and - message2 = "This sensitive cookie" -} diff --git a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected b/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected deleted file mode 100644 index caecb52fe45..00000000000 --- a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected +++ /dev/null @@ -1,67 +0,0 @@ -edges -| SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | provenance | | -| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | provenance | Sink:MaD:1 | -| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | Config | -| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | MaD:4 | -| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:2 | -| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:2 | -| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | provenance | MaD:5 Sink:MaD:3 | -| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | provenance | MaD:6 | -| SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | provenance | | -| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | provenance | MaD:6 | -| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | provenance | MaD:5 | -| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | provenance | Sink:MaD:3 | -| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | -| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | -| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | -| SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | provenance | | -| SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | provenance | | -| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | Config | -| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | MaD:4 | -| SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | provenance | | -| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | provenance | Sink:MaD:1 | -models -| 1 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | -| 2 | Sink: javax.servlet.http; HttpServletResponse; false; addHeader; ; ; Argument[0..1]; response-splitting; manual | -| 3 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | -| 4 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[0]; Argument[this]; taint; manual | -| 5 | Summary: javax.ws.rs.core; Cookie; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 6 | Summary: javax.ws.rs.core; NewCookie; false; NewCookie; ; ; Argument[0..9]; Argument[this]; taint; manual | -nodes -| SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | semmle.label | "jwt_token" : String | -| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | -| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | semmle.label | tokenCookieStr : String | -| SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | semmle.label | jwtCookie | -| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | semmle.label | "token=" : String | -| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | semmle.label | ... + ... : String | -| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | semmle.label | ... + ... | -| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | semmle.label | new NewCookie(...) : NewCookie | -| SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | semmle.label | toString(...) | -| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | semmle.label | "session-access-key" : String | -| SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | semmle.label | new NewCookie(...) : NewCookie | -| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | semmle.label | "session-access-key" : String | -| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | semmle.label | accessKeyCookie : NewCookie | -| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | semmle.label | toString(...) : String | -| SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | semmle.label | keyStr | -| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | semmle.label | "token=" : String | -| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | semmle.label | ... + ... : String | -| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | semmle.label | ... + ... : String | -| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | semmle.label | secString | -| SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | semmle.label | "Presto-UI-Token" : String | -| SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | -| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | semmle.label | PRESTO_UI_COOKIE : String | -| SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | semmle.label | cookie : Cookie | -| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | semmle.label | createAuthenticationCookie(...) : Cookie | -| SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | semmle.label | cookie | -problems -| SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... | This sensitive cookie | -| SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" | This sensitive cookie | -subpaths diff --git a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java b/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java deleted file mode 100644 index 627575c8403..00000000000 --- a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java +++ /dev/null @@ -1,164 +0,0 @@ -import java.io.IOException; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.ServletException; - -import javax.ws.rs.core.NewCookie; - -import org.springframework.security.web.csrf.CsrfToken; - -class SensitiveCookieNotHttpOnly { - // GOOD - Tests adding a sensitive cookie with the `HttpOnly` flag set. - public void addCookie(String jwt_token, HttpServletRequest request, HttpServletResponse response) { - Cookie jwtCookie = new Cookie("jwt_token", jwt_token); - jwtCookie.setPath("/"); - jwtCookie.setMaxAge(3600*24*7); - jwtCookie.setHttpOnly(true); - response.addCookie(jwtCookie); - } - - // BAD - Tests adding a sensitive cookie without the `HttpOnly` flag set. - public void addCookie2(String jwt_token, String userId, HttpServletRequest request, HttpServletResponse response) { - String tokenCookieStr = "jwt_token"; - Cookie jwtCookie = new Cookie(tokenCookieStr, jwt_token); - Cookie userIdCookie = new Cookie("user_id", userId); - jwtCookie.setPath("/"); - userIdCookie.setPath("/"); - jwtCookie.setMaxAge(3600*24*7); - userIdCookie.setMaxAge(3600*24*7); - response.addCookie(jwtCookie); - response.addCookie(userIdCookie); - } - - // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set. - public void addCookie3(String authId, HttpServletRequest request, HttpServletResponse response) { - response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure"); - } - - // BAD - Tests set a sensitive cookie header without the `HttpOnly` flag set. - public void addCookie4(String authId, HttpServletRequest request, HttpServletResponse response) { - response.addHeader("Set-Cookie", "token=" +authId + ";Secure"); - } - - // GOOD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through string concatenation. - public void addCookie5(String accessKey, HttpServletRequest request, HttpServletResponse response) { - response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true) + ";HttpOnly"); - } - - // BAD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. - public void addCookie6(String accessKey, HttpServletRequest request, HttpServletResponse response) { - response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true).toString()); - } - - // GOOD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through the constructor. - public void addCookie7(String accessKey, HttpServletRequest request, HttpServletResponse response) { - NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true); - response.setHeader("Set-Cookie", accessKeyCookie.toString()); - } - - // BAD - Tests set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. - public void addCookie8(String accessKey, HttpServletRequest request, HttpServletResponse response) { - NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, 0, null, 86400, true); - String keyStr = accessKeyCookie.toString(); - response.setHeader("Set-Cookie", keyStr); - } - - // BAD - Tests set a sensitive cookie header using a variable without the `HttpOnly` flag set. - public void addCookie9(String authId, HttpServletRequest request, HttpServletResponse response) { - String secString = "token=" +authId + ";Secure"; - response.addHeader("Set-Cookie", secString); - } - - // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set using `String.format(...)`. - public void addCookie10(HttpServletRequest request, HttpServletResponse response) { - response.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly", "sessionkey", request.getSession().getAttribute("sessionkey"))); - } - - public Cookie createHttpOnlyAuthenticationCookie(HttpServletRequest request, String jwt) { - String PRESTO_UI_COOKIE = "Presto-UI-Token"; - Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); - cookie.setHttpOnly(true); - cookie.setPath("/ui"); - return cookie; - } - - public Cookie createAuthenticationCookie(HttpServletRequest request, String jwt) { - String PRESTO_UI_COOKIE = "Presto-UI-Token"; - Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); - cookie.setPath("/ui"); - return cookie; - } - - public Cookie removeAuthenticationCookie(HttpServletRequest request, String jwt) { - String PRESTO_UI_COOKIE = "Presto-UI-Token"; - Cookie cookie = new Cookie(PRESTO_UI_COOKIE, jwt); - cookie.setPath("/ui"); - cookie.setMaxAge(0); - return cookie; - } - - // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set using a wrapper method. - public void addCookie11(HttpServletRequest request, HttpServletResponse response, String jwt) { - Cookie cookie = createHttpOnlyAuthenticationCookie(request, jwt); - response.addCookie(cookie); - } - - // BAD - Tests set a sensitive cookie header without the `HttpOnly` flag set using a wrapper method. - public void addCookie12(HttpServletRequest request, HttpServletResponse response, String jwt) { - Cookie cookie = createAuthenticationCookie(request, jwt); - response.addCookie(cookie); - } - - // GOOD - Tests remove a sensitive cookie header without the `HttpOnly` flag set using a wrapper method. - public void addCookie13(HttpServletRequest request, HttpServletResponse response, String jwt) { - Cookie cookie = removeAuthenticationCookie(request, jwt); - response.addCookie(cookie); - } - - private Cookie createCookie(String name, String value, Boolean httpOnly){ - Cookie cookie = null; - cookie = new Cookie(name, value); - cookie.setDomain("/"); - cookie.setHttpOnly(httpOnly); - - //for production https - cookie.setSecure(true); - - cookie.setMaxAge(60*60*24*30); - cookie.setPath("/"); - - return cookie; - } - - // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set through a boolean variable using a wrapper method. - public void addCookie14(HttpServletRequest request, HttpServletResponse response, String refreshToken) { - response.addCookie(createCookie("refresh_token", refreshToken, true)); - } - - // BAD (but not detected) - Tests set a sensitive cookie header with the `HttpOnly` flag not set through a boolean variable using a wrapper method. - // This example is missed because the `cookie.setHttpOnly` call in `createCookie` is thought to maybe set the HTTP-only flag, and the `cookie` - // object flows to this `addCookie` call. - public void addCookie15(HttpServletRequest request, HttpServletResponse response, String refreshToken) { - response.addCookie(createCookie("refresh_token", refreshToken, false)); - } - - // GOOD - CSRF token doesn't need to have the `HttpOnly` flag set. - public void addCsrfCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - // Spring put the CSRF token in session attribute "_csrf" - CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf"); - - // Send the cookie only if the token has changed - String actualToken = request.getHeader("X-CSRF-TOKEN"); - if (actualToken == null || !actualToken.equals(csrfToken.getToken())) { - // Session cookie that can be used by AngularJS - String pCookieName = "CSRF-TOKEN"; - Cookie cookie = new Cookie(pCookieName, csrfToken.getToken()); - cookie.setMaxAge(-1); - cookie.setHttpOnly(false); - cookie.setPath("/"); - response.addCookie(cookie); - } - } -} diff --git a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref b/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref deleted file mode 100644 index 9c7ce3d6329..00000000000 --- a/java/ql/test/experimental/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref +++ /dev/null @@ -1,2 +0,0 @@ -query: experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql -postprocess: utils/test/PrettyPrintModels.ql diff --git a/java/ql/test/experimental/query-tests/security/CWE-1004/options b/java/ql/test/experimental/query-tests/security/CWE-1004/options deleted file mode 100644 index 00e92689af5..00000000000 --- a/java/ql/test/experimental/query-tests/security/CWE-1004/options +++ /dev/null @@ -1 +0,0 @@ -// semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/servlet-api-2.4:${testdir}/../../../../stubs/jsr311-api-1.1.1:${testdir}/../../../../stubs/springframework-5.8.x From 1c542965459e1860a612a08e7ccac935571cb1d5 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 2 Oct 2025 10:42:23 +0100 Subject: [PATCH 58/82] Add change note --- .../src/change-notes/2025-10-02-http-only-cookie-promote.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/src/change-notes/2025-10-02-http-only-cookie-promote.md diff --git a/java/ql/src/change-notes/2025-10-02-http-only-cookie-promote.md b/java/ql/src/change-notes/2025-10-02-http-only-cookie-promote.md new file mode 100644 index 00000000000..ee9fe7527bd --- /dev/null +++ b/java/ql/src/change-notes/2025-10-02-http-only-cookie-promote.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* The `java/sensitive-cookie-not-httponly` query has been promoted from experimental to the main query pack. \ No newline at end of file From 696ec29dae5170c00e8dc3dfc928223e475b9a55 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 2 Oct 2025 14:37:02 +0100 Subject: [PATCH 59/82] Upgrade integration tests --- .../java/query-suite/java-security-and-quality.qls.expected | 1 + .../java/query-suite/java-security-extended.qls.expected | 1 + 2 files changed, 2 insertions(+) diff --git a/java/ql/integration-tests/java/query-suite/java-security-and-quality.qls.expected b/java/ql/integration-tests/java/query-suite/java-security-and-quality.qls.expected index f5470c463c3..7e4401bcce9 100644 --- a/java/ql/integration-tests/java/query-suite/java-security-and-quality.qls.expected +++ b/java/ql/integration-tests/java/query-suite/java-security-and-quality.qls.expected @@ -127,6 +127,7 @@ ql/java/ql/src/Security/CWE/CWE-094/JexlInjection.ql ql/java/ql/src/Security/CWE/CWE-094/MvelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/SpelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/TemplateInjection.ql +ql/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/Security/CWE/CWE-1104/MavenPomDependsOnBintray.ql ql/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql ql/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql diff --git a/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected b/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected index a3ebc029d28..6ebf204a1a8 100644 --- a/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected +++ b/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected @@ -113,6 +113,7 @@ ql/java/ql/src/Security/CWE/CWE-927/ImplicitPendingIntents.ql ql/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql ql/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql ql/java/ql/src/Security/CWE/CWE-940/AndroidIntentRedirection.ql +ql/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql ql/java/ql/src/Telemetry/ExternalLibraryUsage.ql ql/java/ql/src/Telemetry/ExtractorInformation.ql From 093b04f79f342ec0ea0e2d16597d270296d455ad Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 2 Oct 2025 15:31:26 +0100 Subject: [PATCH 60/82] Update comments --- .../Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql index 4eae5f1ee4e..d301adbcb99 100644 --- a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -14,9 +14,9 @@ * Sketch of the structure of this query: we track cookie names that appear to be sensitive * (e.g. `session` or `token`) to a `ServletResponse.addHeader(...)` or `.addCookie(...)` * method that does not set the `httpOnly` flag. Subsidiary configurations - * `MatchesHttpOnlyToRawHeaderConfiguration` and `SetHttpOnlyInCookieConfiguration` are used to establish + * `MatchesHttpOnlyToRawHeaderConfig` and `SetHttpOnlyInCookieConfig` are used to establish * when the `httpOnly` flag is likely to have been set, before configuration - * `MissingHttpOnlyConfiguration` establishes that a non-`httpOnly` cookie has a sensitive-seeming name. + * `MissingHttpOnlyConfig` establishes that a non-`httpOnly` cookie has a sensitive-seeming name. */ import java @@ -158,8 +158,8 @@ predicate setsHttpOnlyInNewCookie(ClassInstanceExpr cie) { /** * A taint configuration tracking flow from a sensitive cookie without the `HttpOnly` flag * set to its HTTP response. - * Tracks string literals containing sensitive names (`SensitiveNameExpr`), to an `addCookie` call (as a `Cookie` object) - * or an `addHeader` call (as a string) (`CookieResponseWithoutHttpOnly`). + * Tracks string literals containing sensitive names (`SensitiveCookieNameExpr`), to an `addCookie` call (as a `Cookie` object) + * or an `addHeader` call (as a string) (`CookieResponseWithoutHttpOnlySink`). * Passes through `Cookie` constructors and `toString` calls. */ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { From 9cb593b020ef82b81f879b7bca2c1ca670cd5890 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 9 Oct 2025 16:01:20 +0100 Subject: [PATCH 61/82] Update tests --- .../java-security-extended.qls.expected | 2 +- .../query-suite/not_included_in_qls.expected | 1 - .../SensitiveCookieNotHttpOnly.expected | 35 +++++++++++-------- .../CWE-1004/SensitiveCookieNotHttpOnly.qlref | 4 ++- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected b/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected index 6ebf204a1a8..b2981db13c2 100644 --- a/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected +++ b/java/ql/integration-tests/java/query-suite/java-security-extended.qls.expected @@ -30,6 +30,7 @@ ql/java/ql/src/Security/CWE/CWE-094/JexlInjection.ql ql/java/ql/src/Security/CWE/CWE-094/MvelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/SpelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/TemplateInjection.ql +ql/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/Security/CWE/CWE-1104/MavenPomDependsOnBintray.ql ql/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql ql/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql @@ -113,7 +114,6 @@ ql/java/ql/src/Security/CWE/CWE-927/ImplicitPendingIntents.ql ql/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql ql/java/ql/src/Security/CWE/CWE-927/SensitiveResultReceiver.ql ql/java/ql/src/Security/CWE/CWE-940/AndroidIntentRedirection.ql -ql/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql ql/java/ql/src/Telemetry/ExternalLibraryUsage.ql ql/java/ql/src/Telemetry/ExtractorInformation.ql diff --git a/java/ql/integration-tests/java/query-suite/not_included_in_qls.expected b/java/ql/integration-tests/java/query-suite/not_included_in_qls.expected index d1b6428ae22..1aa63644947 100644 --- a/java/ql/integration-tests/java/query-suite/not_included_in_qls.expected +++ b/java/ql/integration-tests/java/query-suite/not_included_in_qls.expected @@ -190,7 +190,6 @@ ql/java/ql/src/experimental/Security/CWE/CWE-094/ScriptInjection.ql ql/java/ql/src/experimental/Security/CWE/CWE-094/SpringImplicitViewManipulation.ql ql/java/ql/src/experimental/Security/CWE/CWE-094/SpringViewManipulation.ql ql/java/ql/src/experimental/Security/CWE/CWE-1004/InsecureTomcatConfig.ql -ql/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/experimental/Security/CWE/CWE-200/InsecureWebResourceResponse.ql ql/java/ql/src/experimental/Security/CWE/CWE-200/SensitiveAndroidFileLeak.ql ql/java/ql/src/experimental/Security/CWE/CWE-208/PossibleTimingAttackAgainstSignature.ql diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected index 71c73f3921e..f00a00c7258 100644 --- a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.expected @@ -11,26 +11,33 @@ | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | $@ doesn't have the HttpOnly flag set. | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | This sensitive cookie | edges | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | provenance | | -| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | provenance | Sink:MaD:46211 | +| SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:31:28:31:36 | jwtCookie | provenance | Sink:MaD:1 | | SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | Config | -| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | MaD:46217 | -| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:46212 | -| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:46212 | -| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | provenance | MaD:46260 Sink:MaD:46214 | -| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | provenance | MaD:46298 | +| SensitiveCookieNotHttpOnly.java:25:39:25:52 | tokenCookieStr : String | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | provenance | MaD:4 | +| SensitiveCookieNotHttpOnly.java:42:42:42:49 | "token=" : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:2 | +| SensitiveCookieNotHttpOnly.java:42:42:42:57 | ... + ... : String | SensitiveCookieNotHttpOnly.java:42:42:42:69 | ... + ... | provenance | Sink:MaD:2 | +| SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:52:42:52:124 | toString(...) | provenance | MaD:5 Sink:MaD:3 | +| SensitiveCookieNotHttpOnly.java:52:56:52:75 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:52:42:52:113 | new NewCookie(...) : NewCookie | provenance | MaD:6 | | SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | provenance | | -| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | provenance | MaD:46298 | -| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | provenance | MaD:46260 | -| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | provenance | Sink:MaD:46214 | -| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | -| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | -| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:46212 | +| SensitiveCookieNotHttpOnly.java:63:51:63:70 | "session-access-key" : String | SensitiveCookieNotHttpOnly.java:63:37:63:115 | new NewCookie(...) : NewCookie | provenance | MaD:6 | +| SensitiveCookieNotHttpOnly.java:64:25:64:39 | accessKeyCookie : NewCookie | SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | provenance | MaD:5 | +| SensitiveCookieNotHttpOnly.java:64:25:64:50 | toString(...) : String | SensitiveCookieNotHttpOnly.java:65:42:65:47 | keyStr | provenance | Sink:MaD:3 | +| SensitiveCookieNotHttpOnly.java:70:28:70:35 | "token=" : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | +| SensitiveCookieNotHttpOnly.java:70:28:70:43 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | +| SensitiveCookieNotHttpOnly.java:70:28:70:55 | ... + ... : String | SensitiveCookieNotHttpOnly.java:71:42:71:50 | secString | provenance | Sink:MaD:2 | | SensitiveCookieNotHttpOnly.java:88:35:88:51 | "Presto-UI-Token" : String | SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | provenance | | | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | provenance | | | SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | Config | -| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | MaD:46217 | +| SensitiveCookieNotHttpOnly.java:89:36:89:51 | PRESTO_UI_COOKIE : String | SensitiveCookieNotHttpOnly.java:89:25:89:57 | new Cookie(...) : Cookie | provenance | MaD:4 | | SensitiveCookieNotHttpOnly.java:91:16:91:21 | cookie : Cookie | SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | provenance | | -| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | provenance | Sink:MaD:46211 | +| SensitiveCookieNotHttpOnly.java:110:25:110:64 | createAuthenticationCookie(...) : Cookie | SensitiveCookieNotHttpOnly.java:111:28:111:33 | cookie | provenance | Sink:MaD:1 | +models +| 1 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | +| 2 | Sink: javax.servlet.http; HttpServletResponse; false; addHeader; ; ; Argument[0..1]; response-splitting; manual | +| 3 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | +| 4 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[0]; Argument[this]; taint; manual | +| 5 | Summary: javax.ws.rs.core; Cookie; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 6 | Summary: javax.ws.rs.core; NewCookie; false; NewCookie; ; ; Argument[0..9]; Argument[this]; taint; manual | nodes | SensitiveCookieNotHttpOnly.java:24:33:24:43 | "jwt_token" : String | semmle.label | "jwt_token" : String | | SensitiveCookieNotHttpOnly.java:25:28:25:64 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref index e3b99f6e685..fd347f0adf8 100644 --- a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.qlref @@ -1,2 +1,4 @@ query: Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file +postprocess: +- utils/test/InlineExpectationsTestQuery.ql +- utils/test/PrettyPrintModels.ql \ No newline at end of file From d9c76f258eae2e30afeb9144af3ea0c55336149e Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 13 Oct 2025 16:22:03 +0200 Subject: [PATCH 62/82] Rust: Add suggested model for `into_inner` for tuples --- .../rust/frameworks/actix-web.model.yml | 7 +- .../dataflow/sources/InlineFlow.expected | 424 +++++++++++------- .../dataflow/sources/web_frameworks.rs | 4 +- 3 files changed, 265 insertions(+), 170 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml index 8600336651a..4031b9bbe86 100644 --- a/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml @@ -10,4 +10,9 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["::into_inner", "Argument[self]", "ReturnValue", "taint", "manual"] \ No newline at end of file + - ["::into_inner", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::into_inner", "Argument[self]", "ReturnValue.Field[0]", "taint", "manual"] + - ["::into_inner", "Argument[self]", "ReturnValue.Field[1]", "taint", "manual"] + - ["::into_inner", "Argument[self]", "ReturnValue.Field[2]", "taint", "manual"] + - ["::into_inner", "Argument[self]", "ReturnValue.Field[3]", "taint", "manual"] + - ["::into_inner", "Argument[self]", "ReturnValue.Field[4]", "taint", "manual"] \ No newline at end of file diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index 79645730a80..e4b59a657e8 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -79,64 +79,67 @@ models | 78 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | | 79 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | | 80 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 81 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | -| 82 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 83 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 84 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 85 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 86 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 87 | Summary: ::new; Argument[0]; ReturnValue; value | -| 88 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 89 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 90 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 91 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 92 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 93 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 94 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 95 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 96 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 97 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 98 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 99 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 100 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 101 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 102 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 103 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 104 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | -| 105 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 106 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 107 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | -| 108 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 109 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 110 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 111 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 112 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 113 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | -| 114 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | -| 115 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 116 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 117 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 118 | Summary: ::lock; Argument[self]; ReturnValue; taint | -| 119 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 120 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 121 | Summary: ::as_path; Argument[self]; ReturnValue; value | -| 122 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 123 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 124 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 125 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 126 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | -| 127 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | -| 128 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +| 81 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[0]; taint | +| 82 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[1]; taint | +| 83 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[2]; taint | +| 84 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | +| 85 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 86 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 87 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 88 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 89 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 90 | Summary: ::new; Argument[0]; ReturnValue; value | +| 91 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 92 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 93 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 94 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 95 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 96 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 97 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 98 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 99 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 100 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 101 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 102 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 103 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 104 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 105 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 106 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 107 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | +| 108 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 109 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 110 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | +| 111 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 112 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 113 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 114 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 115 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 116 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | +| 117 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | +| 118 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 119 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 120 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 121 | Summary: ::lock; Argument[self]; ReturnValue; taint | +| 122 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 123 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 124 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 125 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 126 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 127 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 128 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 129 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | +| 130 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | +| 131 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | edges | test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:28 | | test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:29 | | test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | | | test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:28 | -| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:88 | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:91 | | test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | | | test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | | | test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:29 | -| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:85 | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:88 | | test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | | @@ -154,19 +157,19 @@ edges | test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | | | test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:23 | | test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:44 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:85 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:88 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | | | test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | | | test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:24 | | test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:44 | -| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:85 | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:88 | | test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | | | test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | | | test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:23 | | test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:44 | -| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:85 | -| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:92 | -| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:89 | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:88 | +| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:95 | +| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:92 | | test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | | | test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | | | test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:23 | @@ -176,45 +179,45 @@ edges | test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | | | test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | | | test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:25 | -| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:88 | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:91 | | test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | | | test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | | | test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:26 | -| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:88 | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:91 | | test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | | | test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | | | test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:27 | -| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:84 | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:87 | | test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | | | test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | | | test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | | test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | | -| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:99 | +| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:102 | | test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | | | test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | | | test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | | | test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:89 | -| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:99 | -| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:89 | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:92 | +| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:102 | +| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:92 | | test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | | | test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | | | test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:89 | -| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:100 | -| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:89 | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:92 | +| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:103 | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:92 | | test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | | | test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | | | test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:21 | -| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:89 | -| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:98 | -| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:89 | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:92 | +| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:101 | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:92 | | test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | | | test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | | | test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | | | test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | | -| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:97 | +| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:100 | | test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | | | test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | | | test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | | @@ -222,19 +225,19 @@ edges | test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | | | test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | | -| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:95 | +| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:98 | | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | | | test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | | | test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | | -| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:96 | -| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:96 | +| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:99 | +| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:99 | | test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:22 | | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | | | test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | | | test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | | | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | | | test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | | -| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:85 | +| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:88 | | test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | | | test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | | | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | | @@ -254,38 +257,38 @@ edges | test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:9 | | test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | | | test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:112 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:115 | | test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:111 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:114 | | test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | | | test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | | | test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | | test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:64 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:115 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:118 | | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | | | test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | | | test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | | | test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:117 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:120 | | test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:116 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:119 | | test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | | | test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | | | test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:118 | +| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:121 | | test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:119 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:122 | | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | | | test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | | | test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | | | test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:114 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:117 | | test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:113 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:116 | | test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | | | test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | | @@ -293,51 +296,51 @@ edges | test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | | test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:59 | | test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | | -| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:108 | +| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:111 | | test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | | | test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:110 | +| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:113 | | test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | | | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | | | test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | | | test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | | -| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:109 | +| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:112 | | test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | | | test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:110 | +| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:113 | | test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | | | test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | | | test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | | | test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:56 | | test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | | | test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:110 | +| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:113 | | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | | | test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | | | test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | | | test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:57 | | test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | | | test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:110 | +| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:113 | | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | | | test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | | -| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:107 | -| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:107 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:110 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:110 | | test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:58 | | test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | | | test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:110 | -| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:85 | -| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:89 | +| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:113 | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:88 | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:92 | | test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | | -| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:89 | +| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:92 | | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | | | test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:55 | | test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | | | test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:35 MaD:35 | -| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:110 | +| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:113 | | test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | | | test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:72 | | test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | @@ -394,43 +397,43 @@ edges | test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:67 | | test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | | | test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:123 | +| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:126 | | test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | | | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | | | test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | | | test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | | | test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | | -| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:122 | +| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:125 | | test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | | | test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:123 | +| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:126 | | test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | | | test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | | | test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | | | test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:69 | | test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | | | test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:123 | +| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:126 | | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | | | test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | | | test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | | | test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:70 | | test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | | | test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:123 | +| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:126 | | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | | | test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | | -| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:125 | -| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:125 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:128 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:128 | | test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:71 | | test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | | | test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:123 | +| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:126 | | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | | | test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | | -| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:85 | +| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:88 | | test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | | | test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | | | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | | @@ -439,13 +442,13 @@ edges | test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:68 | | test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | | | test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:39 MaD:39 | -| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:123 | -| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:124 | -| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:124 | +| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:126 | +| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:127 | +| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:127 | | test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | | | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | | | test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | | -| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:85 | +| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:88 | | test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | | | test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | | | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | | @@ -478,7 +481,7 @@ edges | test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:11 MaD:11 | | test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:42 | | test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:42 | -| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:121 | +| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:124 | | test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | | | test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:42 | | test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | | @@ -517,15 +520,15 @@ edges | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | | | test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | | | test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:102 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:105 | | test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:101 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:104 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:107 | | test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:64 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:103 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:106 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:106 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:109 | | test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:105 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:108 | | test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:63 | | test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:59 | | test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:12 | @@ -547,30 +550,30 @@ edges | test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | | | test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | | | test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:102 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:105 | | test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:101 | -| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:89 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:92 | | test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | | | test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | | | test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:102 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:105 | | test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:101 | -| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:89 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:92 | | test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | | | test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | | | test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:102 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:105 | | test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:101 | -| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:89 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:92 | | test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | | | test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:13 | | test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | | @@ -681,7 +684,7 @@ edges | test.rs:673:35:673:40 | [post] buffer | test.rs:674:15:674:20 | buffer | provenance | | | test.rs:674:15:674:20 | buffer | test.rs:674:14:674:20 | &buffer | provenance | | | test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:62 | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:120 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:123 | | test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:14 | | test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | | | test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | | @@ -696,14 +699,14 @@ edges | test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:56 | | test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:66 | | test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | | -| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:110 | +| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:113 | | test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | | | test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | | | test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:126 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:129 | | test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:72 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:127 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:128 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:130 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:131 | | test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:20 | | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | | | test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | | @@ -741,14 +744,14 @@ edges | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | | | test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | | | test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | | -| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:93 | +| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:96 | | test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:86 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:87 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:89 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:90 | | test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | | | test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | @@ -786,7 +789,7 @@ edges | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:53 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:54 | | test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | | -| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:94 | +| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:97 | | test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | | | test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | | | test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | @@ -794,8 +797,8 @@ edges | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:86 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:87 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:89 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:90 | | test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | | test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | @@ -810,8 +813,8 @@ edges | test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:86 | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:87 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:89 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:90 | | test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | | @@ -827,8 +830,8 @@ edges | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | test_futures_io.rs:91:15:91:20 | pinned [&ref] | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:86 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:87 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:89 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:90 | | test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | @@ -849,8 +852,8 @@ edges | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:45 | | test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:86 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:87 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:89 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:90 | | test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | | test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | @@ -879,46 +882,103 @@ edges | test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:91 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:91 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:94 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:90 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:90 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:93 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:91 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:91 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:90 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:90 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:93 | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | -| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() | provenance | MaD:81 | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() | provenance | MaD:84 | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.0] | provenance | MaD:81 | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.1] | provenance | MaD:82 | +| web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.2] | provenance | MaD:83 | | web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:14 | a | provenance | | -| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:91 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | | web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:14 | a | provenance | | -| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:90 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | | web_frameworks.rs:100:13:100:13 | a | web_frameworks.rs:103:14:103:14 | a | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:101:14:101:14 | a [tuple.0] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:102:14:102:14 | a [tuple.0] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | web_frameworks.rs:103:14:103:14 | a | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:101:14:101:14 | a [tuple.1] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:102:14:102:14 | a [tuple.1] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | web_frameworks.rs:103:14:103:14 | a | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:101:14:101:14 | a [tuple.2] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:102:14:102:14 | a [tuple.2] | provenance | | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | web_frameworks.rs:103:14:103:14 | a | provenance | | | web_frameworks.rs:100:17:100:33 | path.into_inner() | web_frameworks.rs:100:13:100:13 | a | provenance | | -| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:83 | -| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:91 | -| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:82 | -| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:90 | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.0] | web_frameworks.rs:100:13:100:13 | a [tuple.0] | provenance | | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.1] | web_frameworks.rs:100:13:100:13 | a [tuple.1] | provenance | | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.2] | web_frameworks.rs:100:13:100:13 | a [tuple.2] | provenance | | +| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:101:14:101:14 | a | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:101:14:101:14 | a [tuple.0] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:101:14:101:14 | a [tuple.0] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:101:14:101:14 | a [tuple.1] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:101:14:101:14 | a [tuple.1] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:101:14:101:14 | a [tuple.2] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:101:14:101:14 | a [tuple.2] | web_frameworks.rs:101:14:101:23 | a.as_str() | provenance | MaD:94 | +| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:102:14:102:14 | a | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:102:14:102:14 | a [tuple.0] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:102:14:102:14 | a [tuple.0] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:102:14:102:14 | a [tuple.1] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:102:14:102:14 | a [tuple.1] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:102:14:102:14 | a [tuple.2] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:102:14:102:14 | a [tuple.2] | web_frameworks.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:93 | +| web_frameworks.rs:109:9:109:41 | ...: ...::Path::<...> | web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.0] | provenance | MaD:81 | +| web_frameworks.rs:109:9:109:41 | ...: ...::Path::<...> | web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.1] | provenance | MaD:82 | +| web_frameworks.rs:111:13:111:18 | TuplePat [tuple.0] | web_frameworks.rs:111:14:111:14 | a | provenance | | +| web_frameworks.rs:111:13:111:18 | TuplePat [tuple.1] | web_frameworks.rs:111:17:111:17 | b | provenance | | +| web_frameworks.rs:111:14:111:14 | a | web_frameworks.rs:113:14:113:14 | a | provenance | | +| web_frameworks.rs:111:17:111:17 | b | web_frameworks.rs:114:14:114:14 | b | provenance | | +| web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.0] | web_frameworks.rs:111:13:111:18 | TuplePat [tuple.0] | provenance | | +| web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.1] | web_frameworks.rs:111:13:111:18 | TuplePat [tuple.1] | provenance | | | web_frameworks.rs:127:5:127:20 | to | web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | provenance | Src:MaD:4 | -| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:33 | path.into_inner() | provenance | MaD:81 | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:33 | path.into_inner() | provenance | MaD:84 | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.0] | provenance | MaD:81 | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.1] | provenance | MaD:82 | +| web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.2] | provenance | MaD:83 | | web_frameworks.rs:131:13:131:13 | a | web_frameworks.rs:132:14:132:14 | a | provenance | | +| web_frameworks.rs:131:13:131:13 | a [tuple.0] | web_frameworks.rs:132:14:132:14 | a | provenance | | +| web_frameworks.rs:131:13:131:13 | a [tuple.1] | web_frameworks.rs:132:14:132:14 | a | provenance | | +| web_frameworks.rs:131:13:131:13 | a [tuple.2] | web_frameworks.rs:132:14:132:14 | a | provenance | | | web_frameworks.rs:131:17:131:33 | path.into_inner() | web_frameworks.rs:131:13:131:13 | a | provenance | | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.0] | web_frameworks.rs:131:13:131:13 | a [tuple.0] | provenance | | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.1] | web_frameworks.rs:131:13:131:13 | a [tuple.1] | provenance | | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.2] | web_frameworks.rs:131:13:131:13 | a [tuple.2] | provenance | | | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | provenance | Src:MaD:5 | +| web_frameworks.rs:140:45:140:46 | to | web_frameworks.rs:109:9:109:41 | ...: ...::Path::<...> | provenance | Src:MaD:5 | | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:242:38:242:46 | ...: String | provenance | Src:MaD:2 | | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:242:38:242:46 | ...: String | provenance | Src:MaD:2 | | web_frameworks.rs:242:38:242:46 | ...: String | web_frameworks.rs:244:18:244:18 | a | provenance | | @@ -1713,18 +1773,46 @@ nodes | web_frameworks.rs:70:14:70:14 | a | semmle.label | a | | web_frameworks.rs:98:9:98:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | web_frameworks.rs:100:13:100:13 | a | semmle.label | a | +| web_frameworks.rs:100:13:100:13 | a [tuple.0] | semmle.label | a [tuple.0] | +| web_frameworks.rs:100:13:100:13 | a [tuple.1] | semmle.label | a [tuple.1] | +| web_frameworks.rs:100:13:100:13 | a [tuple.2] | semmle.label | a [tuple.2] | | web_frameworks.rs:100:17:100:33 | path.into_inner() | semmle.label | path.into_inner() | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | +| web_frameworks.rs:100:17:100:33 | path.into_inner() [tuple.2] | semmle.label | path.into_inner() [tuple.2] | | web_frameworks.rs:101:14:101:14 | a | semmle.label | a | +| web_frameworks.rs:101:14:101:14 | a [tuple.0] | semmle.label | a [tuple.0] | +| web_frameworks.rs:101:14:101:14 | a [tuple.1] | semmle.label | a [tuple.1] | +| web_frameworks.rs:101:14:101:14 | a [tuple.2] | semmle.label | a [tuple.2] | | web_frameworks.rs:101:14:101:23 | a.as_str() | semmle.label | a.as_str() | | web_frameworks.rs:102:14:102:14 | a | semmle.label | a | +| web_frameworks.rs:102:14:102:14 | a [tuple.0] | semmle.label | a [tuple.0] | +| web_frameworks.rs:102:14:102:14 | a [tuple.1] | semmle.label | a [tuple.1] | +| web_frameworks.rs:102:14:102:14 | a [tuple.2] | semmle.label | a [tuple.2] | | web_frameworks.rs:102:14:102:25 | a.as_bytes() | semmle.label | a.as_bytes() | | web_frameworks.rs:103:14:103:14 | a | semmle.label | a | +| web_frameworks.rs:109:9:109:41 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| web_frameworks.rs:111:13:111:18 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | +| web_frameworks.rs:111:13:111:18 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | +| web_frameworks.rs:111:14:111:14 | a | semmle.label | a | +| web_frameworks.rs:111:17:111:17 | b | semmle.label | b | +| web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | +| web_frameworks.rs:111:22:111:38 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | +| web_frameworks.rs:113:14:113:14 | a | semmle.label | a | +| web_frameworks.rs:114:14:114:14 | b | semmle.label | b | | web_frameworks.rs:127:5:127:20 | to | semmle.label | to | | web_frameworks.rs:129:9:129:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | web_frameworks.rs:131:13:131:13 | a | semmle.label | a | +| web_frameworks.rs:131:13:131:13 | a [tuple.0] | semmle.label | a [tuple.0] | +| web_frameworks.rs:131:13:131:13 | a [tuple.1] | semmle.label | a [tuple.1] | +| web_frameworks.rs:131:13:131:13 | a [tuple.2] | semmle.label | a [tuple.2] | | web_frameworks.rs:131:17:131:33 | path.into_inner() | semmle.label | path.into_inner() | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | +| web_frameworks.rs:131:17:131:33 | path.into_inner() [tuple.2] | semmle.label | path.into_inner() [tuple.2] | | web_frameworks.rs:132:14:132:14 | a | semmle.label | a | | web_frameworks.rs:139:41:139:42 | to | semmle.label | to | +| web_frameworks.rs:140:45:140:46 | to | semmle.label | to | | web_frameworks.rs:242:33:242:35 | map | semmle.label | map | | web_frameworks.rs:242:33:242:35 | map | semmle.label | map | | web_frameworks.rs:242:38:242:46 | ...: String | semmle.label | ...: String | @@ -1891,6 +1979,8 @@ testFailures | web_frameworks.rs:101:14:101:23 | a.as_str() | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:101:14:101:23 | a.as_str() | $@ | web_frameworks.rs:139:41:139:42 | to | to | | web_frameworks.rs:102:14:102:25 | a.as_bytes() | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:102:14:102:25 | a.as_bytes() | $@ | web_frameworks.rs:139:41:139:42 | to | to | | web_frameworks.rs:103:14:103:14 | a | web_frameworks.rs:139:41:139:42 | to | web_frameworks.rs:103:14:103:14 | a | $@ | web_frameworks.rs:139:41:139:42 | to | to | +| web_frameworks.rs:113:14:113:14 | a | web_frameworks.rs:140:45:140:46 | to | web_frameworks.rs:113:14:113:14 | a | $@ | web_frameworks.rs:140:45:140:46 | to | to | +| web_frameworks.rs:114:14:114:14 | b | web_frameworks.rs:140:45:140:46 | to | web_frameworks.rs:114:14:114:14 | b | $@ | web_frameworks.rs:140:45:140:46 | to | to | | web_frameworks.rs:132:14:132:14 | a | web_frameworks.rs:127:5:127:20 | to | web_frameworks.rs:132:14:132:14 | a | $@ | web_frameworks.rs:127:5:127:20 | to | to | | web_frameworks.rs:244:18:244:18 | a | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:244:18:244:18 | a | $@ | web_frameworks.rs:242:33:242:35 | map | map | | web_frameworks.rs:244:18:244:18 | a | web_frameworks.rs:242:33:242:35 | map | web_frameworks.rs:244:18:244:18 | a | $@ | web_frameworks.rs:242:33:242:35 | map | map | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs index e5ce0f313ae..3bcea0dee4e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks.rs @@ -110,8 +110,8 @@ mod actix_test { ) -> String { let (a, b) = path.into_inner(); - sink(a); // $ MISSING: hasTaintFlow - sink(b); // $ MISSING: hasTaintFlow + sink(a); // $ hasTaintFlow=my_actix_handler_2 + sink(b); // $ hasTaintFlow=my_actix_handler_2 "".to_string() } From 1d7ccb6f2bc56ff97933cfff5de61e0bd9b5cb29 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:42:36 +0100 Subject: [PATCH 63/82] Update rust/ql/lib/codeql/rust/frameworks/mysql.model.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- rust/ql/lib/codeql/rust/frameworks/mysql.model.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml index da3ee84a779..55a3cf7ee72 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml @@ -13,5 +13,4 @@ extensions: - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - ["<_ as mysql::conn::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"] - ["<_ as mysql::conn::queryable::Queryable>::query_map_opt", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] From 35f3fbf357dbee9729739a919f19c76ab30d8bec Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:14:12 +0100 Subject: [PATCH 64/82] Rust: Accept consistency regressions. --- .../PathResolutionConsistency.expected | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index fe1822bb82c..bd49309c55a 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -1,4 +1,57 @@ multipleCallTargets +| mysql.rs:13:105:13:120 | ...::from(...) | +| mysql.rs:14:26:14:85 | ...::from(...) | +| mysql.rs:15:28:15:81 | ...::from(...) | +| mysql.rs:16:30:16:83 | ...::from(...) | +| mysql.rs:19:39:19:57 | safe_query.as_str() | +| mysql.rs:22:39:22:59 | unsafe_query.as_str() | +| mysql.rs:23:65:23:85 | unsafe_query.as_str() | +| mysql.rs:24:25:24:45 | unsafe_query.as_str() | +| mysql.rs:25:40:25:60 | unsafe_query.as_str() | +| mysql.rs:26:65:26:85 | unsafe_query.as_str() | +| mysql.rs:27:33:27:53 | unsafe_query.as_str() | +| mysql.rs:28:37:28:57 | unsafe_query.as_str() | +| mysql.rs:29:33:29:53 | unsafe_query.as_str() | +| mysql.rs:30:32:30:52 | unsafe_query.as_str() | +| mysql.rs:31:36:31:56 | unsafe_query.as_str() | +| mysql.rs:32:40:32:60 | unsafe_query.as_str() | +| mysql.rs:35:30:35:52 | prepared_query.as_str() | +| mysql.rs:36:46:36:67 | remote_string.as_str() | +| mysql.rs:37:72:37:93 | remote_string.as_str() | +| mysql.rs:38:46:38:67 | remote_string.as_str() | +| mysql.rs:39:33:39:54 | remote_string.as_str() | +| mysql.rs:40:47:40:68 | remote_string.as_str() | +| mysql.rs:41:73:41:94 | remote_string.as_str() | +| mysql.rs:42:40:42:61 | remote_string.as_str() | +| mysql.rs:43:44:43:65 | remote_string.as_str() | +| mysql.rs:44:40:44:61 | remote_string.as_str() | +| mysql.rs:45:39:45:60 | remote_string.as_str() | +| mysql.rs:46:43:46:64 | remote_string.as_str() | +| mysql.rs:49:31:49:51 | unsafe_query.as_str() | +| mysql.rs:54:26:54:46 | unsafe_query.as_str() | +| mysql.rs:72:105:72:120 | ...::from(...) | +| mysql.rs:73:26:73:85 | ...::from(...) | +| mysql.rs:74:28:74:81 | ...::from(...) | +| mysql.rs:75:30:75:83 | ...::from(...) | +| mysql.rs:78:39:78:57 | safe_query.as_str() | +| mysql.rs:81:39:81:59 | unsafe_query.as_str() | +| mysql.rs:82:25:82:45 | unsafe_query.as_str() | +| mysql.rs:83:48:83:68 | unsafe_query.as_str() | +| mysql.rs:84:33:84:53 | unsafe_query.as_str() | +| mysql.rs:85:33:85:53 | unsafe_query.as_str() | +| mysql.rs:86:48:86:68 | unsafe_query.as_str() | +| mysql.rs:87:32:87:52 | unsafe_query.as_str() | +| mysql.rs:90:30:90:52 | prepared_query.as_str() | +| mysql.rs:91:46:91:67 | remote_string.as_str() | +| mysql.rs:92:46:92:67 | remote_string.as_str() | +| mysql.rs:93:33:93:54 | remote_string.as_str() | +| mysql.rs:94:55:94:76 | remote_string.as_str() | +| mysql.rs:95:40:95:61 | remote_string.as_str() | +| mysql.rs:96:40:96:61 | remote_string.as_str() | +| mysql.rs:97:70:97:91 | remote_string.as_str() | +| mysql.rs:98:39:98:60 | remote_string.as_str() | +| mysql.rs:101:31:101:51 | unsafe_query.as_str() | +| mysql.rs:106:26:106:46 | unsafe_query.as_str() | | sqlx.rs:46:24:46:44 | ...::from(...) | | sqlx.rs:47:56:47:76 | ...::from(...) | | sqlx.rs:48:97:48:117 | ...::from(...) | @@ -65,3 +118,14 @@ multipleCallTargets | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | | sqlx.rs:189:29:189:53 | prepared_query_1.as_str() | | sqlx.rs:202:57:202:85 | ...::from(...) | +multiplePathResolutions +| mysql.rs:6:37:6:74 | Result::<...> | +| mysql.rs:23:21:23:45 | Result::<...> | +| mysql.rs:26:17:26:41 | Result::<...> | +| mysql.rs:28:75:28:99 | Result::<...> | +| mysql.rs:31:63:31:87 | Result::<...> | +| mysql.rs:37:21:37:45 | Result::<...> | +| mysql.rs:41:17:41:41 | Result::<...> | +| mysql.rs:43:85:43:109 | Result::<...> | +| mysql.rs:46:73:46:97 | Result::<...> | +| mysql.rs:66:49:66:58 | Result::<...> | From 93eb7ce1af1808a1d6a92d06be51000e70e6cd8a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:28:40 +0100 Subject: [PATCH 65/82] Rust: Accept test changes following suggested edit. --- .../query-tests/security/CWE-089/SqlInjection.expected | 8 -------- 1 file changed, 8 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index cf5529c7a99..90dcc06d282 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,6 +1,5 @@ #select | mysql.rs:22:33:22:37 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:22:33:22:37 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:22:33:22:37 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:22:33:22:37 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:23:55:23:63 | query_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:23:55:23:63 | query_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:24:14:24:23 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:24:14:24:23 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:25:28:25:38 | query_first | mysql.rs:13:33:13:54 | ...::get | mysql.rs:25:28:25:38 | query_first | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | @@ -11,7 +10,6 @@ | mysql.rs:30:22:30:30 | query_map | mysql.rs:13:33:13:54 | ...::get | mysql.rs:30:22:30:30 | query_map | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:31:22:31:34 | query_map_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:31:22:31:34 | query_map_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:49:26:49:29 | prep | mysql.rs:13:33:13:54 | ...::get | mysql.rs:49:26:49:29 | prep | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:54:15:54:24 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:54:15:54:24 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | | mysql.rs:81:33:81:37 | query | mysql.rs:72:33:72:54 | ...::get | mysql.rs:81:33:81:37 | query | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | @@ -103,8 +101,6 @@ edges | mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | | mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | @@ -155,8 +151,6 @@ edges | mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | | mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | | mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | @@ -465,7 +459,6 @@ nodes | mysql.rs:15:85:15:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | mysql.rs:15:86:15:98 | remote_string | semmle.label | remote_string | | mysql.rs:22:33:22:37 | query | semmle.label | query | -| mysql.rs:22:33:22:37 | query | semmle.label | query | | mysql.rs:22:39:22:50 | unsafe_query | semmle.label | unsafe_query | | mysql.rs:22:39:22:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | @@ -506,7 +499,6 @@ nodes | mysql.rs:31:36:31:56 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:32:34:32:38 | query | semmle.label | query | -| mysql.rs:32:34:32:38 | query | semmle.label | query | | mysql.rs:32:40:32:51 | unsafe_query | semmle.label | unsafe_query | | mysql.rs:32:40:32:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | From 33542f7d40619a50556b3870186211e136c9cddf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 Oct 2025 09:30:24 +0000 Subject: [PATCH 66/82] Release preparation for version 2.23.3 --- actions/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/0.4.19.md | 3 +++ actions/ql/lib/codeql-pack.release.yml | 2 +- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/CHANGELOG.md | 4 ++++ .../ql/src/change-notes/released/0.6.11.md | 3 +++ actions/ql/src/codeql-pack.release.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 10 +++++++++ cpp/ql/lib/change-notes/2025-10-07-bmn-ga.md | 4 ---- .../6.0.0.md} | 13 +++++++---- cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 4 ++++ cpp/ql/src/change-notes/released/1.5.2.md | 3 +++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.50.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.50.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 9 ++++++++ .../2025-10-02-entity-locations.md | 4 ---- .../2025-10-07-entity-locations.md | 4 ---- .../2025-10-08-entity-locations.md | 4 ---- .../2025-10-10-entity-locations.md | 4 ---- csharp/ql/lib/change-notes/released/5.2.6.md | 8 +++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 4 ++++ csharp/ql/src/change-notes/released/1.4.2.md | 3 +++ csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.33.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 22 +++++++++++++++++++ .../change-notes/2025-09-19-api-changes.md | 5 ----- ...9-use-use-flow-proper-post-update-nodes.md | 4 ---- .../2025-09-30-fewer-safe-urls.md | 4 ---- ...lidated-url-redirection-struct-init-fix.md | 4 ---- ...02-writenode-writescomponent-deprecated.md | 4 ---- ...-sqlinjection-numericorbooleansanitizer.md | 4 ---- ...9-sanitize-simple-types-request-forgery.md | 4 ---- go/ql/lib/change-notes/released/5.0.0.md | 21 ++++++++++++++++++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.4.7.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 6 +++++ .../7.7.2.md} | 7 +++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.8.2.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/2.6.13.md | 3 +++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ++++ .../ql/src/change-notes/released/2.1.2.md | 3 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.33.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 6 +++++ .../4.0.17.md} | 7 +++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 4 ++++ python/ql/src/change-notes/released/1.6.7.md | 3 +++ python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++++ ruby/ql/lib/change-notes/released/5.1.1.md | 3 +++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.4.7.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/CHANGELOG.md | 10 +++++++++ .../2025-09-29-data-flow-function-pointer.md | 4 ---- .../ql/lib/change-notes/2025-10-07-rust-ga.md | 4 ---- rust/ql/lib/change-notes/released/0.1.18.md | 9 ++++++++ rust/ql/lib/codeql-pack.release.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/CHANGELOG.md | 6 +++++ .../0.1.18.md} | 7 +++--- rust/ql/src/codeql-pack.release.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/CHANGELOG.md | 4 ++++ .../concepts/change-notes/released/0.0.7.md | 3 +++ shared/concepts/codeql-pack.release.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.17.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++++ .../dataflow/change-notes/released/2.0.17.md | 3 +++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.33.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/quantum/CHANGELOG.md | 4 ++++ .../quantum/change-notes/released/0.0.11.md | 3 +++ shared/quantum/codeql-pack.release.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.33.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.33.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/2.0.9.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.33.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.33.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.33.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.14.md | 3 +++ shared/typeinference/codeql-pack.release.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.17.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.33.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.20.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.33.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.33.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 4 ++++ swift/ql/lib/change-notes/released/5.0.9.md | 3 +++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.2.7.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 178 files changed, 448 insertions(+), 152 deletions(-) create mode 100644 actions/ql/lib/change-notes/released/0.4.19.md create mode 100644 actions/ql/src/change-notes/released/0.6.11.md delete mode 100644 cpp/ql/lib/change-notes/2025-10-07-bmn-ga.md rename cpp/ql/lib/change-notes/{2025-09-18-guards.md => released/6.0.0.md} (65%) create mode 100644 cpp/ql/src/change-notes/released/1.5.2.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.50.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.50.md delete mode 100644 csharp/ql/lib/change-notes/2025-10-02-entity-locations.md delete mode 100644 csharp/ql/lib/change-notes/2025-10-07-entity-locations.md delete mode 100644 csharp/ql/lib/change-notes/2025-10-08-entity-locations.md delete mode 100644 csharp/ql/lib/change-notes/2025-10-10-entity-locations.md create mode 100644 csharp/ql/lib/change-notes/released/5.2.6.md create mode 100644 csharp/ql/src/change-notes/released/1.4.2.md create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.33.md delete mode 100644 go/ql/lib/change-notes/2025-09-19-api-changes.md delete mode 100644 go/ql/lib/change-notes/2025-09-19-use-use-flow-proper-post-update-nodes.md delete mode 100644 go/ql/lib/change-notes/2025-09-30-fewer-safe-urls.md delete mode 100644 go/ql/lib/change-notes/2025-10-02-unvalidated-url-redirection-struct-init-fix.md delete mode 100644 go/ql/lib/change-notes/2025-10-02-writenode-writescomponent-deprecated.md delete mode 100644 go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md delete mode 100644 go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md create mode 100644 go/ql/lib/change-notes/released/5.0.0.md create mode 100644 go/ql/src/change-notes/released/1.4.7.md rename java/ql/lib/change-notes/{2025-10-07-array-entrypointtype.md => released/7.7.2.md} (89%) create mode 100644 java/ql/src/change-notes/released/1.8.2.md create mode 100644 javascript/ql/lib/change-notes/released/2.6.13.md create mode 100644 javascript/ql/src/change-notes/released/2.1.2.md create mode 100644 misc/suite-helpers/change-notes/released/1.0.33.md rename python/ql/lib/change-notes/{2025-10-13-fix-importerror-on-python-3.14.md => released/4.0.17.md} (77%) create mode 100644 python/ql/src/change-notes/released/1.6.7.md create mode 100644 ruby/ql/lib/change-notes/released/5.1.1.md create mode 100644 ruby/ql/src/change-notes/released/1.4.7.md delete mode 100644 rust/ql/lib/change-notes/2025-09-29-data-flow-function-pointer.md delete mode 100644 rust/ql/lib/change-notes/2025-10-07-rust-ga.md create mode 100644 rust/ql/lib/change-notes/released/0.1.18.md rename rust/ql/src/change-notes/{2025-09-19-insecure-cookie.md => released/0.1.18.md} (78%) create mode 100644 shared/concepts/change-notes/released/0.0.7.md create mode 100644 shared/controlflow/change-notes/released/2.0.17.md create mode 100644 shared/dataflow/change-notes/released/2.0.17.md create mode 100644 shared/mad/change-notes/released/1.0.33.md create mode 100644 shared/quantum/change-notes/released/0.0.11.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.33.md create mode 100644 shared/regex/change-notes/released/1.0.33.md create mode 100644 shared/ssa/change-notes/released/2.0.9.md create mode 100644 shared/threat-models/change-notes/released/1.0.33.md create mode 100644 shared/tutorial/change-notes/released/1.0.33.md create mode 100644 shared/typeflow/change-notes/released/1.0.33.md create mode 100644 shared/typeinference/change-notes/released/0.0.14.md create mode 100644 shared/typetracking/change-notes/released/2.0.17.md create mode 100644 shared/typos/change-notes/released/1.0.33.md create mode 100644 shared/util/change-notes/released/2.0.20.md create mode 100644 shared/xml/change-notes/released/1.0.33.md create mode 100644 shared/yaml/change-notes/released/1.0.33.md create mode 100644 swift/ql/lib/change-notes/released/5.0.9.md create mode 100644 swift/ql/src/change-notes/released/1.2.7.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index e6ae9a82059..3de5d186721 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.19 + +No user-facing changes. + ## 0.4.18 No user-facing changes. diff --git a/actions/ql/lib/change-notes/released/0.4.19.md b/actions/ql/lib/change-notes/released/0.4.19.md new file mode 100644 index 00000000000..fb592c5a34f --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.19.md @@ -0,0 +1,3 @@ +## 0.4.19 + +No user-facing changes. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 1a848f92899..abf63707906 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.18 +lastReleaseVersion: 0.4.19 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 80eecfca28d..06f67aa0be6 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.19-dev +version: 0.4.19 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 534ba89566b..4592fbb66da 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.11 + +No user-facing changes. + ## 0.6.10 No user-facing changes. diff --git a/actions/ql/src/change-notes/released/0.6.11.md b/actions/ql/src/change-notes/released/0.6.11.md new file mode 100644 index 00000000000..3c83e3ac112 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.11.md @@ -0,0 +1,3 @@ +## 0.6.11 + +No user-facing changes. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index c2eebb652b0..b73e74898d0 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.10 +lastReleaseVersion: 0.6.11 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 2de1276aa82..b758a0e68a1 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.11-dev +version: 0.6.11 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 0909c8e3c88..e227764cca0 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 6.0.0 + +### Breaking Changes + +* The "Guards" libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been totally rewritten to recognize many more guards. The API remains unchanged, but the `GuardCondition` class now extends `Element` instead of `Expr`. + +### New Features + +* The C/C++ "build-mode: none" support is now General Availability (GA). + ## 5.6.1 No user-facing changes. diff --git a/cpp/ql/lib/change-notes/2025-10-07-bmn-ga.md b/cpp/ql/lib/change-notes/2025-10-07-bmn-ga.md deleted file mode 100644 index dce0cabc38c..00000000000 --- a/cpp/ql/lib/change-notes/2025-10-07-bmn-ga.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* The C/C++ "build-mode: none" support is now General Availability (GA). diff --git a/cpp/ql/lib/change-notes/2025-09-18-guards.md b/cpp/ql/lib/change-notes/released/6.0.0.md similarity index 65% rename from cpp/ql/lib/change-notes/2025-09-18-guards.md rename to cpp/ql/lib/change-notes/released/6.0.0.md index a739df71471..5f5a355f594 100644 --- a/cpp/ql/lib/change-notes/2025-09-18-guards.md +++ b/cpp/ql/lib/change-notes/released/6.0.0.md @@ -1,4 +1,9 @@ ---- -category: breaking ---- -* The "Guards" libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been totally rewritten to recognize many more guards. The API remains unchanged, but the `GuardCondition` class now extends `Element` instead of `Expr`. \ No newline at end of file +## 6.0.0 + +### Breaking Changes + +* The "Guards" libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been totally rewritten to recognize many more guards. The API remains unchanged, but the `GuardCondition` class now extends `Element` instead of `Expr`. + +### New Features + +* The C/C++ "build-mode: none" support is now General Availability (GA). diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 2dcac412aa9..f8c4fa43ccb 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.6.1 +lastReleaseVersion: 6.0.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 435d013c47b..dadd68c23f5 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 5.6.2-dev +version: 6.0.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 39549ed1bdc..4b876310708 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.2 + +No user-facing changes. + ## 1.5.1 No user-facing changes. diff --git a/cpp/ql/src/change-notes/released/1.5.2.md b/cpp/ql/src/change-notes/released/1.5.2.md new file mode 100644 index 00000000000..384c27833f1 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.2.md @@ -0,0 +1,3 @@ +## 1.5.2 + +No user-facing changes. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index c5775c46013..7eb901bae56 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.5.1 +lastReleaseVersion: 1.5.2 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index f5193698fdb..f33aa8fc562 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.5.2-dev +version: 1.5.2 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index bcfd38e1494..7b4887608d9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.50 + +No user-facing changes. + ## 1.7.49 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.50.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.50.md new file mode 100644 index 00000000000..187bfe4d01f --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.50.md @@ -0,0 +1,3 @@ +## 1.7.50 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index fe16fdfefdc..dab079d6644 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.49 +lastReleaseVersion: 1.7.50 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 3c14c29940c..6ef84244308 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.50-dev +version: 1.7.50 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index bcfd38e1494..7b4887608d9 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.50 + +No user-facing changes. + ## 1.7.49 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.50.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.50.md new file mode 100644 index 00000000000..187bfe4d01f --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.50.md @@ -0,0 +1,3 @@ +## 1.7.50 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index fe16fdfefdc..dab079d6644 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.49 +lastReleaseVersion: 1.7.50 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index efb3216f3b9..16479e216b3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.50-dev +version: 1.7.50 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 095eab5cdba..a722d924f3b 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,12 @@ +## 5.2.6 + +### Minor Analysis Improvements + +* The extraction of location information for parameters, fields, constructors, destructors and user operators has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. +* The extraction of location information for type parameters and tuples types has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. +* The extraction of location information for named types (classes, structs, etc.) has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. +* The extraction of the location for bound generic entities (methods, accessors, indexers, properties, and events) has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. + ## 5.2.5 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/2025-10-02-entity-locations.md b/csharp/ql/lib/change-notes/2025-10-02-entity-locations.md deleted file mode 100644 index dd13aab6292..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-02-entity-locations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The extraction of the location for bound generic entities (methods, accessors, indexers, properties, and events) has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. diff --git a/csharp/ql/lib/change-notes/2025-10-07-entity-locations.md b/csharp/ql/lib/change-notes/2025-10-07-entity-locations.md deleted file mode 100644 index 44f36fe44c6..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-07-entity-locations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The extraction of location information for named types (classes, structs, etc.) has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. diff --git a/csharp/ql/lib/change-notes/2025-10-08-entity-locations.md b/csharp/ql/lib/change-notes/2025-10-08-entity-locations.md deleted file mode 100644 index a96afe07251..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-08-entity-locations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The extraction of location information for type parameters and tuples types has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. diff --git a/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md b/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md deleted file mode 100644 index 72aa663febe..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-10-entity-locations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The extraction of location information for parameters, fields, constructors, destructors and user operators has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. diff --git a/csharp/ql/lib/change-notes/released/5.2.6.md b/csharp/ql/lib/change-notes/released/5.2.6.md new file mode 100644 index 00000000000..54ef01bfbf8 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.2.6.md @@ -0,0 +1,8 @@ +## 5.2.6 + +### Minor Analysis Improvements + +* The extraction of location information for parameters, fields, constructors, destructors and user operators has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. +* The extraction of location information for type parameters and tuples types has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. +* The extraction of location information for named types (classes, structs, etc.) has been optimized. Previously, location information was extracted multiple times for each type when it was declared across multiple files. Now, the extraction context is respected during the extraction phase, ensuring locations are only extracted within the appropriate context. This change should be transparent to end-users but may improve extraction performance in some cases. +* The extraction of the location for bound generic entities (methods, accessors, indexers, properties, and events) has been optimized. Previously, location information was extracted multiple times for each bound generic. Now, only the location of the unbound generic declaration is extracted during the extraction phase, and the QL library explicitly reuses this location for all bound instances of the same generic. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 63222f8b4a0..1ac2b5309f2 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.2.5 +lastReleaseVersion: 5.2.6 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 2f92b5edafd..8dd6bc6ec10 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 5.2.6-dev +version: 5.2.6 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 7fa8992c49a..40ea9e3693a 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.2 + +No user-facing changes. + ## 1.4.1 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/released/1.4.2.md b/csharp/ql/src/change-notes/released/1.4.2.md new file mode 100644 index 00000000000..37be01f40d9 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.4.2.md @@ -0,0 +1,3 @@ +## 1.4.2 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 43ccf4467be..a76cacdf799 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.1 +lastReleaseVersion: 1.4.2 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index fad06a3e928..1ea66ed1c4e 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.4.2-dev +version: 1.4.2 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 331bb4c220e..102463df544 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.33.md b/go/ql/consistency-queries/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 70529ff4f90..d9d08c55e17 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.33-dev +version: 1.0.33 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index adf218a99e4..ce835278cb1 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,25 @@ +## 5.0.0 + +### Breaking Changes + +* The member predicate `writesField` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing a struct literal. A new member predicate `writesFieldPreUpdate` has been added for cases where this behaviour is not desired. +* The member predicate `writesElement` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing an array/slice/map literal. A new member predicate `writesElementPreUpdate` has been added for cases where this behaviour is not desired. + +### Deprecated APIs + +* The class `SqlInjection::NumericOrBooleanSanitizer` has been deprecated. Use `SimpleTypeSanitizer` from `semmle.go.security.Sanitizers` instead. +* The member predicate `writesComponent` on `DataFlow::Write` has been deprecated. Instead, use `writesFieldPreUpdate` and `writesElementPreUpdate`, or their new versions `writesField` and `writesElement`. + +### Major Analysis Improvements + +* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. + +### Minor Analysis Improvements + +* The query `go/request-forgery` will no longer report alerts when the user input is of a simple type, like a number or a boolean. +* For the query `go/unvalidated-url-redirection`, when untrusted data is assigned to the `Host` field of a `url.URL` struct, we consider the whole struct untrusted. We now also include the case when this happens during struct initialization, for example `&url.URL{Host: untrustedData}`. +* `go/unvalidated-url-redirection` and `go/request-forgery` have a shared notion of a safe URL, which is known to not be malicious. Some URLs which were incorrectly considered safe are now correctly considered unsafe. This may lead to more alerts for those two queries. + ## 4.3.5 No user-facing changes. diff --git a/go/ql/lib/change-notes/2025-09-19-api-changes.md b/go/ql/lib/change-notes/2025-09-19-api-changes.md deleted file mode 100644 index 071ec2719b3..00000000000 --- a/go/ql/lib/change-notes/2025-09-19-api-changes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: breaking ---- -* The member predicate `writesField` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing a struct literal. A new member predicate `writesFieldPreUpdate` has been added for cases where this behaviour is not desired. -* The member predicate `writesElement` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing an array/slice/map literal. A new member predicate `writesElementPreUpdate` has been added for cases where this behaviour is not desired. diff --git a/go/ql/lib/change-notes/2025-09-19-use-use-flow-proper-post-update-nodes.md b/go/ql/lib/change-notes/2025-09-19-use-use-flow-proper-post-update-nodes.md deleted file mode 100644 index 607f23dfb03..00000000000 --- a/go/ql/lib/change-notes/2025-09-19-use-use-flow-proper-post-update-nodes.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: majorAnalysis ---- -* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. diff --git a/go/ql/lib/change-notes/2025-09-30-fewer-safe-urls.md b/go/ql/lib/change-notes/2025-09-30-fewer-safe-urls.md deleted file mode 100644 index 5eeee51c4a3..00000000000 --- a/go/ql/lib/change-notes/2025-09-30-fewer-safe-urls.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* `go/unvalidated-url-redirection` and `go/request-forgery` have a shared notion of a safe URL, which is known to not be malicious. Some URLs which were incorrectly considered safe are now correctly considered unsafe. This may lead to more alerts for those two queries. diff --git a/go/ql/lib/change-notes/2025-10-02-unvalidated-url-redirection-struct-init-fix.md b/go/ql/lib/change-notes/2025-10-02-unvalidated-url-redirection-struct-init-fix.md deleted file mode 100644 index 9e5d5aa14a2..00000000000 --- a/go/ql/lib/change-notes/2025-10-02-unvalidated-url-redirection-struct-init-fix.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* For the query `go/unvalidated-url-redirection`, when untrusted data is assigned to the `Host` field of a `url.URL` struct, we consider the whole struct untrusted. We now also include the case when this happens during struct initialization, for example `&url.URL{Host: untrustedData}`. diff --git a/go/ql/lib/change-notes/2025-10-02-writenode-writescomponent-deprecated.md b/go/ql/lib/change-notes/2025-10-02-writenode-writescomponent-deprecated.md deleted file mode 100644 index 834266e36b9..00000000000 --- a/go/ql/lib/change-notes/2025-10-02-writenode-writescomponent-deprecated.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The member predicate `writesComponent` on `DataFlow::Write` has been deprecated. Instead, use `writesFieldPreUpdate` and `writesElementPreUpdate`, or their new versions `writesField` and `writesElement`. diff --git a/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md b/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md deleted file mode 100644 index 647d9a4332c..00000000000 --- a/go/ql/lib/change-notes/2025-10-09-deprecate-sqlinjection-numericorbooleansanitizer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The class `SqlInjection::NumericOrBooleanSanitizer` has been deprecated. Use `SimpleTypeSanitizer` from `semmle.go.security.Sanitizers` instead. diff --git a/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md b/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md deleted file mode 100644 index 1bbf8c7f88a..00000000000 --- a/go/ql/lib/change-notes/2025-10-09-sanitize-simple-types-request-forgery.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The query `go/request-forgery` will no longer report alerts when the user input is of a simple type, like a number or a boolean. diff --git a/go/ql/lib/change-notes/released/5.0.0.md b/go/ql/lib/change-notes/released/5.0.0.md new file mode 100644 index 00000000000..86947976280 --- /dev/null +++ b/go/ql/lib/change-notes/released/5.0.0.md @@ -0,0 +1,21 @@ +## 5.0.0 + +### Breaking Changes + +* The member predicate `writesField` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing a struct literal. A new member predicate `writesFieldPreUpdate` has been added for cases where this behaviour is not desired. +* The member predicate `writesElement` on `DataFlow::Write` now uses the post-update node for `base` when that is the node being updated, which is in all cases except initializing an array/slice/map literal. A new member predicate `writesElementPreUpdate` has been added for cases where this behaviour is not desired. + +### Deprecated APIs + +* The class `SqlInjection::NumericOrBooleanSanitizer` has been deprecated. Use `SimpleTypeSanitizer` from `semmle.go.security.Sanitizers` instead. +* The member predicate `writesComponent` on `DataFlow::Write` has been deprecated. Instead, use `writesFieldPreUpdate` and `writesElementPreUpdate`, or their new versions `writesField` and `writesElement`. + +### Major Analysis Improvements + +* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. + +### Minor Analysis Improvements + +* The query `go/request-forgery` will no longer report alerts when the user input is of a simple type, like a number or a boolean. +* For the query `go/unvalidated-url-redirection`, when untrusted data is assigned to the `Host` field of a `url.URL` struct, we consider the whole struct untrusted. We now also include the case when this happens during struct initialization, for example `&url.URL{Host: untrustedData}`. +* `go/unvalidated-url-redirection` and `go/request-forgery` have a shared notion of a safe URL, which is known to not be malicious. Some URLs which were incorrectly considered safe are now correctly considered unsafe. This may lead to more alerts for those two queries. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index d6a08512942..c9e54136ca5 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.3.5 +lastReleaseVersion: 5.0.0 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 20ace6482e4..2cc2dbe2906 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 4.3.6-dev +version: 5.0.0 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 65d6436fce3..eb370a8cddd 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.7 + +No user-facing changes. + ## 1.4.6 No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.4.7.md b/go/ql/src/change-notes/released/1.4.7.md new file mode 100644 index 00000000000..4f064ad746f --- /dev/null +++ b/go/ql/src/change-notes/released/1.4.7.md @@ -0,0 +1,3 @@ +## 1.4.7 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 3b00bbce928..163362bd632 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.6 +lastReleaseVersion: 1.4.7 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index c85a94a90f5..660386f898e 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.4.7-dev +version: 1.4.7 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 0e74414917b..5d6fcbde336 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.7.2 + +### Minor Analysis Improvements + +* Fields of certain objects are considered tainted if the object is tainted. This holds, for example, for objects that occur directly as sources in the active threat model (for instance, a remote flow source). This has now been amended to also include array types, such that if an array like `MyPojo[]` is a source, then fields of a tainted `MyPojo` are now also considered tainted. + ## 7.7.1 No user-facing changes. diff --git a/java/ql/lib/change-notes/2025-10-07-array-entrypointtype.md b/java/ql/lib/change-notes/released/7.7.2.md similarity index 89% rename from java/ql/lib/change-notes/2025-10-07-array-entrypointtype.md rename to java/ql/lib/change-notes/released/7.7.2.md index 45b898b6b2a..43d4f94b816 100644 --- a/java/ql/lib/change-notes/2025-10-07-array-entrypointtype.md +++ b/java/ql/lib/change-notes/released/7.7.2.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 7.7.2 + +### Minor Analysis Improvements + * Fields of certain objects are considered tainted if the object is tainted. This holds, for example, for objects that occur directly as sources in the active threat model (for instance, a remote flow source). This has now been amended to also include array types, such that if an array like `MyPojo[]` is a source, then fields of a tainted `MyPojo` are now also considered tainted. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index c94dbb3cd65..25c09b25d21 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.7.1 +lastReleaseVersion: 7.7.2 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index dabb65e61ce..2885944ca32 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 7.7.2-dev +version: 7.7.2 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 1e6df88fc31..06133dffeba 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.2 + +No user-facing changes. + ## 1.8.1 No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.8.2.md b/java/ql/src/change-notes/released/1.8.2.md new file mode 100644 index 00000000000..12e641fd720 --- /dev/null +++ b/java/ql/src/change-notes/released/1.8.2.md @@ -0,0 +1,3 @@ +## 1.8.2 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 28a7c123ae8..559af8348bb 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.1 +lastReleaseVersion: 1.8.2 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index b1ee0395fb2..0d507c46586 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.8.2-dev +version: 1.8.2 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 975d14e1098..1e874227c37 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.6.13 + +No user-facing changes. + ## 2.6.12 ### Minor Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.6.13.md b/javascript/ql/lib/change-notes/released/2.6.13.md new file mode 100644 index 00000000000..475bfb69be9 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.13.md @@ -0,0 +1,3 @@ +## 2.6.13 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 8b34428a845..9240f755da8 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.6.12 +lastReleaseVersion: 2.6.13 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index da942ea28a8..ca5e521255a 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.6.13-dev +version: 2.6.13 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 46aae437f77..f03b3a66e4d 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.2 + +No user-facing changes. + ## 2.1.1 No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/2.1.2.md b/javascript/ql/src/change-notes/released/2.1.2.md new file mode 100644 index 00000000000..6e72407c8c7 --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.1.2.md @@ -0,0 +1,3 @@ +## 2.1.2 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 576c2ea18d6..1a4e53e8772 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.1 +lastReleaseVersion: 2.1.2 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 2581f947629..2c79885b924 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.1.2-dev +version: 2.1.2 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 4cbaa48190d..a6f9fcd2377 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.33.md b/misc/suite-helpers/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 7715f68107e..537cf29a9df 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.33-dev +version: 1.0.33 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 070309c08a0..cb18c48a051 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 4.0.17 + +### Bug Fixes + +* The Python extractor no longer crashes with an `ImportError` when run using Python 3.14. + ## 4.0.16 ### Minor Analysis Improvements diff --git a/python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md b/python/ql/lib/change-notes/released/4.0.17.md similarity index 77% rename from python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md rename to python/ql/lib/change-notes/released/4.0.17.md index d2eefde0e11..561e2db6a31 100644 --- a/python/ql/lib/change-notes/2025-10-13-fix-importerror-on-python-3.14.md +++ b/python/ql/lib/change-notes/released/4.0.17.md @@ -1,4 +1,5 @@ ---- -category: fix ---- +## 4.0.17 + +### Bug Fixes + * The Python extractor no longer crashes with an `ImportError` when run using Python 3.14. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 916d99df3ad..d1339a1f762 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.16 +lastReleaseVersion: 4.0.17 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 35ab576bf1a..a7a4c26b565 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 4.0.17-dev +version: 4.0.17 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index e620dee4fca..aef1a87136d 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.7 + +No user-facing changes. + ## 1.6.6 ### Minor Analysis Improvements diff --git a/python/ql/src/change-notes/released/1.6.7.md b/python/ql/src/change-notes/released/1.6.7.md new file mode 100644 index 00000000000..aba3f8d9ff7 --- /dev/null +++ b/python/ql/src/change-notes/released/1.6.7.md @@ -0,0 +1,3 @@ +## 1.6.7 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index f8e54f30a67..0b49adeac7d 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.6 +lastReleaseVersion: 1.6.7 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 08336cbb3eb..2eb8d46c68c 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.6.7-dev +version: 1.6.7 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index a62232991b8..32e1dd3538b 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.1.1 + +No user-facing changes. + ## 5.1.0 ### New Features diff --git a/ruby/ql/lib/change-notes/released/5.1.1.md b/ruby/ql/lib/change-notes/released/5.1.1.md new file mode 100644 index 00000000000..28b0060cedc --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.1.1.md @@ -0,0 +1,3 @@ +## 5.1.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index dd8d287d010..dcb83eca6a3 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.1.0 +lastReleaseVersion: 5.1.1 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index a503103b95d..8791a8080ac 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.1.1-dev +version: 5.1.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 7811ea73f86..29a0f89236d 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.7 + +No user-facing changes. + ## 1.4.6 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.4.7.md b/ruby/ql/src/change-notes/released/1.4.7.md new file mode 100644 index 00000000000..4f064ad746f --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.4.7.md @@ -0,0 +1,3 @@ +## 1.4.7 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 3b00bbce928..163362bd632 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.6 +lastReleaseVersion: 1.4.7 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index a01acd1d674..87412b0fdd9 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.4.7-dev +version: 1.4.7 groups: - ruby - queries diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index ec04cd624a7..228d9c21637 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.1.18 + +### New Features + +* Rust analysis is now Generally Available (GA). + +### Minor Analysis Improvements + +* Improve data flow through functions being passed as function pointers. + ## 0.1.17 ### New Features diff --git a/rust/ql/lib/change-notes/2025-09-29-data-flow-function-pointer.md b/rust/ql/lib/change-notes/2025-09-29-data-flow-function-pointer.md deleted file mode 100644 index 7d1adb06e74..00000000000 --- a/rust/ql/lib/change-notes/2025-09-29-data-flow-function-pointer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Improve data flow through functions being passed as function pointers. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-10-07-rust-ga.md b/rust/ql/lib/change-notes/2025-10-07-rust-ga.md deleted file mode 100644 index f24f4f6e4c3..00000000000 --- a/rust/ql/lib/change-notes/2025-10-07-rust-ga.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Rust analysis is now Generally Available (GA). diff --git a/rust/ql/lib/change-notes/released/0.1.18.md b/rust/ql/lib/change-notes/released/0.1.18.md new file mode 100644 index 00000000000..539b38a1d9c --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.1.18.md @@ -0,0 +1,9 @@ +## 0.1.18 + +### New Features + +* Rust analysis is now Generally Available (GA). + +### Minor Analysis Improvements + +* Improve data flow through functions being passed as function pointers. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index eddeebba7bf..a9893ce82c4 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.17 +lastReleaseVersion: 0.1.18 diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 61c2ed8e81e..0c4fb2d1c44 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.1.18-dev +version: 0.1.18 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index 29117e66d4c..df1c4e49856 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.1.18 + +### New Queries + +* Added a new query, `rust/insecure-cookie`, to detect cookies created without the 'Secure' attribute. + ## 0.1.17 ### New Queries diff --git a/rust/ql/src/change-notes/2025-09-19-insecure-cookie.md b/rust/ql/src/change-notes/released/0.1.18.md similarity index 78% rename from rust/ql/src/change-notes/2025-09-19-insecure-cookie.md rename to rust/ql/src/change-notes/released/0.1.18.md index d84da707c43..8249024b145 100644 --- a/rust/ql/src/change-notes/2025-09-19-insecure-cookie.md +++ b/rust/ql/src/change-notes/released/0.1.18.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.1.18 + +### New Queries + * Added a new query, `rust/insecure-cookie`, to detect cookies created without the 'Secure' attribute. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index eddeebba7bf..a9893ce82c4 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.17 +lastReleaseVersion: 0.1.18 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 57d3e972fc6..ae14dfe6423 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.18-dev +version: 0.1.18 groups: - rust - queries diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index cfaa89c5ac2..f7d8dfad907 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.7 + +No user-facing changes. + ## 0.0.6 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.7.md b/shared/concepts/change-notes/released/0.0.7.md new file mode 100644 index 00000000000..84da6f18c42 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.7.md @@ -0,0 +1,3 @@ +## 0.0.7 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index cf398ce02aa..a2a5484910b 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.6 +lastReleaseVersion: 0.0.7 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 452f932edef..a22308185fe 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.7-dev +version: 0.0.7 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index df7e781268e..cb14761bb38 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.17 + +No user-facing changes. + ## 2.0.16 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.17.md b/shared/controlflow/change-notes/released/2.0.17.md new file mode 100644 index 00000000000..0ed1592726c --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.17.md @@ -0,0 +1,3 @@ +## 2.0.17 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index c10461a785c..a5f7c15c020 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.16 +lastReleaseVersion: 2.0.17 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 660b1e12512..6f34e533354 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.17-dev +version: 2.0.17 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 13be0b19eb2..99ee484c731 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.17 + +No user-facing changes. + ## 2.0.16 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.17.md b/shared/dataflow/change-notes/released/2.0.17.md new file mode 100644 index 00000000000..0ed1592726c --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.17.md @@ -0,0 +1,3 @@ +## 2.0.17 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index c10461a785c..a5f7c15c020 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.16 +lastReleaseVersion: 2.0.17 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 166ef444b22..d7cb0eefb90 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.0.17-dev +version: 2.0.17 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 9979556a421..eda9cf4ddb2 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.33.md b/shared/mad/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/mad/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index d9767452c27..74599911e75 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 1857b399fe8..d9dd6b6f2e2 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.11 + +No user-facing changes. + ## 0.0.10 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.11.md b/shared/quantum/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..19a2a55bd68 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.11.md @@ -0,0 +1,3 @@ +## 0.0.11 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index b740014e5ae..e679dc42092 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.10 +lastReleaseVersion: 0.0.11 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 7dfaa747962..d3100a4df45 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.11-dev +version: 0.0.11 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 50ea4c310f6..7a0776cf53c 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.33.md b/shared/rangeanalysis/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 85341d10420..b1d244dd813 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 830e0da6f28..2507f237ec0 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.33.md b/shared/regex/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/regex/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 72347bcd160..bbf599db62f 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 8e4b1482e78..cb33a2dd613 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.9 + +No user-facing changes. + ## 2.0.8 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.9.md b/shared/ssa/change-notes/released/2.0.9.md new file mode 100644 index 00000000000..b89eb98bbd9 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.9.md @@ -0,0 +1,3 @@ +## 2.0.9 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 7ffb2d9f65b..ce305265e33 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.8 +lastReleaseVersion: 2.0.9 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 3c1f3fe0278..ef8d64df57c 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.9-dev +version: 2.0.9 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 331bb4c220e..102463df544 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.33.md b/shared/threat-models/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index e28c5f26dd8..cc8146b434c 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.33-dev +version: 1.0.33 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 6f6d29c2504..e982f144f9c 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.33.md b/shared/tutorial/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 33dc89bc60c..fab2fc6fbfd 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index 592596c37d2..32d26faa9f4 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.33.md b/shared/typeflow/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 5d257b81fc6..9fc3902c6c0 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index 29ece641a7e..ad4781e2cbd 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.14 + +No user-facing changes. + ## 0.0.13 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.14.md b/shared/typeinference/change-notes/released/0.0.14.md new file mode 100644 index 00000000000..63b4d50ca45 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.14.md @@ -0,0 +1,3 @@ +## 0.0.14 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 044e54e4f7e..ca29e45d0a6 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.13 +lastReleaseVersion: 0.0.14 diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 5d8f8a6011f..36e5b63799a 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.14-dev +version: 0.0.14 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 6b132f75a55..a536c707303 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.17 + +No user-facing changes. + ## 2.0.16 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.17.md b/shared/typetracking/change-notes/released/2.0.17.md new file mode 100644 index 00000000000..0ed1592726c --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.17.md @@ -0,0 +1,3 @@ +## 2.0.17 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index c10461a785c..a5f7c15c020 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.16 +lastReleaseVersion: 2.0.17 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 6bc1e76cfb4..2dadf4b9085 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.17-dev +version: 2.0.17 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 2661fcc9308..979e0c24d1e 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.33.md b/shared/typos/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/typos/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index a045761cd92..ef9f5adb454 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 3ded7f7af70..0f0cdcc36ca 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.20 + +No user-facing changes. + ## 2.0.19 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.20.md b/shared/util/change-notes/released/2.0.20.md new file mode 100644 index 00000000000..6756bd5f6c1 --- /dev/null +++ b/shared/util/change-notes/released/2.0.20.md @@ -0,0 +1,3 @@ +## 2.0.20 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 4aecf1e1f86..cde101f3516 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.19 +lastReleaseVersion: 2.0.20 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 33bf4527cf0..b90f801666d 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.20-dev +version: 2.0.20 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 2c1d2132c7e..f0d7c829bfb 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.33.md b/shared/xml/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/xml/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 62fcccb2453..e1848171799 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 31243ec36be..2ca0a52f636 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.33 + +No user-facing changes. + ## 1.0.32 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.33.md b/shared/yaml/change-notes/released/1.0.33.md new file mode 100644 index 00000000000..3a65838479f --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.33.md @@ -0,0 +1,3 @@ +## 1.0.33 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 7bc5c51ba7b..914c722b5d9 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.32 +lastReleaseVersion: 1.0.33 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 6c49b5f27ba..203802df80a 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.33-dev +version: 1.0.33 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index eb3b3da9689..4b8852b6711 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.0.9 + +No user-facing changes. + ## 5.0.8 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/5.0.9.md b/swift/ql/lib/change-notes/released/5.0.9.md new file mode 100644 index 00000000000..5fca9bba5f7 --- /dev/null +++ b/swift/ql/lib/change-notes/released/5.0.9.md @@ -0,0 +1,3 @@ +## 5.0.9 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index c608aca6969..2b650f0b340 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.8 +lastReleaseVersion: 5.0.9 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 4ad0623d0f3..19753127baa 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 5.0.9-dev +version: 5.0.9 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index be2f79710a9..f3fe65f7bd8 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.7 + +No user-facing changes. + ## 1.2.6 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.2.7.md b/swift/ql/src/change-notes/released/1.2.7.md new file mode 100644 index 00000000000..99f957692ac --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.7.md @@ -0,0 +1,3 @@ +## 1.2.7 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 24962f7ba24..950e0645d4a 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.6 +lastReleaseVersion: 1.2.7 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index ea5431f192e..37771782a76 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.2.7-dev +version: 1.2.7 groups: - swift - queries From 9507ec08530d7f95679dbfe1d9032040d1073570 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 14 Oct 2025 11:09:43 +0100 Subject: [PATCH 67/82] Fix "be be" typos --- .../ql/src/experimental/Security/CWE-200/SecretExfiltration.ql | 2 +- go/ql/lib/CHANGELOG.md | 2 +- go/ql/lib/change-notes/released/5.0.0.md | 2 +- ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/actions/ql/src/experimental/Security/CWE-200/SecretExfiltration.ql b/actions/ql/src/experimental/Security/CWE-200/SecretExfiltration.ql index 2e583a98989..2b4ed1a30b4 100644 --- a/actions/ql/src/experimental/Security/CWE-200/SecretExfiltration.ql +++ b/actions/ql/src/experimental/Security/CWE-200/SecretExfiltration.ql @@ -19,5 +19,5 @@ import SecretExfiltrationFlow::PathGraph from SecretExfiltrationFlow::PathNode source, SecretExfiltrationFlow::PathNode sink where SecretExfiltrationFlow::flowPath(source, sink) select sink.getNode(), source, sink, - "Potential secret exfiltration in $@, which may be be leaked to an attacker-controlled resource.", + "Potential secret exfiltration in $@, which may be leaked to an attacker-controlled resource.", sink, sink.getNode().asExpr().(Expression).getRawExpression() diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index ce835278cb1..71d6bfdc60f 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -12,7 +12,7 @@ ### Major Analysis Improvements -* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. +* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. ### Minor Analysis Improvements diff --git a/go/ql/lib/change-notes/released/5.0.0.md b/go/ql/lib/change-notes/released/5.0.0.md index 86947976280..096e0b350bf 100644 --- a/go/ql/lib/change-notes/released/5.0.0.md +++ b/go/ql/lib/change-notes/released/5.0.0.md @@ -12,7 +12,7 @@ ### Major Analysis Improvements -* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. +* The shape of the Go data-flow graph has changed. Previously for code like `x := def(); use1(x); use2(x)`, there would be edges from the definition of `x` to each use. Now there is an edge from the definition to the first use, then another from the first use to the second, and so on. This means that data-flow barriers work differently - flow will not reach any uses after the barrier node. Where this is not desired it may be necessary to add an additional flow step to propagate the flow forward. Additionally, when a variable may be subject to a side-effect, such as updating an array, passing a pointer to a function that might write through it or writing to a field of a struct, there is now a dedicated post-update node representing the variable after this side-effect has taken place. Previously post-update nodes were aliases for either a variable's definition, or were equal to the pre-update node. This led to backwards steps in the data-flow graph, which could cause false positives. For example, in the previous code there would be an edge from `x` in `use2(x)` back to the definition of `x`. If we define our sources as any argument of `use2` and our sinks as any argument of `use1` then this would lead to a false positive path. Now there are distinct post-update nodes and no backwards edge to the definition, so we will not find this false positive path. ### Minor Analysis Improvements diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll index cef6cb4fa04..0342932a614 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll @@ -51,7 +51,7 @@ module Kernel { /** * Holds if `method` is a name of a private method in the `Kernel` module. - * These can be be invoked on `self`, on `Kernel`, or using a low-level primitive like `send` or `instance_eval`. + * These can be invoked on `self`, on `Kernel`, or using a low-level primitive like `send` or `instance_eval`. * ```ruby * puts "hello world" * Kernel.puts "hello world" From 9466279909e3392a6dc4b2e2480008dc45dce8e7 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 14 Oct 2025 11:10:42 +0100 Subject: [PATCH 68/82] Prefer code quotes for BMN --- cpp/ql/lib/CHANGELOG.md | 2 +- cpp/ql/lib/change-notes/released/6.0.0.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index e227764cca0..1c05251c8ce 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -6,7 +6,7 @@ ### New Features -* The C/C++ "build-mode: none" support is now General Availability (GA). +* The C/C++ `build-mode: none` support is now General Availability (GA). ## 5.6.1 diff --git a/cpp/ql/lib/change-notes/released/6.0.0.md b/cpp/ql/lib/change-notes/released/6.0.0.md index 5f5a355f594..b6eb7cef1f5 100644 --- a/cpp/ql/lib/change-notes/released/6.0.0.md +++ b/cpp/ql/lib/change-notes/released/6.0.0.md @@ -6,4 +6,4 @@ ### New Features -* The C/C++ "build-mode: none" support is now General Availability (GA). +* The C/C++ `build-mode: none` support is now General Availability (GA). From 17352a101d0e51551b6dcc0bee48a08e2ee7c87d Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 14 Oct 2025 11:13:23 +0100 Subject: [PATCH 69/82] Rephrase C++ BMN changelog note --- cpp/ql/lib/CHANGELOG.md | 2 +- cpp/ql/lib/change-notes/released/6.0.0.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 1c05251c8ce..093b31078e0 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -6,7 +6,7 @@ ### New Features -* The C/C++ `build-mode: none` support is now General Availability (GA). +* C/C++ `build-mode: none` support is now generally available. ## 5.6.1 diff --git a/cpp/ql/lib/change-notes/released/6.0.0.md b/cpp/ql/lib/change-notes/released/6.0.0.md index b6eb7cef1f5..574e05442ec 100644 --- a/cpp/ql/lib/change-notes/released/6.0.0.md +++ b/cpp/ql/lib/change-notes/released/6.0.0.md @@ -6,4 +6,4 @@ ### New Features -* The C/C++ `build-mode: none` support is now General Availability (GA). +* C/C++ `build-mode: none` support is now generally available. From 5310469d6958edd2f3fbb64e58f1b87a55004500 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 14 Oct 2025 11:33:01 +0100 Subject: [PATCH 70/82] Actions: Update `SecretExfiltration` output for typo fix --- .../query-tests/Security/CWE-200/SecretExfiltration.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/test/query-tests/Security/CWE-200/SecretExfiltration.expected b/actions/ql/test/query-tests/Security/CWE-200/SecretExfiltration.expected index 259746eaec9..59b58e03be7 100644 --- a/actions/ql/test/query-tests/Security/CWE-200/SecretExfiltration.expected +++ b/actions/ql/test/query-tests/Security/CWE-200/SecretExfiltration.expected @@ -3,4 +3,4 @@ nodes | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | subpaths #select -| .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | Potential secret exfiltration in $@, which may be be leaked to an attacker-controlled resource. | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | ${{ github.event.pull_request.title }} | +| .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | Potential secret exfiltration in $@, which may be leaked to an attacker-controlled resource. | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | ${{ github.event.pull_request.title }} | From b737bccb07b7b27b81b08b857aa329357ba0b1a2 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 14 Oct 2025 11:33:24 +0100 Subject: [PATCH 71/82] Python: Fix "be be" typos in qhelp --- .../CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp | 2 +- .../CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp index df9c073fcce..e61627c878f 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp @@ -16,7 +16,7 @@ If a superclass finalizer is called multiple times, this may lead to errors such cleaned up properly as expected.

    -

    There are a number of ways that a __del__ method may be be called more than once.

    +

    There are a number of ways that a __del__ method may be called more than once.

    • There may be more than one explicit call to the method in the hierarchy of __del__ methods.
    • In situations involving multiple inheritance, an finalization method may call the finalizers of each of its base types, diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp index d7060adef8d..e615144ff08 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp @@ -16,7 +16,7 @@ that it could be called multiple times. For example, it may set attributes to a values setting those attributes in a subclass.

      -

      There are a number of ways that an __init__ method may be be called more than once.

      +

      There are a number of ways that an __init__ method may be called more than once.

      • There may be more than one explicit call to the method in the hierarchy of __init__ methods.
      • In situations involving multiple inheritance, an initialization method may call the initializers of each of its base types, From 6dd07790acb3cdcdb20910c428bc53b9937017a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 Oct 2025 11:16:33 +0000 Subject: [PATCH 72/82] Post-release preparation for codeql-cli-2.23.3 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 41 files changed, 41 insertions(+), 41 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 06f67aa0be6..6423894239d 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.19 +version: 0.4.20-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index b758a0e68a1..553e579ceac 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.11 +version: 0.6.12-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index dadd68c23f5..8712e400897 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 6.0.0 +version: 6.0.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index f33aa8fc562..71aa95bed9e 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.5.2 +version: 1.5.3-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 6ef84244308..a569cf6a5c4 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.50 +version: 1.7.51-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 16479e216b3..d91f21b0e90 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.50 +version: 1.7.51-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 8dd6bc6ec10..92a08088be7 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 5.2.6 +version: 5.2.7-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 1ea66ed1c4e..a9776d058b9 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.4.2 +version: 1.4.3-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index d9d08c55e17..e44457e4570 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.33 +version: 1.0.34-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 2cc2dbe2906..bf2586d9089 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 5.0.0 +version: 5.0.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 660386f898e..3133d392d89 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.4.7 +version: 1.4.8-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 2885944ca32..7f8860bc632 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 7.7.2 +version: 7.7.3-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 0d507c46586..faf088b7a4a 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.8.2 +version: 1.8.3-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index ca5e521255a..1ee1c8c7815 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.6.13 +version: 2.6.14-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 2c79885b924..df854af7e2b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.1.2 +version: 2.1.3-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 537cf29a9df..daf9a60662d 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.33 +version: 1.0.34-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index a7a4c26b565..011afcb6844 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 4.0.17 +version: 4.0.18-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 2eb8d46c68c..d01829a9de2 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.6.7 +version: 1.6.8-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 8791a8080ac..77d07910f48 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.1.1 +version: 5.1.2-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 87412b0fdd9..b35ffb5c411 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.4.7 +version: 1.4.8-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 0c4fb2d1c44..b5dea62349a 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.1.18 +version: 0.1.19-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index ae14dfe6423..e72c44676d5 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.18 +version: 0.1.19-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index a22308185fe..c765cb33734 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.7 +version: 0.0.8-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 6f34e533354..c4f39f17484 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.17 +version: 2.0.18-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index d7cb0eefb90..afe273133cb 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.0.17 +version: 2.0.18-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 74599911e75..a132a76336b 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index d3100a4df45..201689efa51 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.11 +version: 0.0.12-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index b1d244dd813..90efb8ebbf3 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index bbf599db62f..2019d2dcb2e 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index ef8d64df57c..f1aa89319bd 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.9 +version: 2.0.10-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index cc8146b434c..69963387a05 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.33 +version: 1.0.34-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index fab2fc6fbfd..efe3820754f 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 9fc3902c6c0..70066fa9bd8 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 36e5b63799a..ae0880ec7ea 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.14 +version: 0.0.15-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 2dadf4b9085..9a68b0ae750 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.17 +version: 2.0.18-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index ef9f5adb454..71a4826016e 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index b90f801666d..69e188136fa 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.20 +version: 2.0.21-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index e1848171799..25135f830c6 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 203802df80a..4ba9cb06c57 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.33 +version: 1.0.34-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 19753127baa..18bddfe30bb 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 5.0.9 +version: 5.0.10-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 37771782a76..9e050de61b9 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.2.7 +version: 1.2.8-dev groups: - swift - queries From b6b376746097c81c9842afdab4ebbbbc7dfdac2d Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 14 Oct 2025 13:50:36 +0200 Subject: [PATCH 73/82] Swift: Make tracer config handle resource-dirs passed to clang --- swift/tools/tracing-config.lua | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/swift/tools/tracing-config.lua b/swift/tools/tracing-config.lua index b52c5f03a45..85a4d561ddf 100644 --- a/swift/tools/tracing-config.lua +++ b/swift/tools/tracing-config.lua @@ -57,17 +57,27 @@ function RegisterExtractorPack(id) -- xcodebuild does not always specify the -resource-dir in which case the compiler falls back -- to a resource-dir based on its path. We want to know what is the original resource-dir in - -- all cases so that we can patch it with out own + -- all cases so that we can patch it with out own. When we see a -resource-dir preceded by + -- -Xcc this will be a resource-dir that is passed to clang. We can still obtain the swift + -- resource-dir in this case by skipping over the -Xcc that follows it and stripping off the + -- clang suffix from the path. function find_original_resource_dir(compilerPath, args) - local resource_dir_index = indexOf(args, '-resource-dir') - if resource_dir_index and args[resource_dir_index + 1] then - return args[resource_dir_index + 1] - end - -- derive -resource-dir based on the compilerPath - -- e.g.: /usr/bin/swift-frontend -> /usr/bin/../lib/swift - local second_last_slash_index = string.find(compilerPath, "/[^/]*/[^/]*$") - local usr_dir = string.sub(compilerPath, 1, second_last_slash_index) - return usr_dir .. '/lib/swift' + local resource_dir_index = indexOf(args, '-resource-dir') + if resource_dir_index then + if args[resource_dir_index + 1] and args[resource_dir_index + 1] ~= '-Xcc' then + return args[resource_dir_index + 1] + elseif args[resource_dir_index + 2] then + local clang_index = string.find(args[resource_dir_index + 2], "/clang$") + if clang_index and clang_index - 1 > 0 then + return string.sub(args[resource_dir_index + 2], 1, clang_index - 1) + end + end + end + -- derive -resource-dir based on the compilerPath + -- e.g.: /usr/bin/swift-frontend -> /usr/bin/../lib/swift + local second_last_slash_index = string.find(compilerPath, "/[^/]*/[^/]*$") + local usr_dir = string.sub(compilerPath, 1, second_last_slash_index) + return usr_dir .. 'lib/swift' end -- replace or add our own resource directory From d8b37d0cde0ef12833b9641c929bbee1a81e92b5 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 14 Oct 2025 16:03:40 +0100 Subject: [PATCH 74/82] Review suggestions - update comments and description --- .../CWE-1004/SensitiveCookieNotHttpOnly.ql | 20 +++++++++++-------- .../CWE-1004/SensitiveCookieNotHttpOnly.java | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql index d301adbcb99..494e851a533 100644 --- a/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ b/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -1,10 +1,11 @@ /** * @name Sensitive cookies without the HttpOnly response header set - * @description Sensitive cookies without the 'HttpOnly' flag set leaves session cookies vulnerable to + * @description A sensitive cookie without the 'HttpOnly' flag set may be vulnerable to * an XSS attack. * @kind path-problem * @problem.severity warning - * @precision medium + * @precision high + * @security-severity 5.0 * @id java/sensitive-cookie-not-httponly * @tags security * external/cwe/cwe-1004 @@ -101,8 +102,9 @@ predicate removesCookie(MethodCall ma) { } /** - * A taint configuration tracking flow of a method that sets the `HttpOnly` flag, - * or one that removes a cookie, to a `ServletResponse.addCookie` call. + * A taint configuration tracking the flow of a cookie that has had the + * `HttpOnly` flag set, or has been removed, to a `ServletResponse.addCookie` + * call. */ module SetHttpOnlyOrRemovesCookieToAddCookieConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { @@ -120,8 +122,8 @@ module SetHttpOnlyOrRemovesCookieToAddCookieFlow = TaintTracking::Global; /** - * A cookie that is added to an HTTP response and which doesn't have `httpOnly` set, used as a sink - * in `MissingHttpOnlyConfiguration`. + * A cookie that is added to an HTTP response and which doesn't have `HttpOnly` set, used as a sink + * in `MissingHttpOnlyConfig`. */ class CookieResponseWithoutHttpOnlySink extends DataFlow::ExprNode { CookieResponseWithoutHttpOnlySink() { @@ -157,9 +159,11 @@ predicate setsHttpOnlyInNewCookie(ClassInstanceExpr cie) { /** * A taint configuration tracking flow from a sensitive cookie without the `HttpOnly` flag - * set to its HTTP response. + * set to an HTTP response. + * * Tracks string literals containing sensitive names (`SensitiveCookieNameExpr`), to an `addCookie` call (as a `Cookie` object) * or an `addHeader` call (as a string) (`CookieResponseWithoutHttpOnlySink`). + * * Passes through `Cookie` constructors and `toString` calls. */ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { @@ -169,7 +173,7 @@ module MissingHttpOnlyConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { // JAX-RS's `new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true)` and similar - // Cookie constructors, but barriers to considering the flow of the sensitive name, as httponly flag is set. + // Cookie constructors that set the `HttpOnly` flag are considered barriers to the flow of sensitive names. setsHttpOnlyInNewCookie(node.asExpr()) } diff --git a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java index a57a502336f..91f8f3ad4ce 100644 --- a/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java +++ b/java/ql/test/query-tests/security/CWE-1004/SensitiveCookieNotHttpOnly.java @@ -16,7 +16,7 @@ class SensitiveCookieNotHttpOnly { jwtCookie.setPath("/"); jwtCookie.setMaxAge(3600*24*7); jwtCookie.setHttpOnly(true); - response.addCookie(jwtCookie); + response.addCookie(jwtCookie); } // BAD - Tests adding a sensitive cookie without the `HttpOnly` flag set. @@ -29,7 +29,7 @@ class SensitiveCookieNotHttpOnly { jwtCookie.setMaxAge(3600*24*7); userIdCookie.setMaxAge(3600*24*7); response.addCookie(jwtCookie); // $Alert - response.addCookie(userIdCookie); + response.addCookie(userIdCookie); } // GOOD - Tests set a sensitive cookie header with the `HttpOnly` flag set. From e95e1a0386a85d7bb1d2777c147e1036c6766953 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 14 Oct 2025 16:27:28 +0100 Subject: [PATCH 75/82] Update integration test --- .../java/query-suite/java-code-scanning.qls.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/java/ql/integration-tests/java/query-suite/java-code-scanning.qls.expected b/java/ql/integration-tests/java/query-suite/java-code-scanning.qls.expected index afa6cebba31..dd67b7df413 100644 --- a/java/ql/integration-tests/java/query-suite/java-code-scanning.qls.expected +++ b/java/ql/integration-tests/java/query-suite/java-code-scanning.qls.expected @@ -21,6 +21,7 @@ ql/java/ql/src/Security/CWE/CWE-094/JexlInjection.ql ql/java/ql/src/Security/CWE/CWE-094/MvelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/SpelInjection.ql ql/java/ql/src/Security/CWE/CWE-094/TemplateInjection.ql +ql/java/ql/src/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql ql/java/ql/src/Security/CWE/CWE-1104/MavenPomDependsOnBintray.ql ql/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql ql/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql From 45e8164f14fc04725b8e6dda185b73debaefc2a0 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 15 Oct 2025 09:07:11 +0200 Subject: [PATCH 76/82] JS: remove quality tag from SyntaxError query --- .../query-suite/javascript-code-quality-extended.qls.expected | 1 - .../query-suite/javascript-code-quality.qls.expected | 1 - javascript/ql/src/LanguageFeatures/SyntaxError.ql | 3 +-- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/javascript/ql/integration-tests/query-suite/javascript-code-quality-extended.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-code-quality-extended.qls.expected index 1d2d3c1ff8c..c9407089189 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-code-quality-extended.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-code-quality-extended.qls.expected @@ -71,7 +71,6 @@ ql/javascript/ql/src/LanguageFeatures/SemicolonInsertion.ql ql/javascript/ql/src/LanguageFeatures/SetterReturn.ql ql/javascript/ql/src/LanguageFeatures/SpuriousArguments.ql ql/javascript/ql/src/LanguageFeatures/StrictModeCallStackIntrospection.ql -ql/javascript/ql/src/LanguageFeatures/SyntaxError.ql ql/javascript/ql/src/LanguageFeatures/TemplateSyntaxInStringLiteral.ql ql/javascript/ql/src/LanguageFeatures/ThisBeforeSuper.ql ql/javascript/ql/src/LanguageFeatures/UnusedIndexVariable.ql diff --git a/javascript/ql/integration-tests/query-suite/javascript-code-quality.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-code-quality.qls.expected index 6894a776b37..b550c2c8249 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-code-quality.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-code-quality.qls.expected @@ -63,7 +63,6 @@ ql/javascript/ql/src/LanguageFeatures/SemicolonInsertion.ql ql/javascript/ql/src/LanguageFeatures/SetterReturn.ql ql/javascript/ql/src/LanguageFeatures/SpuriousArguments.ql ql/javascript/ql/src/LanguageFeatures/StrictModeCallStackIntrospection.ql -ql/javascript/ql/src/LanguageFeatures/SyntaxError.ql ql/javascript/ql/src/LanguageFeatures/TemplateSyntaxInStringLiteral.ql ql/javascript/ql/src/LanguageFeatures/ThisBeforeSuper.ql ql/javascript/ql/src/LanguageFeatures/UnusedIndexVariable.ql diff --git a/javascript/ql/src/LanguageFeatures/SyntaxError.ql b/javascript/ql/src/LanguageFeatures/SyntaxError.ql index 0c9a69490f7..d4428c75774 100644 --- a/javascript/ql/src/LanguageFeatures/SyntaxError.ql +++ b/javascript/ql/src/LanguageFeatures/SyntaxError.ql @@ -4,8 +4,7 @@ * @kind problem * @problem.severity recommendation * @id js/syntax-error - * @tags quality - * reliability + * @tags reliability * correctness * language-features * @precision very-high From 9fc8faa0486f74368e026fc299d1eda803b328cb Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 15 Oct 2025 10:09:13 +0200 Subject: [PATCH 77/82] Swift: Address review comments --- swift/tools/tracing-config.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/swift/tools/tracing-config.lua b/swift/tools/tracing-config.lua index 85a4d561ddf..15effc0140b 100644 --- a/swift/tools/tracing-config.lua +++ b/swift/tools/tracing-config.lua @@ -62,14 +62,14 @@ function RegisterExtractorPack(id) -- resource-dir in this case by skipping over the -Xcc that follows it and stripping off the -- clang suffix from the path. function find_original_resource_dir(compilerPath, args) - local resource_dir_index = indexOf(args, '-resource-dir') - if resource_dir_index then - if args[resource_dir_index + 1] and args[resource_dir_index + 1] ~= '-Xcc' then - return args[resource_dir_index + 1] - elseif args[resource_dir_index + 2] then - local clang_index = string.find(args[resource_dir_index + 2], "/clang$") + local found = indexOf(args, '-resource-dir') + if found and args[found + 1] then + if args[found - 1] ~= '-Xcc' then + return args[found + 1] + elseif args[found + 1] == '-Xcc' and args[found + 2] then + local clang_index = string.find(args[found + 2], "/clang$") if clang_index and clang_index - 1 > 0 then - return string.sub(args[resource_dir_index + 2], 1, clang_index - 1) + return string.sub(args[found + 2], 1, clang_index - 1) end end end From 5544dfff6d4810f41c6a5c6ab634c3af21d55023 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:31:10 +0100 Subject: [PATCH 78/82] Update rust/ql/test/query-tests/security/CWE-089/mysql.rs Co-authored-by: Simon Friis Vindum --- rust/ql/test/query-tests/security/CWE-089/mysql.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 142dfc3aa9f..ccd739eb1ba 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -112,7 +112,7 @@ mod async_test fn main() { println!("test_mysql..."); - match (sync_test::test_mysql("")) { + match sync_test::test_mysql("") { Ok(_) => println!(" successful!"), Err(e) => println!(" error: {}", e), } From 28c139abfb82a16ca6e71d9869710f6de7d57132 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:41:11 +0100 Subject: [PATCH 79/82] Rust: Format the test. --- .../query-tests/security/CWE-089/mysql.rs | 122 ++++++++++++------ 1 file changed, 85 insertions(+), 37 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index ccd739eb1ba..323b8a2ab50 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -1,7 +1,6 @@ -mod sync_test -{ - use mysql::*; +mod sync_test { use mysql::prelude::*; + use mysql::*; pub fn test_mysql(url: &str) -> Result<(), Box> { // connect through a MySQL connection pool @@ -10,40 +9,67 @@ mod sync_test let mut conn2: Conn = pool.get_conn()?.unwrap(); // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ Source=remote10 + let mut remote_string = reqwest::blocking::get("http://example.com/") + .unwrap() + .text() + .unwrap_or(String::from("")); // $ Source=remote10 let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); - let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; + let unsafe_query = + String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution (safe) - let _ : Vec = conn.query(safe_query.as_str())?; // $ sql-sink + let _: Vec = conn.query(safe_query.as_str())?; // $ sql-sink // direct execution (unsafe) - let _ : Vec = conn.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec> = conn.query_opt(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _: Vec = conn.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _: Vec> = conn.query_opt(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 conn.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ : i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ : Result= conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 + let _: i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 + let _: Result = conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold_opt(unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_fold_opt( + unsafe_query.as_str(), + 0, + |_: i64, _: Result| -> i64 { 0 }, + )?; // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_iter(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map_opt(unsafe_query.as_str(), |_: Result| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ : Vec = conn2.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _ = conn.query_map_opt( + unsafe_query.as_str(), + |_: Result| -> () {}, + )?; // $ sql-sink Alert[rust/sql-injection]=remote10 + let _: Vec = conn2.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 // prepared queries (safe) let stmt = conn.prep(prepared_query.as_str())?; // $ sql-sink - let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),))?; - let _ : Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; + let _: Vec = conn.exec(&stmt, (remote_string.as_str(),))?; + let _: Vec> = conn.exec_opt(&stmt, (remote_string.as_str(),))?; let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)])?; conn.exec_drop(&stmt, (&remote_string.as_str(),)); - let _ : i64 = conn.exec_first(&stmt, (remote_string.as_str(),))?.unwrap(); - let _ : Result = conn.exec_first_opt(&stmt, (remote_string.as_str(),))?.unwrap(); - let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 })?; - let _ = conn.exec_fold_opt(&stmt, (remote_string.as_str(),), 0, |_: i64, _: Result| -> i64 { 0 })?; + let _: i64 = conn.exec_first(&stmt, (remote_string.as_str(),))?.unwrap(); + let _: Result = conn + .exec_first_opt(&stmt, (remote_string.as_str(),))? + .unwrap(); + let _ = conn.exec_fold( + &stmt, + (remote_string.as_str(),), + 0, + |_: i64, _: i64| -> i64 { 0 }, + )?; + let _ = conn.exec_fold_opt( + &stmt, + (remote_string.as_str(),), + 0, + |_: i64, _: Result| -> i64 { 0 }, + )?; let _ = conn.exec_iter(&stmt, (remote_string.as_str(),))?; let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {})?; - let _ = conn.exec_map_opt(&stmt, (remote_string.as_str(),), |_: Result| -> () {})?; + let _ = conn.exec_map_opt( + &stmt, + (remote_string.as_str(),), + |_: Result| -> () {}, + )?; // prepared queries (unsafe use) let stmt2 = conn.prep(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 @@ -58,10 +84,9 @@ mod sync_test } } -mod async_test -{ - use mysql_async::*; +mod async_test { use mysql_async::prelude::*; + use mysql_async::*; pub async fn test_mysql_async(url: &str) -> Result<()> { // connect through a MySQL connection pool @@ -69,33 +94,56 @@ mod async_test let mut conn = pool.get_conn().await?; // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/").unwrap().text().unwrap_or(String::from("")); // $ Source=remote11 + let mut remote_string = reqwest::blocking::get("http://example.com/") + .unwrap() + .text() + .unwrap_or(String::from("")); // $ Source=remote11 let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); - let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; + let unsafe_query = + String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; let prepared_query = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution (safe) - let _ : Vec = conn.query(safe_query.as_str()).await?; // $ sql-sink + let _: Vec = conn.query(safe_query.as_str()).await?; // $ sql-sink // direct execution (unsafe) - let _ : Vec = conn.query(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _: Vec = conn.query(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 conn.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote11 - let _ : Option = conn.query_first(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _: Option = conn.query_first(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn + .query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }) + .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 let _ = conn.query_iter(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_stream::(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 - let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {}).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn + .query_stream::(unsafe_query.as_str()) + .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + let _ = conn + .query_map(unsafe_query.as_str(), |_: i64| -> () {}) + .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 // prepared queries (safe) let stmt = conn.prep(prepared_query.as_str()).await?; // $ sql-sink - let _ : Vec = conn.exec(&stmt, (remote_string.as_str(),)).await?; - let _ = conn.exec_batch(&stmt, vec![(remote_string.as_str(),)]).await?; + let _: Vec = conn.exec(&stmt, (remote_string.as_str(),)).await?; + let _ = conn + .exec_batch(&stmt, vec![(remote_string.as_str(),)]) + .await?; conn.exec_drop(&stmt, (&remote_string.as_str(),)); - let _ : Option = conn.exec_first(&stmt, (remote_string.as_str(),)).await?; - let _ = conn.exec_fold(&stmt, (remote_string.as_str(),), 0, |_: i64, _: i64| -> i64 { 0 }).await?; + let _: Option = conn.exec_first(&stmt, (remote_string.as_str(),)).await?; + let _ = conn + .exec_fold( + &stmt, + (remote_string.as_str(),), + 0, + |_: i64, _: i64| -> i64 { 0 }, + ) + .await?; let _ = conn.exec_iter(&stmt, (remote_string.as_str(),)).await?; - let _ = conn.exec_stream::(&stmt, (remote_string.as_str(),)).await?; - let _ = conn.exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {}).await?; + let _ = conn + .exec_stream::(&stmt, (remote_string.as_str(),)) + .await?; + let _ = conn + .exec_map(&stmt, (remote_string.as_str(),), |_: i64| -> () {}) + .await?; // prepared queries (unsafe use) let stmt2 = conn.prep(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 From 48ca04bc40b0a26d969e95472d54a7e96046fd46 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:46:43 +0100 Subject: [PATCH 80/82] Rust: Repair test annotations following format and accept .expected changes. --- .../security/CWE-089/SqlInjection.expected | 704 +++++++++--------- .../query-tests/security/CWE-089/mysql.rs | 28 +- 2 files changed, 366 insertions(+), 366 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 90dcc06d282..b5d0af9aa0a 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,26 +1,26 @@ #select -| mysql.rs:22:33:22:37 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:22:33:22:37 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:23:55:23:63 | query_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:23:55:23:63 | query_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:24:14:24:23 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:24:14:24:23 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:25:28:25:38 | query_first | mysql.rs:13:33:13:54 | ...::get | mysql.rs:25:28:25:38 | query_first | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:26:49:26:63 | query_first_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:26:49:26:63 | query_first_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:27:22:27:31 | query_fold | mysql.rs:13:33:13:54 | ...::get | mysql.rs:27:22:27:31 | query_fold | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:28:22:28:35 | query_fold_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:28:22:28:35 | query_fold_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:29:22:29:31 | query_iter | mysql.rs:13:33:13:54 | ...::get | mysql.rs:29:22:29:31 | query_iter | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:30:22:30:30 | query_map | mysql.rs:13:33:13:54 | ...::get | mysql.rs:30:22:30:30 | query_map | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:31:22:31:34 | query_map_opt | mysql.rs:13:33:13:54 | ...::get | mysql.rs:31:22:31:34 | query_map_opt | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:32:34:32:38 | query | mysql.rs:13:33:13:54 | ...::get | mysql.rs:32:34:32:38 | query | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:49:26:49:29 | prep | mysql.rs:13:33:13:54 | ...::get | mysql.rs:49:26:49:29 | prep | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:54:15:54:24 | query_drop | mysql.rs:13:33:13:54 | ...::get | mysql.rs:54:15:54:24 | query_drop | This query depends on a $@. | mysql.rs:13:33:13:54 | ...::get | user-provided value | -| mysql.rs:81:33:81:37 | query | mysql.rs:72:33:72:54 | ...::get | mysql.rs:81:33:81:37 | query | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:82:14:82:23 | query_drop | mysql.rs:72:33:72:54 | ...::get | mysql.rs:82:14:82:23 | query_drop | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:83:36:83:46 | query_first | mysql.rs:72:33:72:54 | ...::get | mysql.rs:83:36:83:46 | query_first | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:84:22:84:31 | query_fold | mysql.rs:72:33:72:54 | ...::get | mysql.rs:84:22:84:31 | query_fold | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:85:22:85:31 | query_iter | mysql.rs:72:33:72:54 | ...::get | mysql.rs:85:22:85:31 | query_iter | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:86:22:86:33 | query_stream | mysql.rs:72:33:72:54 | ...::get | mysql.rs:86:22:86:33 | query_stream | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:87:22:87:30 | query_map | mysql.rs:72:33:72:54 | ...::get | mysql.rs:87:22:87:30 | query_map | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:101:26:101:29 | prep | mysql.rs:72:33:72:54 | ...::get | mysql.rs:101:26:101:29 | prep | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | -| mysql.rs:106:15:106:24 | query_drop | mysql.rs:72:33:72:54 | ...::get | mysql.rs:106:15:106:24 | query_drop | This query depends on a $@. | mysql.rs:72:33:72:54 | ...::get | user-provided value | +| mysql.rs:25:32:25:36 | query | mysql.rs:12:33:12:54 | ...::get | mysql.rs:25:32:25:36 | query | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:26:54:26:62 | query_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:26:54:26:62 | query_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:27:14:27:23 | query_drop | mysql.rs:12:33:12:54 | ...::get | mysql.rs:27:14:27:23 | query_drop | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:28:27:28:37 | query_first | mysql.rs:12:33:12:54 | ...::get | mysql.rs:28:27:28:37 | query_first | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:29:49:29:63 | query_first_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:29:49:29:63 | query_first_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:30:22:30:31 | query_fold | mysql.rs:12:33:12:54 | ...::get | mysql.rs:30:22:30:31 | query_fold | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:31:22:31:35 | query_fold_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:31:22:31:35 | query_fold_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:36:22:36:31 | query_iter | mysql.rs:12:33:12:54 | ...::get | mysql.rs:36:22:36:31 | query_iter | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:37:22:37:30 | query_map | mysql.rs:12:33:12:54 | ...::get | mysql.rs:37:22:37:30 | query_map | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:38:22:38:34 | query_map_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:38:22:38:34 | query_map_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:42:33:42:37 | query | mysql.rs:12:33:12:54 | ...::get | mysql.rs:42:33:42:37 | query | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:75:26:75:29 | prep | mysql.rs:12:33:12:54 | ...::get | mysql.rs:75:26:75:29 | prep | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:80:15:80:24 | query_drop | mysql.rs:12:33:12:54 | ...::get | mysql.rs:80:15:80:24 | query_drop | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | +| mysql.rs:110:32:110:36 | query | mysql.rs:97:33:97:54 | ...::get | mysql.rs:110:32:110:36 | query | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:111:14:111:23 | query_drop | mysql.rs:97:33:97:54 | ...::get | mysql.rs:111:14:111:23 | query_drop | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:112:35:112:45 | query_first | mysql.rs:97:33:97:54 | ...::get | mysql.rs:112:35:112:45 | query_first | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:114:14:114:23 | query_fold | mysql.rs:97:33:97:54 | ...::get | mysql.rs:114:14:114:23 | query_fold | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:116:22:116:31 | query_iter | mysql.rs:97:33:97:54 | ...::get | mysql.rs:116:22:116:31 | query_iter | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:118:14:118:25 | query_stream | mysql.rs:97:33:97:54 | ...::get | mysql.rs:118:14:118:25 | query_stream | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:121:14:121:22 | query_map | mysql.rs:97:33:97:54 | ...::get | mysql.rs:121:14:121:22 | query_map | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:149:26:149:29 | prep | mysql.rs:97:33:97:54 | ...::get | mysql.rs:149:26:149:29 | prep | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | +| mysql.rs:154:15:154:24 | query_drop | mysql.rs:97:33:97:54 | ...::get | mysql.rs:154:15:154:24 | query_drop | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | | sqlx.rs:77:13:77:23 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:13:77:23 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | | sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | @@ -34,226 +34,226 @@ | sqlx.rs:153:17:153:27 | ...::query | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:153:17:153:27 | ...::query | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | | sqlx.rs:188:17:188:27 | ...::query | sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:188:17:188:27 | ...::query | This query depends on a $@. | sqlx.rs:173:25:173:46 | ...::get | user-provided value | edges -| mysql.rs:13:13:13:29 | mut remote_string | mysql.rs:15:86:15:98 | remote_string | provenance | | -| mysql.rs:13:33:13:54 | ...::get | mysql.rs:13:33:13:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | mysql.rs:13:33:13:86 | ... .unwrap() | provenance | MaD:30 | -| mysql.rs:13:33:13:86 | ... .unwrap() | mysql.rs:13:33:13:93 | ... .text() [Ok] | provenance | MaD:34 | -| mysql.rs:13:33:13:93 | ... .text() [Ok] | mysql.rs:13:33:13:121 | ... .unwrap_or(...) | provenance | MaD:31 | -| mysql.rs:13:33:13:121 | ... .unwrap_or(...) | mysql.rs:13:13:13:29 | mut remote_string | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:50 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:76 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:36 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:51 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:76 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:44 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:48 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:44 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:43 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:47 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:51 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:42 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:37 | unsafe_query | provenance | | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:15:13:15:24 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | -| mysql.rs:15:28:15:98 | ... + ... | mysql.rs:15:28:15:104 | ... + ... | provenance | MaD:27 | -| mysql.rs:15:28:15:104 | ... + ... | mysql.rs:15:13:15:24 | unsafe_query | provenance | | -| mysql.rs:15:85:15:98 | &remote_string [&ref] | mysql.rs:15:28:15:98 | ... + ... | provenance | MaD:26 | -| mysql.rs:15:86:15:98 | remote_string | mysql.rs:15:85:15:98 | &remote_string [&ref] | provenance | | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:22:39:22:50 | unsafe_query | mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | mysql.rs:22:33:22:37 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:23:65:23:76 | unsafe_query | mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:23:65:23:85 | unsafe_query.as_str() | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | -| mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | mysql.rs:23:55:23:63 | query_opt | provenance | MaD:9 Sink:MaD:9 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:24:25:24:36 | unsafe_query | mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:24:25:24:45 | unsafe_query.as_str() | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | mysql.rs:24:14:24:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:25:40:25:51 | unsafe_query | mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:25:40:25:60 | unsafe_query.as_str() | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | -| mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | mysql.rs:25:28:25:38 | query_first | provenance | MaD:3 Sink:MaD:3 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:26:65:26:76 | unsafe_query | mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:26:65:26:85 | unsafe_query.as_str() | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | -| mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | mysql.rs:26:49:26:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:27:33:27:44 | unsafe_query | mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:27:33:27:53 | unsafe_query.as_str() | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | -| mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | mysql.rs:27:22:27:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:28:37:28:48 | unsafe_query | mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:28:37:28:57 | unsafe_query.as_str() | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | -| mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | mysql.rs:28:22:28:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:29:33:29:44 | unsafe_query | mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | mysql.rs:29:22:29:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:30:32:30:43 | unsafe_query | mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:30:32:30:52 | unsafe_query.as_str() | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | -| mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:30 | query_map | provenance | MaD:7 Sink:MaD:7 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:31:36:31:47 | unsafe_query | mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:31:36:31:56 | unsafe_query.as_str() | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | -| mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:32:40:32:51 | unsafe_query | mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | mysql.rs:32:34:32:38 | query | provenance | MaD:1 Sink:MaD:1 | -| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:49:31:49:42 | unsafe_query | mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:49:31:49:51 | unsafe_query.as_str() | mysql.rs:49:26:49:29 | prep | provenance | MaD:16 Sink:MaD:16 | -| mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | mysql.rs:49:26:49:29 | prep | provenance | MaD:16 Sink:MaD:16 | -| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:54:26:54:37 | unsafe_query | mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:54:26:54:46 | unsafe_query.as_str() | mysql.rs:54:15:54:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | mysql.rs:54:15:54:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | -| mysql.rs:72:13:72:29 | mut remote_string | mysql.rs:74:86:74:98 | remote_string | provenance | | -| mysql.rs:72:33:72:54 | ...::get | mysql.rs:72:33:72:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:72:33:72:77 | ...::get(...) [Ok] | mysql.rs:72:33:72:86 | ... .unwrap() | provenance | MaD:30 | -| mysql.rs:72:33:72:86 | ... .unwrap() | mysql.rs:72:33:72:93 | ... .text() [Ok] | provenance | MaD:34 | -| mysql.rs:72:33:72:93 | ... .text() [Ok] | mysql.rs:72:33:72:121 | ... .unwrap_or(...) | provenance | MaD:31 | -| mysql.rs:72:33:72:121 | ... .unwrap_or(...) | mysql.rs:72:13:72:29 | mut remote_string | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:50 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:36 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:59 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:44 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:44 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:59 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:43 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:42 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:37 | unsafe_query | provenance | | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:28 | -| mysql.rs:74:13:74:24 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() | provenance | MaD:32 | -| mysql.rs:74:28:74:98 | ... + ... | mysql.rs:74:13:74:24 | unsafe_query | provenance | | -| mysql.rs:74:28:74:98 | ... + ... | mysql.rs:74:28:74:104 | ... + ... | provenance | MaD:27 | -| mysql.rs:74:28:74:104 | ... + ... | mysql.rs:74:13:74:24 | unsafe_query | provenance | | -| mysql.rs:74:85:74:98 | &remote_string [&ref] | mysql.rs:74:28:74:98 | ... + ... | provenance | MaD:26 | -| mysql.rs:74:86:74:98 | remote_string | mysql.rs:74:85:74:98 | &remote_string [&ref] | provenance | | -| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:81:39:81:50 | unsafe_query | mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:81:39:81:59 | unsafe_query.as_str() | mysql.rs:81:33:81:37 | query | provenance | MaD:10 Sink:MaD:10 | -| mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | mysql.rs:81:33:81:37 | query | provenance | MaD:10 Sink:MaD:10 | -| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:82:25:82:36 | unsafe_query | mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:82:25:82:45 | unsafe_query.as_str() | mysql.rs:82:14:82:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | mysql.rs:82:14:82:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:83:48:83:59 | unsafe_query | mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:83:48:83:68 | unsafe_query.as_str() | mysql.rs:83:36:83:46 | query_first | provenance | MaD:12 Sink:MaD:12 | -| mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | mysql.rs:83:36:83:46 | query_first | provenance | MaD:12 Sink:MaD:12 | -| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:84:33:84:44 | unsafe_query | mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:84:33:84:53 | unsafe_query.as_str() | mysql.rs:84:22:84:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | -| mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | mysql.rs:84:22:84:31 | query_fold | provenance | MaD:13 Sink:MaD:13 | -| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:85:33:85:44 | unsafe_query | mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:85:33:85:53 | unsafe_query.as_str() | mysql.rs:85:22:85:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | -| mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | mysql.rs:85:22:85:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | -| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:86:48:86:59 | unsafe_query | mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:86:48:86:68 | unsafe_query.as_str() | mysql.rs:86:22:86:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | -| mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | mysql.rs:86:22:86:33 | query_stream | provenance | MaD:15 Sink:MaD:15 | -| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:87:32:87:43 | unsafe_query | mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:87:32:87:52 | unsafe_query.as_str() | mysql.rs:87:22:87:30 | query_map | provenance | MaD:14 Sink:MaD:14 | -| mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | mysql.rs:87:22:87:30 | query_map | provenance | MaD:14 Sink:MaD:14 | -| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:101:31:101:42 | unsafe_query | mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:101:31:101:51 | unsafe_query.as_str() | mysql.rs:101:26:101:29 | prep | provenance | MaD:18 Sink:MaD:18 | -| mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | mysql.rs:101:26:101:29 | prep | provenance | MaD:18 Sink:MaD:18 | -| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:106:26:106:37 | unsafe_query | mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | -| mysql.rs:106:26:106:46 | unsafe_query.as_str() | mysql.rs:106:15:106:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | -| mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | mysql.rs:106:15:106:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | +| mysql.rs:12:33:12:54 | ...::get | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:31 | +| mysql.rs:12:33:15:40 | ... .unwrap_or(...) | mysql.rs:12:13:12:29 | mut remote_string | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:49 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:75 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:36 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:50 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:76 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:44 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:24 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:44 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:43 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:24 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:50 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:42 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:37 | unsafe_query | provenance | | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:18:13:18:83 | ... + ... | mysql.rs:17:13:17:24 | unsafe_query | provenance | | +| mysql.rs:18:13:18:83 | ... + ... | mysql.rs:18:13:18:89 | ... + ... | provenance | MaD:27 | +| mysql.rs:18:13:18:89 | ... + ... | mysql.rs:17:13:17:24 | unsafe_query | provenance | | +| mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:26 | +| mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | +| mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() | mysql.rs:25:32:25:36 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:32:25:36 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() | mysql.rs:26:54:26:62 | query_opt | provenance | MaD:9 Sink:MaD:9 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:54:26:62 | query_opt | provenance | MaD:9 Sink:MaD:9 | +| mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() | mysql.rs:27:14:27:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:14:27:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() | mysql.rs:28:27:28:37 | query_first | provenance | MaD:3 Sink:MaD:3 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:27:28:37 | query_first | provenance | MaD:3 Sink:MaD:3 | +| mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() | mysql.rs:29:49:29:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:49:29:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | +| mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() | mysql.rs:30:22:30:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | +| mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() | mysql.rs:31:22:31:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | +| mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() | mysql.rs:36:22:36:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:22:36:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() | mysql.rs:37:22:37:30 | query_map | provenance | MaD:7 Sink:MaD:7 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:22:37:30 | query_map | provenance | MaD:7 Sink:MaD:7 | +| mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() | mysql.rs:38:22:38:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:38:22:38:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | +| mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() | mysql.rs:42:33:42:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:33:42:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() | mysql.rs:75:26:75:29 | prep | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:26:75:29 | prep | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() | mysql.rs:80:15:80:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:15:80:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | +| mysql.rs:97:33:97:54 | ...::get | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:31 | +| mysql.rs:97:33:100:40 | ... .unwrap_or(...) | mysql.rs:97:13:97:29 | mut remote_string | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:49 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:36 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:58 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:36 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:44 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:51 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:35 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:42 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:37 | unsafe_query | provenance | | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | MaD:28 | +| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | MaD:32 | +| mysql.rs:103:13:103:83 | ... + ... | mysql.rs:102:13:102:24 | unsafe_query | provenance | | +| mysql.rs:103:13:103:83 | ... + ... | mysql.rs:103:13:103:89 | ... + ... | provenance | MaD:27 | +| mysql.rs:103:13:103:89 | ... + ... | mysql.rs:102:13:102:24 | unsafe_query | provenance | | +| mysql.rs:103:70:103:83 | &remote_string [&ref] | mysql.rs:103:13:103:83 | ... + ... | provenance | MaD:26 | +| mysql.rs:103:71:103:83 | remote_string | mysql.rs:103:70:103:83 | &remote_string [&ref] | provenance | | +| mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() | mysql.rs:110:32:110:36 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:32:110:36 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() | mysql.rs:111:14:111:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:14:111:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() | mysql.rs:112:35:112:45 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:35:112:45 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() | mysql.rs:114:14:114:23 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:14:114:23 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() | mysql.rs:116:22:116:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:22:116:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | +| mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() | mysql.rs:118:14:118:25 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:14:118:25 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() | mysql.rs:121:14:121:22 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:14:121:22 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() | mysql.rs:149:26:149:29 | prep | provenance | MaD:18 Sink:MaD:18 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:26:149:29 | prep | provenance | MaD:18 Sink:MaD:18 | +| mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | +| mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:32 | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() | mysql.rs:154:15:154:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:15:154:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:25 | @@ -447,116 +447,116 @@ models | 35 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 36 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| mysql.rs:13:13:13:29 | mut remote_string | semmle.label | mut remote_string | -| mysql.rs:13:33:13:54 | ...::get | semmle.label | ...::get | -| mysql.rs:13:33:13:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | -| mysql.rs:13:33:13:86 | ... .unwrap() | semmle.label | ... .unwrap() | -| mysql.rs:13:33:13:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | -| mysql.rs:13:33:13:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| mysql.rs:15:13:15:24 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:15:28:15:98 | ... + ... | semmle.label | ... + ... | -| mysql.rs:15:28:15:104 | ... + ... | semmle.label | ... + ... | -| mysql.rs:15:85:15:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | -| mysql.rs:15:86:15:98 | remote_string | semmle.label | remote_string | -| mysql.rs:22:33:22:37 | query | semmle.label | query | -| mysql.rs:22:39:22:50 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:23:55:23:63 | query_opt | semmle.label | query_opt | -| mysql.rs:23:65:23:76 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:23:65:23:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:23:65:23:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:24:14:24:23 | query_drop | semmle.label | query_drop | -| mysql.rs:24:25:24:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:24:25:24:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:24:25:24:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:25:28:25:38 | query_first | semmle.label | query_first | -| mysql.rs:25:40:25:51 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:25:40:25:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:25:40:25:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:26:49:26:63 | query_first_opt | semmle.label | query_first_opt | -| mysql.rs:26:65:26:76 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:26:65:26:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:26:65:26:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:27:22:27:31 | query_fold | semmle.label | query_fold | -| mysql.rs:27:33:27:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:27:33:27:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:27:33:27:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:28:22:28:35 | query_fold_opt | semmle.label | query_fold_opt | -| mysql.rs:28:37:28:48 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:28:37:28:57 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:28:37:28:57 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:29:22:29:31 | query_iter | semmle.label | query_iter | -| mysql.rs:29:33:29:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:30:22:30:30 | query_map | semmle.label | query_map | -| mysql.rs:30:32:30:43 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:30:32:30:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:30:32:30:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:31:22:31:34 | query_map_opt | semmle.label | query_map_opt | -| mysql.rs:31:36:31:47 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:31:36:31:56 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:31:36:31:56 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:32:34:32:38 | query | semmle.label | query | -| mysql.rs:32:40:32:51 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:49:26:49:29 | prep | semmle.label | prep | -| mysql.rs:49:31:49:42 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:49:31:49:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:49:31:49:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:54:15:54:24 | query_drop | semmle.label | query_drop | -| mysql.rs:54:26:54:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:54:26:54:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:54:26:54:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:72:13:72:29 | mut remote_string | semmle.label | mut remote_string | -| mysql.rs:72:33:72:54 | ...::get | semmle.label | ...::get | -| mysql.rs:72:33:72:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | -| mysql.rs:72:33:72:86 | ... .unwrap() | semmle.label | ... .unwrap() | -| mysql.rs:72:33:72:93 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | -| mysql.rs:72:33:72:121 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| mysql.rs:74:13:74:24 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:74:28:74:98 | ... + ... | semmle.label | ... + ... | -| mysql.rs:74:28:74:104 | ... + ... | semmle.label | ... + ... | -| mysql.rs:74:85:74:98 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | -| mysql.rs:74:86:74:98 | remote_string | semmle.label | remote_string | -| mysql.rs:81:33:81:37 | query | semmle.label | query | -| mysql.rs:81:39:81:50 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:81:39:81:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:81:39:81:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:82:14:82:23 | query_drop | semmle.label | query_drop | -| mysql.rs:82:25:82:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:82:25:82:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:82:25:82:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:83:36:83:46 | query_first | semmle.label | query_first | -| mysql.rs:83:48:83:59 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:83:48:83:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:83:48:83:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:84:22:84:31 | query_fold | semmle.label | query_fold | -| mysql.rs:84:33:84:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:84:33:84:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:84:33:84:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:85:22:85:31 | query_iter | semmle.label | query_iter | -| mysql.rs:85:33:85:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:85:33:85:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:85:33:85:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:86:22:86:33 | query_stream | semmle.label | query_stream | -| mysql.rs:86:48:86:59 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:86:48:86:68 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:86:48:86:68 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:87:22:87:30 | query_map | semmle.label | query_map | -| mysql.rs:87:32:87:43 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:87:32:87:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:87:32:87:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:101:26:101:29 | prep | semmle.label | prep | -| mysql.rs:101:31:101:42 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:101:31:101:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:101:31:101:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:106:15:106:24 | query_drop | semmle.label | query_drop | -| mysql.rs:106:26:106:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:106:26:106:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | -| mysql.rs:106:26:106:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | +| mysql.rs:12:33:12:54 | ...::get | semmle.label | ...::get | +| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| mysql.rs:12:33:13:21 | ... .unwrap() | semmle.label | ... .unwrap() | +| mysql.rs:12:33:14:19 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| mysql.rs:12:33:15:40 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| mysql.rs:17:13:17:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:18:13:18:83 | ... + ... | semmle.label | ... + ... | +| mysql.rs:18:13:18:89 | ... + ... | semmle.label | ... + ... | +| mysql.rs:18:70:18:83 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| mysql.rs:18:71:18:83 | remote_string | semmle.label | remote_string | +| mysql.rs:25:32:25:36 | query | semmle.label | query | +| mysql.rs:25:38:25:49 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:26:54:26:62 | query_opt | semmle.label | query_opt | +| mysql.rs:26:64:26:75 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:27:14:27:23 | query_drop | semmle.label | query_drop | +| mysql.rs:27:25:27:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:28:27:28:37 | query_first | semmle.label | query_first | +| mysql.rs:28:39:28:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:29:49:29:63 | query_first_opt | semmle.label | query_first_opt | +| mysql.rs:29:65:29:76 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:30:22:30:31 | query_fold | semmle.label | query_fold | +| mysql.rs:30:33:30:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:31:22:31:35 | query_fold_opt | semmle.label | query_fold_opt | +| mysql.rs:32:13:32:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:36:22:36:31 | query_iter | semmle.label | query_iter | +| mysql.rs:36:33:36:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:37:22:37:30 | query_map | semmle.label | query_map | +| mysql.rs:37:32:37:43 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:38:22:38:34 | query_map_opt | semmle.label | query_map_opt | +| mysql.rs:39:13:39:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:42:33:42:37 | query | semmle.label | query | +| mysql.rs:42:39:42:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:75:26:75:29 | prep | semmle.label | prep | +| mysql.rs:75:31:75:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:80:15:80:24 | query_drop | semmle.label | query_drop | +| mysql.rs:80:26:80:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:97:13:97:29 | mut remote_string | semmle.label | mut remote_string | +| mysql.rs:97:33:97:54 | ...::get | semmle.label | ...::get | +| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| mysql.rs:97:33:98:21 | ... .unwrap() | semmle.label | ... .unwrap() | +| mysql.rs:97:33:99:19 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| mysql.rs:97:33:100:40 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| mysql.rs:102:13:102:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:103:13:103:83 | ... + ... | semmle.label | ... + ... | +| mysql.rs:103:13:103:89 | ... + ... | semmle.label | ... + ... | +| mysql.rs:103:70:103:83 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| mysql.rs:103:71:103:83 | remote_string | semmle.label | remote_string | +| mysql.rs:110:32:110:36 | query | semmle.label | query | +| mysql.rs:110:38:110:49 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:111:14:111:23 | query_drop | semmle.label | query_drop | +| mysql.rs:111:25:111:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:112:35:112:45 | query_first | semmle.label | query_first | +| mysql.rs:112:47:112:58 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:114:14:114:23 | query_fold | semmle.label | query_fold | +| mysql.rs:114:25:114:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:116:22:116:31 | query_iter | semmle.label | query_iter | +| mysql.rs:116:33:116:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:118:14:118:25 | query_stream | semmle.label | query_stream | +| mysql.rs:118:40:118:51 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:121:14:121:22 | query_map | semmle.label | query_map | +| mysql.rs:121:24:121:35 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:149:26:149:29 | prep | semmle.label | prep | +| mysql.rs:149:31:149:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | +| mysql.rs:154:15:154:24 | query_drop | semmle.label | query_drop | +| mysql.rs:154:26:154:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | | sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 323b8a2ab50..71ee265e8ba 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -9,10 +9,10 @@ mod sync_test { let mut conn2: Conn = pool.get_conn()?.unwrap(); // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/") + let mut remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote10 .unwrap() .text() - .unwrap_or(String::from("")); // $ Source=remote10 + .unwrap_or(String::from("")); let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; @@ -28,17 +28,17 @@ mod sync_test { let _: i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 let _: Result = conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold_opt( + let _ = conn.query_fold_opt( // $ sql-sink Alert[rust/sql-injection]=remote10 unsafe_query.as_str(), 0, |_: i64, _: Result| -> i64 { 0 }, - )?; // $ sql-sink Alert[rust/sql-injection]=remote10 + )?; let _ = conn.query_iter(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map_opt( + let _ = conn.query_map_opt( // $ sql-sink Alert[rust/sql-injection]=remote10 unsafe_query.as_str(), |_: Result| -> () {}, - )?; // $ sql-sink Alert[rust/sql-injection]=remote10 + )?; let _: Vec = conn2.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 // prepared queries (safe) @@ -94,10 +94,10 @@ mod async_test { let mut conn = pool.get_conn().await?; // construct queries - let mut remote_string = reqwest::blocking::get("http://example.com/") + let mut remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote11 .unwrap() .text() - .unwrap_or(String::from("")); // $ Source=remote11 + .unwrap_or(String::from("")); let safe_query = String::from("SELECT * FROM people WHERE firstname='Alice'"); let unsafe_query = String::from("SELECT * FROM people WHERE firstname='") + &remote_string + "'"; @@ -111,15 +111,15 @@ mod async_test { conn.query_drop(unsafe_query.as_str()); // $ sql-sink Alert[rust/sql-injection]=remote11 let _: Option = conn.query_first(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 let _ = conn - .query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }) - .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + .query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 }) // $ sql-sink Alert[rust/sql-injection]=remote11 + .await?; let _ = conn.query_iter(unsafe_query.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote11 let _ = conn - .query_stream::(unsafe_query.as_str()) - .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + .query_stream::(unsafe_query.as_str()) // $ sql-sink Alert[rust/sql-injection]=remote11 + .await?; let _ = conn - .query_map(unsafe_query.as_str(), |_: i64| -> () {}) - .await?; // $ sql-sink Alert[rust/sql-injection]=remote11 + .query_map(unsafe_query.as_str(), |_: i64| -> () {}) // $ sql-sink Alert[rust/sql-injection]=remote11 + .await?; // prepared queries (safe) let stmt = conn.prep(prepared_query.as_str()).await?; // $ sql-sink From f4a6efa9e0f2b536eed844666b9ca9cfabecf3d3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:02:42 +0100 Subject: [PATCH 81/82] Rust: Rename stdlib model files to be consistent with others. --- .../frameworks/stdlib/{lang-alloc.model.yml => alloc.model.yml} | 0 .../frameworks/stdlib/{lang-core.model.yml => core.model.yml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename rust/ql/lib/codeql/rust/frameworks/stdlib/{lang-alloc.model.yml => alloc.model.yml} (100%) rename rust/ql/lib/codeql/rust/frameworks/stdlib/{lang-core.model.yml => core.model.yml} (100%) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml similarity index 100% rename from rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml rename to rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml similarity index 100% rename from rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml rename to rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml From 072eca233d2d589e6721554ad21637e43eee8e28 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:50:47 +0100 Subject: [PATCH 82/82] Rust: Update consistency check .expected. --- .../PathResolutionConsistency.expected | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index bd49309c55a..b59acd0ca8e 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -1,57 +1,57 @@ multipleCallTargets -| mysql.rs:13:105:13:120 | ...::from(...) | -| mysql.rs:14:26:14:85 | ...::from(...) | -| mysql.rs:15:28:15:81 | ...::from(...) | -| mysql.rs:16:30:16:83 | ...::from(...) | -| mysql.rs:19:39:19:57 | safe_query.as_str() | -| mysql.rs:22:39:22:59 | unsafe_query.as_str() | -| mysql.rs:23:65:23:85 | unsafe_query.as_str() | -| mysql.rs:24:25:24:45 | unsafe_query.as_str() | -| mysql.rs:25:40:25:60 | unsafe_query.as_str() | -| mysql.rs:26:65:26:85 | unsafe_query.as_str() | -| mysql.rs:27:33:27:53 | unsafe_query.as_str() | -| mysql.rs:28:37:28:57 | unsafe_query.as_str() | -| mysql.rs:29:33:29:53 | unsafe_query.as_str() | -| mysql.rs:30:32:30:52 | unsafe_query.as_str() | -| mysql.rs:31:36:31:56 | unsafe_query.as_str() | -| mysql.rs:32:40:32:60 | unsafe_query.as_str() | -| mysql.rs:35:30:35:52 | prepared_query.as_str() | -| mysql.rs:36:46:36:67 | remote_string.as_str() | -| mysql.rs:37:72:37:93 | remote_string.as_str() | -| mysql.rs:38:46:38:67 | remote_string.as_str() | -| mysql.rs:39:33:39:54 | remote_string.as_str() | -| mysql.rs:40:47:40:68 | remote_string.as_str() | -| mysql.rs:41:73:41:94 | remote_string.as_str() | -| mysql.rs:42:40:42:61 | remote_string.as_str() | -| mysql.rs:43:44:43:65 | remote_string.as_str() | -| mysql.rs:44:40:44:61 | remote_string.as_str() | -| mysql.rs:45:39:45:60 | remote_string.as_str() | -| mysql.rs:46:43:46:64 | remote_string.as_str() | -| mysql.rs:49:31:49:51 | unsafe_query.as_str() | -| mysql.rs:54:26:54:46 | unsafe_query.as_str() | -| mysql.rs:72:105:72:120 | ...::from(...) | -| mysql.rs:73:26:73:85 | ...::from(...) | -| mysql.rs:74:28:74:81 | ...::from(...) | -| mysql.rs:75:30:75:83 | ...::from(...) | -| mysql.rs:78:39:78:57 | safe_query.as_str() | -| mysql.rs:81:39:81:59 | unsafe_query.as_str() | -| mysql.rs:82:25:82:45 | unsafe_query.as_str() | -| mysql.rs:83:48:83:68 | unsafe_query.as_str() | -| mysql.rs:84:33:84:53 | unsafe_query.as_str() | -| mysql.rs:85:33:85:53 | unsafe_query.as_str() | -| mysql.rs:86:48:86:68 | unsafe_query.as_str() | -| mysql.rs:87:32:87:52 | unsafe_query.as_str() | -| mysql.rs:90:30:90:52 | prepared_query.as_str() | -| mysql.rs:91:46:91:67 | remote_string.as_str() | -| mysql.rs:92:46:92:67 | remote_string.as_str() | -| mysql.rs:93:33:93:54 | remote_string.as_str() | -| mysql.rs:94:55:94:76 | remote_string.as_str() | -| mysql.rs:95:40:95:61 | remote_string.as_str() | -| mysql.rs:96:40:96:61 | remote_string.as_str() | -| mysql.rs:97:70:97:91 | remote_string.as_str() | -| mysql.rs:98:39:98:60 | remote_string.as_str() | -| mysql.rs:101:31:101:51 | unsafe_query.as_str() | -| mysql.rs:106:26:106:46 | unsafe_query.as_str() | +| mysql.rs:15:24:15:39 | ...::from(...) | +| mysql.rs:16:26:16:85 | ...::from(...) | +| mysql.rs:18:13:18:66 | ...::from(...) | +| mysql.rs:19:30:19:83 | ...::from(...) | +| mysql.rs:22:38:22:56 | safe_query.as_str() | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() | +| mysql.rs:45:30:45:52 | prepared_query.as_str() | +| mysql.rs:46:45:46:66 | remote_string.as_str() | +| mysql.rs:47:71:47:92 | remote_string.as_str() | +| mysql.rs:48:46:48:67 | remote_string.as_str() | +| mysql.rs:49:33:49:54 | remote_string.as_str() | +| mysql.rs:50:46:50:67 | remote_string.as_str() | +| mysql.rs:52:37:52:58 | remote_string.as_str() | +| mysql.rs:56:14:56:35 | remote_string.as_str() | +| mysql.rs:62:14:62:35 | remote_string.as_str() | +| mysql.rs:66:40:66:61 | remote_string.as_str() | +| mysql.rs:67:39:67:60 | remote_string.as_str() | +| mysql.rs:70:14:70:35 | remote_string.as_str() | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() | +| mysql.rs:100:24:100:39 | ...::from(...) | +| mysql.rs:101:26:101:85 | ...::from(...) | +| mysql.rs:103:13:103:66 | ...::from(...) | +| mysql.rs:104:30:104:83 | ...::from(...) | +| mysql.rs:107:38:107:56 | safe_query.as_str() | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() | +| mysql.rs:125:30:125:52 | prepared_query.as_str() | +| mysql.rs:126:45:126:66 | remote_string.as_str() | +| mysql.rs:128:38:128:59 | remote_string.as_str() | +| mysql.rs:130:33:130:54 | remote_string.as_str() | +| mysql.rs:131:54:131:75 | remote_string.as_str() | +| mysql.rs:135:18:135:39 | remote_string.as_str() | +| mysql.rs:140:40:140:61 | remote_string.as_str() | +| mysql.rs:142:62:142:83 | remote_string.as_str() | +| mysql.rs:145:31:145:52 | remote_string.as_str() | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() | | sqlx.rs:46:24:46:44 | ...::from(...) | | sqlx.rs:47:56:47:76 | ...::from(...) | | sqlx.rs:48:97:48:117 | ...::from(...) | @@ -119,13 +119,13 @@ multipleCallTargets | sqlx.rs:189:29:189:53 | prepared_query_1.as_str() | | sqlx.rs:202:57:202:85 | ...::from(...) | multiplePathResolutions -| mysql.rs:6:37:6:74 | Result::<...> | -| mysql.rs:23:21:23:45 | Result::<...> | -| mysql.rs:26:17:26:41 | Result::<...> | -| mysql.rs:28:75:28:99 | Result::<...> | -| mysql.rs:31:63:31:87 | Result::<...> | -| mysql.rs:37:21:37:45 | Result::<...> | -| mysql.rs:41:17:41:41 | Result::<...> | -| mysql.rs:43:85:43:109 | Result::<...> | -| mysql.rs:46:73:46:97 | Result::<...> | -| mysql.rs:66:49:66:58 | Result::<...> | +| mysql.rs:5:37:5:74 | Result::<...> | +| mysql.rs:26:20:26:44 | Result::<...> | +| mysql.rs:29:16:29:40 | Result::<...> | +| mysql.rs:34:25:34:49 | Result::<...> | +| mysql.rs:40:17:40:41 | Result::<...> | +| mysql.rs:47:20:47:44 | Result::<...> | +| mysql.rs:51:16:51:40 | Result::<...> | +| mysql.rs:64:25:64:49 | Result::<...> | +| mysql.rs:71:17:71:41 | Result::<...> | +| mysql.rs:91:49:91:58 | Result::<...> |