From 9a35febe80df3c4e36b53ccfa8dea903aa55093b Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:20:58 +0000 Subject: [PATCH 01/35] Rust: Query framework and basic tests. --- .../CWE-798/HardcodedCryptographicValue.ql | 21 ++++++ .../HardcodedCryptographicValue.expected | 0 .../CWE-798/HardcodedCryptographicValue.qlref | 2 + .../query-tests/security/CWE-798/options.yml | 6 ++ .../security/CWE-798/test_cipher.rs | 66 +++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql create mode 100644 rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected create mode 100644 rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref create mode 100644 rust/ql/test/query-tests/security/CWE-798/options.yml create mode 100644 rust/ql/test/query-tests/security/CWE-798/test_cipher.rs diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql new file mode 100644 index 000000000000..717831bba2b5 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -0,0 +1,21 @@ +/** + * @name Hard-coded cryptographic value + * @description Using hardcoded keys, passwords, salts or initialization + * vectors is not secure. + * @kind problem + * @problem.severity warning + * @security-severity TODO + * @precision high + * @id rust/hardcoded-crytographic-value + * @tags security + * external/cwe/cwe-259 + * external/cwe/cwe-321 + * external/cwe/cwe-798 + * external/cwe/cwe-1204 + */ + +import rust + +from Locatable e +where none() +select e, "" diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref new file mode 100644 index 000000000000..99053e9bf1a9 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref @@ -0,0 +1,2 @@ +query: queries/security/CWE-798/HardcodedCryptographicValue.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-798/options.yml b/rust/ql/test/query-tests/security/CWE-798/options.yml new file mode 100644 index 000000000000..07dc5e9922ea --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/options.yml @@ -0,0 +1,6 @@ +qltest_cargo_check: true +qltest_dependencies: + - cipher = { version = "0.4.4" } + - rabbit = { version = "0.4.1" } + - aes = { version = "0.8.4" } + - cfb-mode = { version = "0.8.2" } diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs new file mode 100644 index 000000000000..532fe523c07c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -0,0 +1,66 @@ + +use cipher::{consts::*, StreamCipher, AsyncStreamCipher, KeyInit, KeyIvInit, BlockEncrypt}; +use rabbit::{Rabbit, RabbitKeyOnly}; +use aes::Aes256; + +// --- tests --- + +fn test_stream_cipher_rabbit( + key: &[u8;16], iv: &[u8;16], plaintext: &str +) { + let mut data = plaintext.as_bytes().to_vec(); + + // rabbit + + let mut rabbit_cipher1 = RabbitKeyOnly::new(rabbit::Key::from_slice(key)); + rabbit_cipher1.apply_keystream(&mut data); + + let const1: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); + rabbit_cipher2.apply_keystream(&mut data); + + let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); + rabbit_cipher3.apply_keystream(&mut data); + + let const2: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const2), rabbit::Iv::from_slice(iv)); + rabbit_cipher4.apply_keystream(&mut data); + + let const3: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const3)); + rabbit_cipher5.apply_keystream(&mut data); + + let const4: &[u8;16] = &[0u8;16]; // (unused, so good) +} + +fn test_block_cipher_aes( + key: &[u8], iv: &[u8], key256: &[u8;32], + block128: &mut [u8;16], input: &[u8], output: &mut [u8] +) { + // aes + + let aes_cipher1 = Aes256::new(key256.into()); + aes_cipher1.encrypt_block(block128.into()); + + let const1 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher2 = Aes256::new(const1.into()); + aes_cipher2.encrypt_block(block128.into()); + + let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); + aes_cipher3.encrypt_block(block128.into()); + + let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); + aes_cipher4.encrypt_block(block128.into()); + + let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); + _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); + + let const3 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const3.into(), iv.into()); + _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); + + let const4 = &[0u8; 16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const4.into()); + _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); +} From bd75f0187b88823b41dd9767b05a081306f29b61 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 5 Mar 2025 18:44:59 +0000 Subject: [PATCH 02/35] Rust: More test cases. --- .../query-tests/security/CWE-798/options.yml | 2 + .../security/CWE-798/test_cipher.rs | 92 ++++++++++++++++--- 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/options.yml b/rust/ql/test/query-tests/security/CWE-798/options.yml index 07dc5e9922ea..aff715ea271b 100644 --- a/rust/ql/test/query-tests/security/CWE-798/options.yml +++ b/rust/ql/test/query-tests/security/CWE-798/options.yml @@ -3,4 +3,6 @@ qltest_dependencies: - cipher = { version = "0.4.4" } - rabbit = { version = "0.4.1" } - aes = { version = "0.8.4" } + - aes-gcm = { version = "0.10.3" } - cfb-mode = { version = "0.8.2" } + - base64 = { version = "0.22.1" } diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 532fe523c07c..748b9f3e012a 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -22,19 +22,40 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); rabbit_cipher3.apply_keystream(&mut data); - let const2: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const2), rabbit::Iv::from_slice(iv)); + let const4: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); rabbit_cipher4.apply_keystream(&mut data); - let const3: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const3)); + let const5: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); rabbit_cipher5.apply_keystream(&mut data); - let const4: &[u8;16] = &[0u8;16]; // (unused, so good) + // various expressions of constant arrays + + let const6: &[u8;16] = &[0u8;16]; // (unused, so good) + + let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); + rabbit_cipher7.apply_keystream(&mut data); + + let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); + rabbit_cipher8.apply_keystream(&mut data); + + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] + let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); + rabbit_cipher9.apply_keystream(&mut data); + + let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); + rabbit_cipher10.apply_keystream(&mut data); } +use base64::Engine; + fn test_block_cipher_aes( - key: &[u8], iv: &[u8], key256: &[u8;32], + key: &[u8], iv: &[u8], key256: &[u8;32], key_str: &str, block128: &mut [u8;16], input: &[u8], output: &mut [u8] ) { // aes @@ -42,8 +63,8 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const1 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher2 = Aes256::new(const1.into()); + let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher2 = Aes256::new(const2.into()); aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); @@ -56,11 +77,58 @@ fn test_block_cipher_aes( let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const3 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher6 = cfb_mode::Encryptor::::new(const3.into(), iv.into()); + let const6 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const4 = &[0u8; 16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const4.into()); + let const7 = &[0u8; 16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); + + // various string conversions + + let key8: &[u8] = key_str.as_bytes(); + let aes_cipher8 = cfb_mode::Encryptor::::new(key8.into(), iv.into()); + _ = aes_cipher8.encrypt_b2b(input, output).unwrap(); + + let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); + _ = aes_cipher9.encrypt_b2b(input, output).unwrap(); + + let key10: [u8; 32] = match base64::engine::general_purpose::STANDARD.decode(key_str) { + Ok(x) => x.try_into().unwrap(), + Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hardcoded-crytographic-value] + }; + let aes_cipher10 = Aes256::new(&key10.into()); + aes_cipher10.encrypt_block(block128.into()); + + if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let key11: [u8; 32] = const11.try_into().unwrap(); + let aes_cipher11 = Aes256::new(&key11.into()); + aes_cipher11.encrypt_block(block128.into()); + } +} + +use aes_gcm::aead::{Aead, AeadCore, OsRng}; +use aes_gcm::{Aes256Gcm, Key, Nonce}; + +fn test_aes_gcm( +) { + // aes (GCM) + + let key1 = Aes256Gcm::generate_key(aes_gcm::aead::OsRng); + let nonce1 = Aes256Gcm::generate_nonce(aes_gcm::aead::OsRng); + let cipher1 = Aes256Gcm::new(&key1); + let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); + + let key2: [u8;32] = [0;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let nonce2 = [0;12]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let cipher2 = Aes256Gcm::new(&key2.into()); + let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); + + let key3_array: &[u8;32] = &[0xff;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let key3 = Key::::from_slice(key3_array); + let nonce3: [u8;12] = [0xff;12]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let cipher3 = Aes256Gcm::new(&key3); + let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); } From 9fb00daeecb423f2b1beab21472dc40dd35eb0c8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 3 Mar 2025 19:43:55 +0000 Subject: [PATCH 03/35] Rust: Implement the query (with one source, one sink model). --- .../rustcrypto/rustcrypto.model.yml | 1 + .../HardcodedCryptographicValueExtensions.qll | 57 +++++++++++++++++++ .../CWE-798/HardcodedCryptographicValue.ql | 37 ++++++++++-- .../HardcodedCryptographicValue.expected | 16 ++++++ .../security/CWE-798/test_cipher.rs | 4 +- 5 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index fe3fd67a8fd4..baf21e9d6cc6 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -8,3 +8,4 @@ extensions: - ["repo:https://github.com/RustCrypto/traits:digest", "<_ as crate::digest::Digest>::chain_update", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/RustCrypto/traits:digest", "<_ as crate::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/stainless-steel/md5:md5", "crate::compute", "Argument[0]", "hasher-input", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll new file mode 100644 index 000000000000..006f4fd81392 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -0,0 +1,57 @@ +/** + * Provides classes and predicates for reasoning about hardcoded cryptographic value + * vulnerabilities. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.security.SensitiveData + +/** + * Provides default sources, sinks and barriers for detecting hardcoded cryptographic + * value vulnerabilities, as well as extension points for adding your own. + */ +module HardcodedCryptographicValue { + /** + * A data flow source for hardcoded cryptographic value vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for hardcoded cryptographic value vulnerabilities. + */ + abstract class Sink extends DataFlow::Node { + /** + * Gets the kind of credential this sink is interpreted as, + * for example "password", "key", "iv", "salt". + */ + abstract string getKind(); + } + + /** + * A barrier for hardcoded cryptographic value vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * A literal, considered as a flow source. + */ + private class LiteralSource extends Source { + LiteralSource() { this.asExpr().getExpr() instanceof LiteralExpr } + } + + /** + * A sink for hardcoded cryptographic value from model data. + */ + private class ModelsAsDataSinks extends Sink { + string kind; + + ModelsAsDataSinks() { + kind = ["password", "key", "iv", "salt"] and + sinkNode(this, "credentials-" + kind) + } + + override string getKind() { result = kind } + } +} diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 717831bba2b5..2ec8ea8c257a 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -2,7 +2,7 @@ * @name Hard-coded cryptographic value * @description Using hardcoded keys, passwords, salts or initialization * vectors is not secure. - * @kind problem + * @kind path-problem * @problem.severity warning * @security-severity TODO * @precision high @@ -15,7 +15,36 @@ */ import rust +import codeql.rust.security.HardcodedCryptographicValueExtensions +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.dataflow.internal.DataFlowImpl -from Locatable e -where none() -select e, "" +/** + * A taint-tracking configuration for hardcoded cryptographic value vulnerabilities. + */ +module HardcodedCryptographicValueConfig implements DataFlow::ConfigSig { + import HardcodedCryptographicValue + + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { + // flow out from reference content at sinks. + isSink(node) and + c.getAReadContent() instanceof ReferenceContent + } +} + +module HardcodedCryptographicValueFlow = TaintTracking::Global; + +import HardcodedCryptographicValueFlow::PathGraph + +from + HardcodedCryptographicValueFlow::PathNode source, HardcodedCryptographicValueFlow::PathNode sink +where HardcodedCryptographicValueFlow::flowPath(source, sink) +select source.getNode(), source, sink, "This hard-coded value is used as $@.", sink, + sink.getNode().(HardcodedCryptographicValueConfig::Sink).getKind() diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index e69de29bb2d1..4e3e67e41e0e 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -0,0 +1,16 @@ +#select +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | key | +edges +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:54 Sink:MaD:54 Sink:MaD:54 | +nodes +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 748b9f3e012a..cfd07d688a1b 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -70,8 +70,8 @@ fn test_block_cipher_aes( let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); aes_cipher3.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); + let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); // $ Sink aes_cipher4.encrypt_block(block128.into()); let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); From a6e106e025ad51c11f8fe4c5abef38c65317b4b6 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:02:33 +0000 Subject: [PATCH 04/35] Rust: Model more sinks + flows. --- .../rust/frameworks/genericarray.model.yml | 9 + .../rustcrypto/rustcrypto.model.yml | 31 ++++ .../HardcodedCryptographicValue.expected | 162 +++++++++++++++++- .../security/CWE-798/test_cipher.rs | 20 +-- 4 files changed, 211 insertions(+), 11 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml new file mode 100644 index 000000000000..29a72e2666c2 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml @@ -0,0 +1,9 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_mut_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::try_from_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] + - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::try_from_mut_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index baf21e9d6cc6..5b5b42ca3092 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -8,4 +8,35 @@ extensions: - ["repo:https://github.com/RustCrypto/traits:digest", "<_ as crate::digest::Digest>::chain_update", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/RustCrypto/traits:digest", "<_ as crate::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/stainless-steel/md5:md5", "crate::compute", "Argument[0]", "hasher-input", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[1]", "credentials-iv", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new", "Argument[1]", "credentials-iv", "manual"] - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[1]", "credentials-iv", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 4e3e67e41e0e..f7ab5392e758 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -1,12 +1,172 @@ #select +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | key | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | iv | +| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | +| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | +| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | key | edges +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:82 Sink:MaD:82 Sink:MaD:82 | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:83 Sink:MaD:83 Sink:MaD:83 | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:37:9:37:14 | const7 [element] | test_cipher.rs:38:74:38:79 | const7 [element] | provenance | | +| test_cipher.rs:37:27:37:74 | [...] [element] | test_cipher.rs:37:9:37:14 | const7 [element] | provenance | | +| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:38:74:38:79 | const7 [element] | test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | provenance | | +| test_cipher.rs:41:9:41:14 | const8 [&ref, element] | test_cipher.rs:42:73:42:78 | const8 [&ref, element] | provenance | | +| test_cipher.rs:41:28:41:76 | &... [&ref, element] | test_cipher.rs:41:9:41:14 | const8 [&ref, element] | provenance | | +| test_cipher.rs:41:29:41:76 | [...] [element] | test_cipher.rs:41:28:41:76 | &... [&ref, element] | provenance | | +| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:42:73:42:78 | const8 [&ref, element] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:54 Sink:MaD:54 Sink:MaD:54 | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:84 Sink:MaD:84 Sink:MaD:84 | nodes +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:18:30:18:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:25:30:25:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:29:30:29:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:37:9:37:14 | const7 [element] | semmle.label | const7 [element] | +| test_cipher.rs:37:27:37:74 | [...] [element] | semmle.label | [...] [element] | +| test_cipher.rs:37:28:37:28 | 0 | semmle.label | 0 | +| test_cipher.rs:37:31:37:31 | 0 | semmle.label | 0 | +| test_cipher.rs:37:34:37:34 | 0 | semmle.label | 0 | +| test_cipher.rs:37:37:37:37 | 0 | semmle.label | 0 | +| test_cipher.rs:37:40:37:40 | 0 | semmle.label | 0 | +| test_cipher.rs:37:43:37:43 | 0 | semmle.label | 0 | +| test_cipher.rs:37:46:37:46 | 0 | semmle.label | 0 | +| test_cipher.rs:37:49:37:49 | 0 | semmle.label | 0 | +| test_cipher.rs:37:52:37:52 | 0 | semmle.label | 0 | +| test_cipher.rs:37:55:37:55 | 0 | semmle.label | 0 | +| test_cipher.rs:37:58:37:58 | 0 | semmle.label | 0 | +| test_cipher.rs:37:61:37:61 | 0 | semmle.label | 0 | +| test_cipher.rs:37:64:37:64 | 0 | semmle.label | 0 | +| test_cipher.rs:37:67:37:67 | 0 | semmle.label | 0 | +| test_cipher.rs:37:70:37:70 | 0 | semmle.label | 0 | +| test_cipher.rs:37:73:37:73 | 0 | semmle.label | 0 | +| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | semmle.label | &const7 [&ref, element] | +| test_cipher.rs:38:74:38:79 | const7 [element] | semmle.label | const7 [element] | +| test_cipher.rs:41:9:41:14 | const8 [&ref, element] | semmle.label | const8 [&ref, element] | +| test_cipher.rs:41:28:41:76 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:41:29:41:76 | [...] [element] | semmle.label | [...] [element] | +| test_cipher.rs:41:30:41:30 | 0 | semmle.label | 0 | +| test_cipher.rs:41:33:41:33 | 0 | semmle.label | 0 | +| test_cipher.rs:41:36:41:36 | 0 | semmle.label | 0 | +| test_cipher.rs:41:39:41:39 | 0 | semmle.label | 0 | +| test_cipher.rs:41:42:41:42 | 0 | semmle.label | 0 | +| test_cipher.rs:41:45:41:45 | 0 | semmle.label | 0 | +| test_cipher.rs:41:48:41:48 | 0 | semmle.label | 0 | +| test_cipher.rs:41:51:41:51 | 0 | semmle.label | 0 | +| test_cipher.rs:41:54:41:54 | 0 | semmle.label | 0 | +| test_cipher.rs:41:57:41:57 | 0 | semmle.label | 0 | +| test_cipher.rs:41:60:41:60 | 0 | semmle.label | 0 | +| test_cipher.rs:41:63:41:63 | 0 | semmle.label | 0 | +| test_cipher.rs:41:66:41:66 | 0 | semmle.label | 0 | +| test_cipher.rs:41:69:41:69 | 0 | semmle.label | 0 | +| test_cipher.rs:41:72:41:72 | 0 | semmle.label | 0 | +| test_cipher.rs:41:75:41:75 | 0 | semmle.label | 0 | +| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:42:73:42:78 | const8 [&ref, element] | semmle.label | const8 [&ref, element] | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index cfd07d688a1b..cfa20ab13c26 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -15,31 +15,31 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher1 = RabbitKeyOnly::new(rabbit::Key::from_slice(key)); rabbit_cipher1.apply_keystream(&mut data); - let const1: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); + let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); // $ Sink rabbit_cipher2.apply_keystream(&mut data); let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); rabbit_cipher3.apply_keystream(&mut data); - let const4: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); + let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); // $ Sink rabbit_cipher4.apply_keystream(&mut data); - let const5: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); + let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); // $ Sink rabbit_cipher5.apply_keystream(&mut data); // various expressions of constant arrays let const6: &[u8;16] = &[0u8;16]; // (unused, so good) - let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); + let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); // $ Sink rabbit_cipher7.apply_keystream(&mut data); - let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); + let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink rabbit_cipher8.apply_keystream(&mut data); let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] From aacbfc0fd88af543a665bc7d2fa27b884091e98c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:38:04 +0000 Subject: [PATCH 05/35] Rust: Improve alert messages. --- .../HardcodedCryptographicValueExtensions.qll | 34 ++++++--- .../CWE-798/HardcodedCryptographicValue.ql | 2 +- .../HardcodedCryptographicValue.expected | 72 +++++++++---------- 3 files changed, 62 insertions(+), 46 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 006f4fd81392..246d138f91b9 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -8,6 +8,26 @@ private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.rust.security.SensitiveData +/** + * A kind of cryptographic value. + */ +class CryptographicValueKind extends string { + CryptographicValueKind() { this = ["password", "key", "iv", "salt"] } + + /** + * Gets a description of this value kind for user-facing messages. + */ + string getDescription() { + this = "password" and result = "a password" + or + this = "key" and result = "a key" + or + this = "iv" and result = "an initialization vector" + or + this = "salt" and result = "a salt" + } +} + /** * Provides default sources, sinks and barriers for detecting hardcoded cryptographic * value vulnerabilities, as well as extension points for adding your own. @@ -23,10 +43,9 @@ module HardcodedCryptographicValue { */ abstract class Sink extends DataFlow::Node { /** - * Gets the kind of credential this sink is interpreted as, - * for example "password", "key", "iv", "salt". + * Gets the kind of credential this sink is interpreted as. */ - abstract string getKind(); + abstract CryptographicValueKind getKind(); } /** @@ -45,13 +64,10 @@ module HardcodedCryptographicValue { * A sink for hardcoded cryptographic value from model data. */ private class ModelsAsDataSinks extends Sink { - string kind; + CryptographicValueKind kind; - ModelsAsDataSinks() { - kind = ["password", "key", "iv", "salt"] and - sinkNode(this, "credentials-" + kind) - } + ModelsAsDataSinks() { sinkNode(this, "credentials-" + kind) } - override string getKind() { result = kind } + override CryptographicValueKind getKind() { result = kind } } } diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 2ec8ea8c257a..716604ee4844 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -47,4 +47,4 @@ from HardcodedCryptographicValueFlow::PathNode source, HardcodedCryptographicValueFlow::PathNode sink where HardcodedCryptographicValueFlow::flowPath(source, sink) select source.getNode(), source, sink, "This hard-coded value is used as $@.", sink, - sink.getNode().(HardcodedCryptographicValueConfig::Sink).getKind() + sink.getNode().(HardcodedCryptographicValueConfig::Sink).getKind().getDescription() diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index f7ab5392e758..9a52e7e2f5d4 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -1,40 +1,40 @@ #select -| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | key | -| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | key | -| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | iv | -| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | key | -| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | key | -| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | key | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | +| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | From 055baf2769bda0d87bdffc853095038cbe4807c8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 15:46:51 +0000 Subject: [PATCH 06/35] Rust: Improve results on arrays (less duplication). --- .../HardcodedCryptographicValueExtensions.qll | 12 ++ .../CWE-798/HardcodedCryptographicValue.ql | 7 + .../HardcodedCryptographicValue.expected | 138 +++--------------- 3 files changed, 41 insertions(+), 116 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 246d138f91b9..f7f26032b518 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -60,6 +60,18 @@ module HardcodedCryptographicValue { LiteralSource() { this.asExpr().getExpr() instanceof LiteralExpr } } + /** + * An array initialized from a list of literals, considered as a single flow source. For example: + * ``` + * `[0, 0, 0, 0]` + * ``` + */ + private class ArrayListSource extends Source { + ArrayListSource() { + this.asExpr().getExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr + } + } + /** * A sink for hardcoded cryptographic value from model data. */ diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 716604ee4844..441c22f679a2 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -32,6 +32,13 @@ module HardcodedCryptographicValueConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + predicate isBarrierIn(DataFlow::Node node) { + // make sources barriers so that we only report the closest instance + // (this combined with sources for `ArrayListExpr` means we only get one source in + // case like `[0, 0, 0, 0]`) + isSource(node) + } + predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { // flow out from reference content at sinks. isSink(node) and diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 9a52e7e2f5d4..2ed68852eb55 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -2,38 +2,8 @@ | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | -| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | @@ -54,48 +24,16 @@ edges | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:83 Sink:MaD:83 Sink:MaD:83 | | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | -| test_cipher.rs:37:9:37:14 | const7 [element] | test_cipher.rs:38:74:38:79 | const7 [element] | provenance | | -| test_cipher.rs:37:27:37:74 | [...] [element] | test_cipher.rs:37:9:37:14 | const7 [element] | provenance | | -| test_cipher.rs:37:28:37:28 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:31:37:31 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:34:37:34 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:37:37:37 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:40:37:40 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:43:37:43 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:46:37:46 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:49:37:49 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:52:37:52 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:55:37:55 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:58:37:58 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:61:37:61 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:64:37:64 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:67:37:67 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:70:37:70 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:37:73:37:73 | 0 | test_cipher.rs:37:27:37:74 | [...] [element] | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | -| test_cipher.rs:38:74:38:79 | const7 [element] | test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | provenance | | -| test_cipher.rs:41:9:41:14 | const8 [&ref, element] | test_cipher.rs:42:73:42:78 | const8 [&ref, element] | provenance | | -| test_cipher.rs:41:28:41:76 | &... [&ref, element] | test_cipher.rs:41:9:41:14 | const8 [&ref, element] | provenance | | -| test_cipher.rs:41:29:41:76 | [...] [element] | test_cipher.rs:41:28:41:76 | &... [&ref, element] | provenance | | -| test_cipher.rs:41:30:41:30 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:33:41:33 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:36:41:36 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:39:41:39 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:42:41:42 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:45:41:45 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:48:41:48 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:51:41:51 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:54:41:54 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:57:41:57 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:60:41:60 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:63:41:63 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:66:41:66 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:69:41:69 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:72:41:72 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:41:75:41:75 | 0 | test_cipher.rs:41:29:41:76 | [...] [element] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | -| test_cipher.rs:42:73:42:78 | const8 [&ref, element] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:58 Sink:MaD:58 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:0 | +| test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | +| test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:58 Sink:MaD:58 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:0 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | @@ -123,50 +61,18 @@ nodes | test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | -| test_cipher.rs:37:9:37:14 | const7 [element] | semmle.label | const7 [element] | -| test_cipher.rs:37:27:37:74 | [...] [element] | semmle.label | [...] [element] | -| test_cipher.rs:37:28:37:28 | 0 | semmle.label | 0 | -| test_cipher.rs:37:31:37:31 | 0 | semmle.label | 0 | -| test_cipher.rs:37:34:37:34 | 0 | semmle.label | 0 | -| test_cipher.rs:37:37:37:37 | 0 | semmle.label | 0 | -| test_cipher.rs:37:40:37:40 | 0 | semmle.label | 0 | -| test_cipher.rs:37:43:37:43 | 0 | semmle.label | 0 | -| test_cipher.rs:37:46:37:46 | 0 | semmle.label | 0 | -| test_cipher.rs:37:49:37:49 | 0 | semmle.label | 0 | -| test_cipher.rs:37:52:37:52 | 0 | semmle.label | 0 | -| test_cipher.rs:37:55:37:55 | 0 | semmle.label | 0 | -| test_cipher.rs:37:58:37:58 | 0 | semmle.label | 0 | -| test_cipher.rs:37:61:37:61 | 0 | semmle.label | 0 | -| test_cipher.rs:37:64:37:64 | 0 | semmle.label | 0 | -| test_cipher.rs:37:67:37:67 | 0 | semmle.label | 0 | -| test_cipher.rs:37:70:37:70 | 0 | semmle.label | 0 | -| test_cipher.rs:37:73:37:73 | 0 | semmle.label | 0 | +| test_cipher.rs:37:9:37:14 | const7 | semmle.label | const7 | +| test_cipher.rs:37:27:37:74 | [...] | semmle.label | [...] | | test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:38:73:38:79 | &const7 [&ref, element] | semmle.label | &const7 [&ref, element] | -| test_cipher.rs:38:74:38:79 | const7 [element] | semmle.label | const7 [element] | -| test_cipher.rs:41:9:41:14 | const8 [&ref, element] | semmle.label | const8 [&ref, element] | -| test_cipher.rs:41:28:41:76 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:41:29:41:76 | [...] [element] | semmle.label | [...] [element] | -| test_cipher.rs:41:30:41:30 | 0 | semmle.label | 0 | -| test_cipher.rs:41:33:41:33 | 0 | semmle.label | 0 | -| test_cipher.rs:41:36:41:36 | 0 | semmle.label | 0 | -| test_cipher.rs:41:39:41:39 | 0 | semmle.label | 0 | -| test_cipher.rs:41:42:41:42 | 0 | semmle.label | 0 | -| test_cipher.rs:41:45:41:45 | 0 | semmle.label | 0 | -| test_cipher.rs:41:48:41:48 | 0 | semmle.label | 0 | -| test_cipher.rs:41:51:41:51 | 0 | semmle.label | 0 | -| test_cipher.rs:41:54:41:54 | 0 | semmle.label | 0 | -| test_cipher.rs:41:57:41:57 | 0 | semmle.label | 0 | -| test_cipher.rs:41:60:41:60 | 0 | semmle.label | 0 | -| test_cipher.rs:41:63:41:63 | 0 | semmle.label | 0 | -| test_cipher.rs:41:66:41:66 | 0 | semmle.label | 0 | -| test_cipher.rs:41:69:41:69 | 0 | semmle.label | 0 | -| test_cipher.rs:41:72:41:72 | 0 | semmle.label | 0 | -| test_cipher.rs:41:75:41:75 | 0 | semmle.label | 0 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | semmle.label | &const7 [&ref] | +| test_cipher.rs:38:74:38:79 | const7 | semmle.label | const7 | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:41:28:41:76 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:41:29:41:76 | [...] | semmle.label | [...] | | test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:42:73:42:78 | const8 [&ref, element] | semmle.label | const8 [&ref, element] | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | From ac94ac6584cc0a8ab4e4c59793b412229b254a18 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 16:25:27 +0000 Subject: [PATCH 07/35] Rust: Model even more sinks + flows. --- .../rustcrypto/rustcrypto.model.yml | 2 + .../frameworks/stdlib/lang-core.model.yml | 4 + .../HardcodedCryptographicValueExtensions.qll | 4 +- .../HardcodedCryptographicValue.expected | 123 ++++++++++++++++++ .../security/CWE-798/test_cipher.rs | 32 ++--- 5 files changed, 148 insertions(+), 17 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index 5b5b42ca3092..2047cfa9ebcd 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -40,3 +40,5 @@ extensions: - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[1]", "credentials-iv", "manual"] + - ["repo:https://github.com/RustCrypto/AEADs:aes-gcm", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:aead", "<_ as crate::Aead>::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index 062576e46bb4..d8bbe389eaa4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -3,6 +3,10 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: + # Conversions + - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["lang:core", "<[_]>::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] # Fmt - ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"] # Iterator diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index f7f26032b518..fbabffc3e28d 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -12,7 +12,7 @@ private import codeql.rust.security.SensitiveData * A kind of cryptographic value. */ class CryptographicValueKind extends string { - CryptographicValueKind() { this = ["password", "key", "iv", "salt"] } + CryptographicValueKind() { this = ["password", "key", "iv", "nonce", "salt"] } /** * Gets a description of this value kind for user-facing messages. @@ -24,6 +24,8 @@ class CryptographicValueKind extends string { or this = "iv" and result = "an initialization vector" or + this = "nonce" and result = "a nonce" + or this = "salt" and result = "a salt" } } diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 2ed68852eb55..0d29ab6921c7 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -4,7 +4,15 @@ | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:47:30:47:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:47:30:47:47 | ...::new | a key | +| test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:67:23:67:33 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:67:23:67:33 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | +| test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:81:23:81:61 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:81:23:81:61 | ...::new | a key | +| test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:85:23:85:61 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:85:23:85:61 | ...::new | an initialization vector | +| test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:126:19:126:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:126:19:126:32 | ...::new | a key | +| test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:127:21:127:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:127:21:127:27 | encrypt | a nonce | +| test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:132:19:132:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:132:19:132:32 | ...::new | a key | +| test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:133:21:133:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:133:21:133:27 | encrypt | a nonce | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | @@ -34,11 +42,65 @@ edges | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:58 Sink:MaD:58 | | test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:0 | +| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:37 | const9 | provenance | | +| test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | +| test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | +| test_cipher.rs:46:32:46:37 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:103 | +| test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | +| test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | +| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | +| test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | +| test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | +| test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:76 Sink:MaD:76 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:84 Sink:MaD:84 Sink:MaD:84 | +| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:68 | const6 [&ref, element] | provenance | | +| test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | +| test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | +| test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:86 Sink:MaD:86 | +| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | +| test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | +| test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | +| test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:87 Sink:MaD:87 | +| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:38 | key2 [element] | provenance | | +| test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | +| test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:25:124:30 | [0; 32] [element] | provenance | | +| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:35 | nonce2 [element] | provenance | | +| test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | +| test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | +| test_cipher.rs:126:35:126:38 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | +| test_cipher.rs:127:30:127:35 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | +| test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | +| test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | +| test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | test_cipher.rs:129:32:129:41 | &... [&ref, element] | provenance | | +| test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | provenance | | +| test_cipher.rs:130:9:130:12 | key3 [&ref, element] | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | provenance | | +| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | provenance | | +| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:35 | nonce3 [element] | provenance | | +| test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | test_cipher.rs:131:9:131:14 | nonce3 [element] | provenance | | +| test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | provenance | | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 Sink:MaD:90 | +| test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | +| test_cipher.rs:133:30:133:35 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | @@ -73,10 +135,71 @@ nodes | test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:45:9:45:14 | const9 | semmle.label | const9 | +| test_cipher.rs:45:27:45:50 | [...] | semmle.label | [...] | +| test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | +| test_cipher.rs:46:32:46:37 | const9 | semmle.label | const9 | +| test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | semmle.label | const9.align_to(...) [tuple.1, &ref, element] | +| test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | semmle.label | ... .1 [&ref, element] | +| test_cipher.rs:47:30:47:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | +| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:66:18:66:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:66:20:66:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:67:23:67:33 | ...::new | semmle.label | ...::new | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | semmle.label | const2.into(...) [element] | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | | test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | | test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | semmle.label | const6 [&ref, element] | +| test_cipher.rs:80:18:80:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:80:20:80:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:81:23:81:61 | ...::new | semmle.label | ...::new | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | semmle.label | const6 [&ref, element] | +| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | semmle.label | const6.into(...) [element] | +| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | semmle.label | const7 [&ref, element] | +| test_cipher.rs:84:18:84:27 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:84:20:84:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:85:23:85:61 | ...::new | semmle.label | ...::new | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | semmle.label | const7 [&ref, element] | +| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | semmle.label | const7.into(...) [element] | +| test_cipher.rs:124:9:124:12 | key2 [element] | semmle.label | key2 [element] | +| test_cipher.rs:124:25:124:30 | [0; 32] [element] | semmle.label | [0; 32] [element] | +| test_cipher.rs:124:26:124:26 | 0 | semmle.label | 0 | +| test_cipher.rs:125:9:125:14 | nonce2 [element] | semmle.label | nonce2 [element] | +| test_cipher.rs:125:18:125:23 | [0; 12] [element] | semmle.label | [0; 12] [element] | +| test_cipher.rs:125:19:125:19 | 0 | semmle.label | 0 | +| test_cipher.rs:126:19:126:32 | ...::new | semmle.label | ...::new | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:126:35:126:38 | key2 [element] | semmle.label | key2 [element] | +| test_cipher.rs:126:35:126:45 | key2.into(...) [element] | semmle.label | key2.into(...) [element] | +| test_cipher.rs:127:21:127:27 | encrypt | semmle.label | encrypt | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:127:30:127:35 | nonce2 [element] | semmle.label | nonce2 [element] | +| test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | semmle.label | nonce2.into(...) [element] | +| test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | semmle.label | key3_array [&ref, element] | +| test_cipher.rs:129:32:129:41 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | semmle.label | [0xff; 32] [element] | +| test_cipher.rs:129:34:129:37 | 0xff | semmle.label | 0xff | +| test_cipher.rs:130:9:130:12 | key3 [&ref, element] | semmle.label | key3 [&ref, element] | +| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | semmle.label | key3_array [&ref, element] | +| test_cipher.rs:131:9:131:14 | nonce3 [element] | semmle.label | nonce3 [element] | +| test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | semmle.label | [0xff; 12] [element] | +| test_cipher.rs:131:28:131:31 | 0xff | semmle.label | 0xff | +| test_cipher.rs:132:19:132:32 | ...::new | semmle.label | ...::new | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | semmle.label | &key3 [&ref, &ref, element] | +| test_cipher.rs:132:35:132:38 | key3 [&ref, element] | semmle.label | key3 [&ref, element] | +| test_cipher.rs:133:21:133:27 | encrypt | semmle.label | encrypt | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:133:30:133:35 | nonce3 [element] | semmle.label | nonce3 [element] | +| test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | semmle.label | nonce3.into(...) [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index cfa20ab13c26..d85fffcf58a2 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -42,9 +42,9 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink rabbit_cipher8.apply_keystream(&mut data); - let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] - let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); + let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ Sink rabbit_cipher9.apply_keystream(&mut data); let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ MISSING: Alert[rust/hardcoded-crytographic-value] @@ -63,8 +63,8 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher2 = Aes256::new(const2.into()); + let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let aes_cipher2 = Aes256::new(const2.into()); // $ Sink aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); @@ -77,12 +77,12 @@ fn test_block_cipher_aes( let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const6 = &[0u8;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); + let const6 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ Sink _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const7 = &[0u8; 16]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); + let const7 = &[0u8; 16]; // $ Alert[rust/hardcoded-crytographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ Sink _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); // various string conversions @@ -121,14 +121,14 @@ fn test_aes_gcm( let cipher1 = Aes256Gcm::new(&key1); let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); - let key2: [u8;32] = [0;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let nonce2 = [0;12]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let cipher2 = Aes256Gcm::new(&key2.into()); - let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); + let key2: [u8;32] = [0;32]; // $ Alert[rust/hardcoded-crytographic-value] + let nonce2 = [0;12]; // $ Alert[rust/hardcoded-crytographic-value] + let cipher2 = Aes256Gcm::new(&key2.into()); // $ Sink + let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ Sink - let key3_array: &[u8;32] = &[0xff;32]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hardcoded-crytographic-value] let key3 = Key::::from_slice(key3_array); - let nonce3: [u8;12] = [0xff;12]; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let cipher3 = Aes256Gcm::new(&key3); - let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); + let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hardcoded-crytographic-value] + let cipher3 = Aes256Gcm::new(&key3); // $ Sink + let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink } From b4a6063e203222ea4319380f01e380fd1a0754ca Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 17:13:51 +0000 Subject: [PATCH 08/35] Rust: Add std::mem::zeroed as a source. --- .../frameworks/stdlib/lang-core.model.yml | 5 ++++ .../HardcodedCryptographicValueExtensions.qll | 11 ++++++-- .../HardcodedCryptographicValue.expected | 28 ++++++++++++++----- .../security/CWE-798/test_cipher.rs | 4 +-- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index d8bbe389eaa4..37f574dd2b85 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -1,4 +1,9 @@ extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + - ["lang:core", "crate::mem::zeroed", "ReturnValue.Element", "constant-source", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index fbabffc3e28d..4d6210cb97b5 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -69,9 +69,14 @@ module HardcodedCryptographicValue { * ``` */ private class ArrayListSource extends Source { - ArrayListSource() { - this.asExpr().getExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr - } + ArrayListSource() { this.asExpr().getExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr } + } + + /** + * An externally modeled source for constant values. + */ + private class ModeledSource extends Source { + ModeledSource() { sourceNode(this, "constant-source") } } /** diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 0d29ab6921c7..a09f89d21276 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -5,6 +5,7 @@ | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:47:30:47:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:47:30:47:47 | ...::new | a key | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:67:23:67:33 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:67:23:67:33 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:81:23:81:61 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:81:23:81:61 | ...::new | a key | @@ -45,16 +46,22 @@ edges | test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:37 | const9 | provenance | | | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:46:32:46:37 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:103 | +| test_cipher.rs:46:32:46:37 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:104 | | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:101 | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | | test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:76 Sink:MaD:76 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | @@ -65,13 +72,13 @@ edges | test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:86 Sink:MaD:86 | | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | | test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:87 Sink:MaD:87 | | test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:38 | key2 [element] | provenance | | | test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | @@ -80,10 +87,10 @@ edges | test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | | test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | -| test_cipher.rs:126:35:126:38 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:126:35:126:38 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | | test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | -| test_cipher.rs:127:30:127:35 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:127:30:127:35 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | | test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | @@ -99,7 +106,7 @@ edges | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 Sink:MaD:90 | | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | -| test_cipher.rs:133:30:133:35 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:101 | +| test_cipher.rs:133:30:133:35 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | @@ -144,6 +151,13 @@ nodes | test_cipher.rs:47:30:47:47 | ...::new | semmle.label | ...::new | | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | +| test_cipher.rs:50:9:50:15 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:50:37:50:52 | ...::zeroed | semmle.label | ...::zeroed | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | semmle.label | ...::zeroed(...) [element] | +| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | +| test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | | test_cipher.rs:66:18:66:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index d85fffcf58a2..cf96cf047b5f 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -47,8 +47,8 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ Sink rabbit_cipher9.apply_keystream(&mut data); - let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ MISSING: Alert[rust/hardcoded-crytographic-value] - let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); + let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hardcoded-crytographic-value] + let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); // $ Sink rabbit_cipher10.apply_keystream(&mut data); } From 95be12ed80f96af4df5d8658037630485e42975b Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 17:45:34 +0000 Subject: [PATCH 09/35] Rust: Add qhelp and examples. --- .../CWE-798/HardcodedCryptographicValue.qhelp | 58 +++++++++++++++++++ .../CWE-798/HardcodedCryptographicValueBad.rs | 2 + .../HardcodedCryptographicValueGood.rs | 2 + 3 files changed, 62 insertions(+) create mode 100644 rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp create mode 100644 rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs create mode 100644 rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp new file mode 100644 index 000000000000..408d4bd002a8 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp @@ -0,0 +1,58 @@ + + + + +

+Hardcoded passwords, keys, initialization vectors and salts should not be used for cryptographic operations. +

+
    +
  • + Attackers can easily recover hardcoded values if they have access to the source code or compiled executable. +
  • +
  • + Some hardcoded values may be easily guessable. +
  • +
  • + Hardcoded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis. +
  • +
+ +
+ + +

+Use randomly generated key material, initialization vectors and salts. Use strong passwords that are not hardcoded in source code. +

+ +
+ + +

+The following example shows instantiating a cipher with hardcoded key material, making the encrypted data vulnerable to recovery. +

+ + + +

+In the fixed code below, the key material is randomly generated and not hardcoded, which protects the encrypted data against recovery. A real application would also need a strategy for secure key management after the key has been generated. +

+ + + +
+ + +
  • +OWASP: Use of hard-coded password. +
  • +
  • +OWASP: Key Management Cheat Sheet. +
  • +
  • +O'Reilly: Using Salts, Nonces, and Initialization Vectors. +
  • + +
    +
    diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs new file mode 100644 index 000000000000..c1923df1730f --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs @@ -0,0 +1,2 @@ +let key: [u8;32] = [0;32]; // BAD: Using hardcoded keys for encryption +let cipher = Aes256Gcm::new(&key.into()); diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs new file mode 100644 index 000000000000..06dc1af836d5 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs @@ -0,0 +1,2 @@ +let key = Aes256Gcm::generate_key(aes_gcm::aead::OsRng); // GOOD: Using randomly generated keys for encryption +let cipher = Aes256Gcm::new(&key); From e564c410439eb8898ec829ca6487883ca8122bc5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:36:55 +0000 Subject: [PATCH 10/35] Rust: Compute security-severity tag. --- .../src/queries/security/CWE-798/HardcodedCryptographicValue.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 441c22f679a2..49e8b0cf3422 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -4,7 +4,7 @@ * vectors is not secure. * @kind path-problem * @problem.severity warning - * @security-severity TODO + * @security-severity 9.8 * @precision high * @id rust/hardcoded-crytographic-value * @tags security From 952e417d13b6a18f01386e3d7773ebad76c5b8a3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:46:37 +0000 Subject: [PATCH 11/35] Rust: Tweak some wording. --- .../rust/security/HardcodedCryptographicValueExtensions.qll | 2 +- .../security/CWE-798/HardcodedCryptographicValue.qhelp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 4d6210cb97b5..32f64051fcb3 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -80,7 +80,7 @@ module HardcodedCryptographicValue { } /** - * A sink for hardcoded cryptographic value from model data. + * An externally modeled sink for hardcoded cryptographic value vulnerabilities. */ private class ModelsAsDataSinks extends Sink { CryptographicValueKind kind; diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp index 408d4bd002a8..b44a98013c89 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp @@ -12,10 +12,10 @@ Hardcoded passwords, keys, initialization vectors and salts should not be used f Attackers can easily recover hardcoded values if they have access to the source code or compiled executable.
  • - Some hardcoded values may be easily guessable. + Some hardcoded values are easily guessable.
  • - Hardcoded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis. + Use of hardcoded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis.
  • @@ -23,7 +23,7 @@ Hardcoded passwords, keys, initialization vectors and salts should not be used f

    -Use randomly generated key material, initialization vectors and salts. Use strong passwords that are not hardcoded in source code. +Use randomly generated key material, initialization vectors and salts. Use strong passwords that are not hardcoded.

    From 9af2d0218b777520f33f0a836bfc0efbdc172430 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:48:26 +0000 Subject: [PATCH 12/35] Rust: Add the new sinks to stats. --- rust/ql/src/queries/summary/Stats.qll | 3 +++ rust/ql/test/query-tests/diagnostics/SummaryStats.expected | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 4054b0bc1326..bc6e38ba67a9 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -11,6 +11,7 @@ private import codeql.rust.controlflow.internal.CfgConsistency as CfgConsistency private import codeql.rust.dataflow.internal.DataFlowConsistency as DataFlowConsistency private import codeql.rust.security.SqlInjectionExtensions private import codeql.rust.security.CleartextLoggingExtensions +private import codeql.rust.security.HardcodedCryptographicValueExtensions /** * Gets a count of the total number of lines of code in the database. @@ -62,6 +63,8 @@ string getAQuerySinkKind(DataFlow::Node n) { n instanceof SqlInjection::Sink and result = "SqlInjection" or n instanceof CleartextLogging::Sink and result = "CleartextLogging" + or + n instanceof HardcodedCryptographicValue::Sink and result = "HardcodedCryptographicValue" } /** diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected index 7abbbba7c1bb..c87c80da8c7a 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected @@ -14,7 +14,7 @@ | Macro calls - resolved | 8 | | Macro calls - total | 9 | | Macro calls - unresolved | 1 | -| Taint edges - number of edges | 1471 | +| Taint edges - number of edges | 1475 | | Taint reach - nodes tainted | 0 | | Taint reach - per million nodes | 0 | | Taint sinks - cryptographic operations | 0 | From 42e7d1e983465b4da3ced5805e21c51efec84aaa Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 6 Mar 2025 19:09:01 +0000 Subject: [PATCH 13/35] Rust: Fix typo. --- .../CWE-798/HardcodedCryptographicValue.ql | 2 +- .../security/CWE-798/test_cipher.rs | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 49e8b0cf3422..3fb9d4d74a2d 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -6,7 +6,7 @@ * @problem.severity warning * @security-severity 9.8 * @precision high - * @id rust/hardcoded-crytographic-value + * @id rust/hardcoded-cryptographic-value * @tags security * external/cwe/cwe-259 * external/cwe/cwe-321 diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index cf96cf047b5f..7a5ef0572fd9 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -15,18 +15,18 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher1 = RabbitKeyOnly::new(rabbit::Key::from_slice(key)); rabbit_cipher1.apply_keystream(&mut data); - let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); // $ Sink rabbit_cipher2.apply_keystream(&mut data); let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); rabbit_cipher3.apply_keystream(&mut data); - let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); // $ Sink rabbit_cipher4.apply_keystream(&mut data); - let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-crytographic-value] + let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); // $ Sink rabbit_cipher5.apply_keystream(&mut data); @@ -34,20 +34,20 @@ fn test_stream_cipher_rabbit( let const6: &[u8;16] = &[0u8;16]; // (unused, so good) - let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] + let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); // $ Sink rabbit_cipher7.apply_keystream(&mut data); - let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] + let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink rabbit_cipher8.apply_keystream(&mut data); - let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-crytographic-value] + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ Sink rabbit_cipher9.apply_keystream(&mut data); - let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hardcoded-crytographic-value] + let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hardcoded-cryptographic-value] let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); // $ Sink rabbit_cipher10.apply_keystream(&mut data); } @@ -63,25 +63,25 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] let aes_cipher2 = Aes256::new(const2.into()); // $ Sink aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); aes_cipher3.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); // $ Sink aes_cipher4.encrypt_block(block128.into()); let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const6 = &[0u8;32]; // $ Alert[rust/hardcoded-crytographic-value] + let const6 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ Sink _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const7 = &[0u8; 16]; // $ Alert[rust/hardcoded-crytographic-value] + let const7 = &[0u8; 16]; // $ Alert[rust/hardcoded-cryptographic-value] let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ Sink _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); @@ -91,18 +91,18 @@ fn test_block_cipher_aes( let aes_cipher8 = cfb_mode::Encryptor::::new(key8.into(), iv.into()); _ = aes_cipher8.encrypt_b2b(input, output).unwrap(); - let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hardcoded-crytographic-value] + let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hardcoded-cryptographic-value] let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); _ = aes_cipher9.encrypt_b2b(input, output).unwrap(); let key10: [u8; 32] = match base64::engine::general_purpose::STANDARD.decode(key_str) { Ok(x) => x.try_into().unwrap(), - Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hardcoded-crytographic-value] + Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hardcoded-cryptographic-value] }; let aes_cipher10 = Aes256::new(&key10.into()); aes_cipher10.encrypt_block(block128.into()); - if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hardcoded-crytographic-value] + if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hardcoded-cryptographic-value] let key11: [u8; 32] = const11.try_into().unwrap(); let aes_cipher11 = Aes256::new(&key11.into()); aes_cipher11.encrypt_block(block128.into()); @@ -121,14 +121,14 @@ fn test_aes_gcm( let cipher1 = Aes256Gcm::new(&key1); let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); - let key2: [u8;32] = [0;32]; // $ Alert[rust/hardcoded-crytographic-value] - let nonce2 = [0;12]; // $ Alert[rust/hardcoded-crytographic-value] + let key2: [u8;32] = [0;32]; // $ Alert[rust/hardcoded-cryptographic-value] + let nonce2 = [0;12]; // $ Alert[rust/hardcoded-cryptographic-value] let cipher2 = Aes256Gcm::new(&key2.into()); // $ Sink let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ Sink - let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hardcoded-crytographic-value] + let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hardcoded-cryptographic-value] let key3 = Key::::from_slice(key3_array); - let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hardcoded-crytographic-value] + let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hardcoded-cryptographic-value] let cipher3 = Aes256Gcm::new(&key3); // $ Sink let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink } From 19416a9ee3038a6c3d4bb62ce25af6c7d83c5972 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 15:43:34 +0000 Subject: [PATCH 14/35] Rust: Correct test results. --- .../diagnostics/SummaryStats.expected | 6 +-- .../HardcodedCryptographicValue.expected | 39 ++++++++----------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected index b9a96cdecfdc..972c5f261772 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected @@ -14,11 +14,7 @@ | Macro calls - resolved | 8 | | Macro calls - total | 9 | | Macro calls - unresolved | 1 | -<<<<<<< HEAD -| Taint edges - number of edges | 1475 | -======= -| Taint edges - number of edges | 1670 | ->>>>>>> main +| Taint edges - number of edges | 1674 | | Taint reach - nodes tainted | 0 | | Taint reach - per million nodes | 0 | | Taint sinks - cryptographic operations | 0 | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index a09f89d21276..a8ce502c403a 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -19,49 +19,49 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:82 Sink:MaD:82 Sink:MaD:82 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:83 Sink:MaD:83 Sink:MaD:83 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:58 Sink:MaD:58 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:60 Sink:MaD:60 | | test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:0 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:58 Sink:MaD:58 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:60 Sink:MaD:60 | | test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:0 | -| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:37 | const9 | provenance | | +| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:104 | | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:46:32:46:37 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:104 | | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:101 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:58 Sink:MaD:58 Sink:MaD:58 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | +| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:76 Sink:MaD:76 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | @@ -69,28 +69,28 @@ edges | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:84 Sink:MaD:84 Sink:MaD:84 | | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:68 | const6 [&ref, element] | provenance | | +| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:86 Sink:MaD:86 | | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | +| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:103 | | test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:87 Sink:MaD:87 | -| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:38 | key2 [element] | provenance | | +| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | | test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:25:124:30 | [0; 32] [element] | provenance | | -| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:35 | nonce2 [element] | provenance | | +| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | | test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | -| test_cipher.rs:126:35:126:38 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | | test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | -| test_cipher.rs:127:30:127:35 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | | test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | @@ -99,14 +99,13 @@ edges | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | provenance | | | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | provenance | | | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | -| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:35 | nonce3 [element] | provenance | | +| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | test_cipher.rs:131:9:131:14 | nonce3 [element] | provenance | | | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | provenance | | | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 Sink:MaD:90 | | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | -| test_cipher.rs:133:30:133:35 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:102 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | @@ -145,7 +144,6 @@ nodes | test_cipher.rs:45:9:45:14 | const9 | semmle.label | const9 | | test_cipher.rs:45:27:45:50 | [...] | semmle.label | [...] | | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | -| test_cipher.rs:46:32:46:37 | const9 | semmle.label | const9 | | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | semmle.label | const9.align_to(...) [tuple.1, &ref, element] | | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | semmle.label | ... .1 [&ref, element] | | test_cipher.rs:47:30:47:47 | ...::new | semmle.label | ...::new | @@ -193,11 +191,9 @@ nodes | test_cipher.rs:125:19:125:19 | 0 | semmle.label | 0 | | test_cipher.rs:126:19:126:32 | ...::new | semmle.label | ...::new | | test_cipher.rs:126:34:126:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:126:35:126:38 | key2 [element] | semmle.label | key2 [element] | | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | semmle.label | key2.into(...) [element] | | test_cipher.rs:127:21:127:27 | encrypt | semmle.label | encrypt | | test_cipher.rs:127:29:127:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:127:30:127:35 | nonce2 [element] | semmle.label | nonce2 [element] | | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | semmle.label | nonce2.into(...) [element] | | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | semmle.label | key3_array [&ref, element] | | test_cipher.rs:129:32:129:41 | &... [&ref, element] | semmle.label | &... [&ref, element] | @@ -214,6 +210,5 @@ nodes | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | semmle.label | key3 [&ref, element] | | test_cipher.rs:133:21:133:27 | encrypt | semmle.label | encrypt | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:133:30:133:35 | nonce3 [element] | semmle.label | nonce3 [element] | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | semmle.label | nonce3.into(...) [element] | subpaths From c63c1be11ca844b686cb71c16cb0e45f668d6450 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:12:31 +0000 Subject: [PATCH 15/35] Rust: Accept integration test .expected changes. --- rust/ql/integration-tests/hello-project/summary.expected | 2 +- .../ql/integration-tests/hello-workspace/summary.cargo.expected | 2 +- .../hello-workspace/summary.rust-project.expected | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/integration-tests/hello-project/summary.expected b/rust/ql/integration-tests/hello-project/summary.expected index 2ffb1f4e34f7..68ee47035bc1 100644 --- a/rust/ql/integration-tests/hello-project/summary.expected +++ b/rust/ql/integration-tests/hello-project/summary.expected @@ -14,7 +14,7 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | -| Taint edges - number of edges | 1670 | +| Taint edges - number of edges | 1674 | | Taint reach - nodes tainted | 0 | | Taint reach - per million nodes | 0 | | Taint sinks - cryptographic operations | 0 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected index d08ce1a41166..caf7b2b8cd9c 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected @@ -14,7 +14,7 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | -| Taint edges - number of edges | 1670 | +| Taint edges - number of edges | 1674 | | Taint reach - nodes tainted | 0 | | Taint reach - per million nodes | 0 | | Taint sinks - cryptographic operations | 0 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected index d08ce1a41166..caf7b2b8cd9c 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected @@ -14,7 +14,7 @@ | Macro calls - resolved | 2 | | Macro calls - total | 2 | | Macro calls - unresolved | 0 | -| Taint edges - number of edges | 1670 | +| Taint edges - number of edges | 1674 | | Taint reach - nodes tainted | 0 | | Taint reach - per million nodes | 0 | | Taint sinks - cryptographic operations | 0 | From 3dc35f1fabe6435eb65a38b5aa21f4326a3563d7 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 17:02:26 +0000 Subject: [PATCH 16/35] Rust: Accept more test changes. --- .../dataflow/local/DataFlowStep.expected | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index e403311345cc..26ffdc13df64 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1946,6 +1946,10 @@ models | 1058 | Summary: lang:std; crate::thread::current::set_current; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | | 1059 | Summary: lang:std; crate::thread::current::try_with_current; Argument[0].ReturnValue; ReturnValue; value | | 1060 | Summary: lang:std; crate::thread::with_current_name; Argument[0].ReturnValue; ReturnValue; value | +| 1061 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_mut_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 1062 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 1063 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::try_from_mut_slice; Argument[0].Reference; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | +| 1064 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::try_from_slice; Argument[0].Reference; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | storeStep | file://:0:0:0:0 | [summary] to write: Argument[0].Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::::zip_with | | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0].Reference in lang:alloc::_::::retain | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0] in lang:alloc::_::::retain | @@ -2034,6 +2038,7 @@ storeStep | file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | | file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | | file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<_ as crate::convert::Into>::into | | file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::::collect | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::collect | | file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::cmp::minmax | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::cmp::minmax | | file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::cmp::minmax_by | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::cmp::minmax_by | @@ -2071,12 +2076,20 @@ storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:std::_::::into_parts | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::into_parts | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::unzip | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference in lang:core::_::<[_]>::align_to | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:alloc::_::::find_lower_bound_edge | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::find_lower_bound_edge | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:alloc::_::::find_upper_bound_edge | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::find_upper_bound_edge | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::<[_]>::align_to | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::::unzip | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unzip | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::crate::slice::sort::shared::find_existing_run | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::slice::sort::shared::find_existing_run | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:std::_::::into_parts | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::into_parts | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::::unzip | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2] in lang:core::_::<[_]>::align_to | tuple.2 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2] in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference in lang:core::_::<[_]>::align_to | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::then | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::then | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::then_some | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::then_some | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::nth_back | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::nth_back | @@ -2209,6 +2222,8 @@ storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_while | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait_while | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::try_with | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_with | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::crate::sys::pal::unix::cvt | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::crate::sys::pal::unix::cvt | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | @@ -2225,6 +2240,8 @@ storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::try_insert | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_insert | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_mut | | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_ref | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | @@ -2304,6 +2321,8 @@ storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_file_desc | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_file_desc | | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | | file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | +| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | | main.rs:97:14:97:22 | source(...) | tuple.0 | main.rs:97:13:97:26 | TupleExpr | | main.rs:97:25:97:25 | 2 | tuple.1 | main.rs:97:13:97:26 | TupleExpr | | main.rs:103:14:103:14 | 2 | tuple.0 | main.rs:103:13:103:30 | TupleExpr | @@ -2493,6 +2512,10 @@ readStep | file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::sys_common::ignore_notfound | Err | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Err(0)] in lang:std::_::crate::sys_common::ignore_notfound | | file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::thread::current::try_with_current | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::thread::current::try_with_current | | file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::thread::with_current_name | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::thread::with_current_name | +| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | +| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | +| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | +| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | | file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::::fold | | file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::crate::collections::btree::mem::replace | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::crate::collections::btree::mem::replace | | file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::crate::collections::btree::mem::take_mut | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::crate::collections::btree::mem::take_mut | @@ -2629,6 +2652,9 @@ readStep | file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | | file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::ops::deref::Deref>::deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::ops::deref::Deref>::deref | | file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::ops::deref::DerefMut>::deref_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::ops::deref::DerefMut>::deref_mut | +| file://:0:0:0:0 | [summary param] self in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::<[_]>::align_to | +| file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::convert::Into>::into | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::convert::Into>::into | +| file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::<_ as crate::convert::Into>::into | | file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | | file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | | file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | @@ -2923,6 +2949,7 @@ readStep | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | +| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Element in lang:core::_::<_ as crate::convert::Into>::into | | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | function return | file://:0:0:0:0 | [summary] read: Argument[self].Reference.ReturnValue in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::as_mut | | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::as_ref | From b4e710f459636b286cc344f9e0b31c9040ab5481 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 21:25:15 +0000 Subject: [PATCH 17/35] Rust: Add missing models (for some platforms???). --- .../rustcrypto/rustcrypto.model.yml | 3 ++ .../HardcodedCryptographicValue.expected | 54 +++++++++---------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index 2047cfa9ebcd..3c588473514c 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -9,6 +9,7 @@ extensions: - ["repo:https://github.com/RustCrypto/traits:digest", "<_ as crate::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/stainless-steel/md5:md5", "crate::compute", "Argument[0]", "hasher-input", "manual"] - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[1]", "credentials-iv", "manual"] - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[1]", "credentials-iv", "manual"] @@ -28,6 +29,8 @@ extensions: - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] + - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index a8ce502c403a..726934d5d985 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -19,78 +19,78 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:62 Sink:MaD:62 Sink:MaD:62 | | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:60 Sink:MaD:60 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:61 Sink:MaD:61 | | test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:0 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:60 Sink:MaD:60 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:61 Sink:MaD:61 | | test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:0 | -| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:104 | +| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:107 | | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | +| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:101 | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:104 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:60 Sink:MaD:60 Sink:MaD:60 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | -| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:106 | | test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:102 | -| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:76 Sink:MaD:76 | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:77 Sink:MaD:77 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:84 Sink:MaD:84 Sink:MaD:84 | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:87 Sink:MaD:87 Sink:MaD:87 | | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:68 | const6 [&ref, element] | provenance | | -| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:106 | | test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:102 | -| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:86 Sink:MaD:86 | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:89 Sink:MaD:89 | | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | -| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:103 | +| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:106 | | test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:102 | -| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:87 Sink:MaD:87 | -| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:90 Sink:MaD:90 | +| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:105 | | test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | | test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:25:124:30 | [0; 32] [element] | provenance | | -| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:105 | | test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | -| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | -| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | | test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | @@ -99,13 +99,13 @@ edges | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | provenance | | | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | provenance | | | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | -| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:102 | +| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:105 | | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | test_cipher.rs:131:9:131:14 | nonce3 [element] | provenance | | | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | provenance | | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:90 Sink:MaD:90 Sink:MaD:90 Sink:MaD:90 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 Sink:MaD:93 | | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | -| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:91 Sink:MaD:91 Sink:MaD:91 | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | From e84a98bd975a4bd23ccaa6e375b205cac0d076c5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:15:23 +0000 Subject: [PATCH 18/35] Apply suggestions from code review Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com> --- .../security/CWE-798/HardcodedCryptographicValue.qhelp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp index b44a98013c89..f3b2d8319443 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp @@ -5,7 +5,7 @@

    -Hardcoded passwords, keys, initialization vectors and salts should not be used for cryptographic operations. +Hardcoded passwords, keys, initialization vectors, and salts should not be used for cryptographic operations.

    • @@ -23,7 +23,7 @@ Hardcoded passwords, keys, initialization vectors and salts should not be used f

      -Use randomly generated key material, initialization vectors and salts. Use strong passwords that are not hardcoded. +Use randomly generated key material, initialization vectors, and salts. Use strong passwords that are not hardcoded.

      From a34f9bef2b271019505276215e7c2d1b29e38c3a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:33:29 +0000 Subject: [PATCH 19/35] Rust: Add a test case for getrandom. --- .../HardcodedCryptographicValue.expected | 24 +++++++++++++++++++ .../query-tests/security/CWE-798/options.yml | 2 ++ .../security/CWE-798/test_cipher.rs | 9 +++++++ 3 files changed, 35 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 726934d5d985..17ac5044b05b 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -14,6 +14,8 @@ | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:127:21:127:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:127:21:127:27 | encrypt | a nonce | | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:132:19:132:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:132:19:132:32 | ...::new | a key | | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:133:21:133:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:133:21:133:27 | encrypt | a nonce | +| test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:141:19:141:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:141:19:141:32 | ...::new | a key | +| test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:142:21:142:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:142:21:142:27 | encrypt | a nonce | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | @@ -107,6 +109,16 @@ edges | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | +| test_cipher.rs:137:9:137:16 | mut key4 [element] | test_cipher.rs:141:35:141:45 | key4.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | test_cipher.rs:137:9:137:16 | mut key4 [element] | provenance | | +| test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:138:9:138:18 | mut nonce4 [element] | test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | test_cipher.rs:138:9:138:18 | mut nonce4 [element] | provenance | | +| test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | provenance | | +| test_cipher.rs:141:34:141:45 | &... [&ref, element] | test_cipher.rs:141:19:141:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | +| test_cipher.rs:141:35:141:45 | key4.into(...) [element] | test_cipher.rs:141:34:141:45 | &... [&ref, element] | provenance | | +| test_cipher.rs:142:29:142:42 | &... [&ref, element] | test_cipher.rs:142:21:142:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | +| test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | test_cipher.rs:142:29:142:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | @@ -211,4 +223,16 @@ nodes | test_cipher.rs:133:21:133:27 | encrypt | semmle.label | encrypt | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | semmle.label | nonce3.into(...) [element] | +| test_cipher.rs:137:9:137:16 | mut key4 [element] | semmle.label | mut key4 [element] | +| test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:137:21:137:23 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:138:9:138:18 | mut nonce4 [element] | semmle.label | mut nonce4 [element] | +| test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | semmle.label | [0u8; 12] [element] | +| test_cipher.rs:138:23:138:25 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:141:19:141:32 | ...::new | semmle.label | ...::new | +| test_cipher.rs:141:34:141:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:141:35:141:45 | key4.into(...) [element] | semmle.label | key4.into(...) [element] | +| test_cipher.rs:142:21:142:27 | encrypt | semmle.label | encrypt | +| test_cipher.rs:142:29:142:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | semmle.label | nonce4.into(...) [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/options.yml b/rust/ql/test/query-tests/security/CWE-798/options.yml index aff715ea271b..6713251d3ebd 100644 --- a/rust/ql/test/query-tests/security/CWE-798/options.yml +++ b/rust/ql/test/query-tests/security/CWE-798/options.yml @@ -6,3 +6,5 @@ qltest_dependencies: - aes-gcm = { version = "0.10.3" } - cfb-mode = { version = "0.8.2" } - base64 = { version = "0.22.1" } + - getrandom = { version = "0.3.1" } + - getrandom2 = { package = "getrandom", version = "0.2.15" } diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 7a5ef0572fd9..a72eaebb303f 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -131,4 +131,13 @@ fn test_aes_gcm( let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hardcoded-cryptographic-value] let cipher3 = Aes256Gcm::new(&key3); // $ Sink let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink + + // with barrier + + let mut key4 = [0u8;32]; // $ SPURIOUS: Alert[rust/hardcoded-cryptographic-value] + let mut nonce4 = [0u8;12]; // $ SPURIOUS: Alert[rust/hardcoded-cryptographic-value] + _ = getrandom::fill(&mut key4).unwrap(); + _ = getrandom2::getrandom(&mut nonce4).unwrap(); + let cipher4 = Aes256Gcm::new(&key4.into()); // $ Sink + let _ = cipher2.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); // $ Sink } From 9e54d5353743bdff81581b465c1914e3899cbee2 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:40:29 +0000 Subject: [PATCH 20/35] Rust: Add barrier. --- .../HardcodedCryptographicValueExtensions.qll | 14 +++++++++++ .../HardcodedCryptographicValue.expected | 24 ------------------- .../security/CWE-798/test_cipher.rs | 8 +++---- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 32f64051fcb3..b6ed9d6091ef 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -89,4 +89,18 @@ module HardcodedCryptographicValue { override CryptographicValueKind getKind() { result = kind } } + + /** + * A call to `getrandom` that is a barrier. + */ + private class GetRandomBarrier extends Barrier { + GetRandomBarrier() { + exists(CallExpr ce | + ce.getFunction().(PathExpr).getResolvedCrateOrigin() = + "repo:https://github.com/rust-random/getrandom:getrandom" and + ce.getFunction().(PathExpr).getResolvedPath() = ["crate::fill", "crate::getrandom"] and + this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) + ) + } + } } diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 17ac5044b05b..726934d5d985 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -14,8 +14,6 @@ | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:127:21:127:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:127:21:127:27 | encrypt | a nonce | | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:132:19:132:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:132:19:132:32 | ...::new | a key | | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:133:21:133:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:133:21:133:27 | encrypt | a nonce | -| test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:141:19:141:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:141:19:141:32 | ...::new | a key | -| test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:142:21:142:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:142:21:142:27 | encrypt | a nonce | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | @@ -109,16 +107,6 @@ edges | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | -| test_cipher.rs:137:9:137:16 | mut key4 [element] | test_cipher.rs:141:35:141:45 | key4.into(...) [element] | provenance | MaD:105 | -| test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | test_cipher.rs:137:9:137:16 | mut key4 [element] | provenance | | -| test_cipher.rs:137:21:137:23 | 0u8 | test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:138:9:138:18 | mut nonce4 [element] | test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | provenance | MaD:105 | -| test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | test_cipher.rs:138:9:138:18 | mut nonce4 [element] | provenance | | -| test_cipher.rs:138:23:138:25 | 0u8 | test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | provenance | | -| test_cipher.rs:141:34:141:45 | &... [&ref, element] | test_cipher.rs:141:19:141:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | -| test_cipher.rs:141:35:141:45 | key4.into(...) [element] | test_cipher.rs:141:34:141:45 | &... [&ref, element] | provenance | | -| test_cipher.rs:142:29:142:42 | &... [&ref, element] | test_cipher.rs:142:21:142:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | -| test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | test_cipher.rs:142:29:142:42 | &... [&ref, element] | provenance | | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | @@ -223,16 +211,4 @@ nodes | test_cipher.rs:133:21:133:27 | encrypt | semmle.label | encrypt | | test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | semmle.label | nonce3.into(...) [element] | -| test_cipher.rs:137:9:137:16 | mut key4 [element] | semmle.label | mut key4 [element] | -| test_cipher.rs:137:20:137:27 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | -| test_cipher.rs:137:21:137:23 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:138:9:138:18 | mut nonce4 [element] | semmle.label | mut nonce4 [element] | -| test_cipher.rs:138:22:138:29 | [0u8; 12] [element] | semmle.label | [0u8; 12] [element] | -| test_cipher.rs:138:23:138:25 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:141:19:141:32 | ...::new | semmle.label | ...::new | -| test_cipher.rs:141:34:141:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:141:35:141:45 | key4.into(...) [element] | semmle.label | key4.into(...) [element] | -| test_cipher.rs:142:21:142:27 | encrypt | semmle.label | encrypt | -| test_cipher.rs:142:29:142:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:142:30:142:42 | nonce4.into(...) [element] | semmle.label | nonce4.into(...) [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index a72eaebb303f..2bf36213176f 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -134,10 +134,10 @@ fn test_aes_gcm( // with barrier - let mut key4 = [0u8;32]; // $ SPURIOUS: Alert[rust/hardcoded-cryptographic-value] - let mut nonce4 = [0u8;12]; // $ SPURIOUS: Alert[rust/hardcoded-cryptographic-value] + let mut key4 = [0u8;32]; + let mut nonce4 = [0u8;12]; _ = getrandom::fill(&mut key4).unwrap(); _ = getrandom2::getrandom(&mut nonce4).unwrap(); - let cipher4 = Aes256Gcm::new(&key4.into()); // $ Sink - let _ = cipher2.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); // $ Sink + let cipher4 = Aes256Gcm::new(&key4.into()); + let _ = cipher2.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); } From 1ca5c593f9713f80973a52ee7d49055d568eb34d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:47:23 +0000 Subject: [PATCH 21/35] Rust: Replace imports of internal.DataFlowImpl where possible. --- .../ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll | 2 +- .../rust/security/HardcodedCryptographicValueExtensions.qll | 3 ++- rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll | 2 +- rust/ql/src/queries/summary/Stats.qll | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll index bfe6da7ac82c..a2e737627b5f 100644 --- a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll @@ -5,7 +5,7 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.dataflow.FlowSink private import codeql.rust.security.SensitiveData /** diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index b6ed9d6091ef..5497cc0c99da 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -5,7 +5,8 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.dataflow.FlowSource +private import codeql.rust.dataflow.FlowSink private import codeql.rust.security.SensitiveData /** diff --git a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll index 4de712080044..78b87e4715b3 100644 --- a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll @@ -6,7 +6,7 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.dataflow.FlowSink private import codeql.rust.Concepts private import codeql.util.Unit diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 04c4bcf4e179..85e3357e680e 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -4,7 +4,6 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.rust.dataflow.internal.TaintTrackingImpl private import codeql.rust.internal.AstConsistency as AstConsistency private import codeql.rust.controlflow.internal.CfgConsistency as CfgConsistency From e3beacbda20020f53c883d28c3302d9e61032453 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:35:59 +0000 Subject: [PATCH 22/35] Rust: Print models (temporary, to see how this differs on CI). --- .../HardcodedCryptographicValue.expected | 84 +++++++++++-------- .../CWE-798/HardcodedCryptographicValue.qlref | 4 +- 2 files changed, 52 insertions(+), 36 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 726934d5d985..86c2812d1620 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -19,78 +19,78 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | -| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | -| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:62 Sink:MaD:62 Sink:MaD:62 | -| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:61 Sink:MaD:61 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:0 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:61 Sink:MaD:61 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:0 | -| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:107 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:10 | | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | -| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:104 | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:9 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:61 Sink:MaD:61 Sink:MaD:61 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | -| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:106 | +| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:12 | | test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:105 | -| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:77 Sink:MaD:77 | +| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:11 | +| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:2 Sink:MaD:2 | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:87 Sink:MaD:87 Sink:MaD:87 | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:8 Sink:MaD:8 Sink:MaD:8 | | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:68 | const6 [&ref, element] | provenance | | -| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:106 | +| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:12 | | test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:105 | -| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:89 Sink:MaD:89 | +| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:11 | +| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:7 Sink:MaD:7 | | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | -| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:106 | +| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:12 | | test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:105 | -| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:90 Sink:MaD:90 | -| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:11 | +| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:6 Sink:MaD:6 | +| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:11 | | test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | | test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:25:124:30 | [0; 32] [element] | provenance | | -| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:11 | | test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | -| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | -| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | | test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | @@ -98,15 +98,29 @@ edges | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | provenance | | | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | provenance | | | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | provenance | | -| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:0 | -| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:105 | +| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | +| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:11 | | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | test_cipher.rs:131:9:131:14 | nonce3 [element] | provenance | | | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | provenance | | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:93 Sink:MaD:93 Sink:MaD:93 Sink:MaD:93 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | -| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:94 Sink:MaD:94 Sink:MaD:94 | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | +models +| 1 | Sink: repo:https://github.com/RustCrypto/AEADs:aes-gcm; ::new; credentials-key; Argument[0] | +| 2 | Sink: repo:https://github.com/RustCrypto/block-ciphers:aes; ::new; credentials-key; Argument[0] | +| 3 | Sink: repo:https://github.com/RustCrypto/traits:aead; <_ as crate::Aead>::encrypt; credentials-nonce; Argument[0] | +| 4 | Sink: repo:https://github.com/RustCrypto/traits:cipher; ::new; credentials-iv; Argument[1] | +| 5 | Sink: repo:https://github.com/RustCrypto/traits:cipher; ::new; credentials-key; Argument[0] | +| 6 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; <_ as crate::KeyIvInit>::new; credentials-iv; Argument[1] | +| 7 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; <_ as crate::KeyIvInit>::new; credentials-key; Argument[0] | +| 8 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; crate::KeyInit::new_from_slice; credentials-key; Argument[0] | +| 9 | Source: lang:core; crate::mem::zeroed; constant-source; ReturnValue.Element | +| 10 | Summary: lang:core; <[_]>::align_to; Argument[self].Element; ReturnValue.Field[0,1,2].Reference.Element; taint | +| 11 | Summary: lang:core; <_ as crate::convert::Into>::into; Argument[self].Element; ReturnValue.Element; taint | +| 12 | Summary: lang:core; <_ as crate::convert::Into>::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 13 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref index 99053e9bf1a9..77c0b90160ca 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref @@ -1,2 +1,4 @@ query: queries/security/CWE-798/HardcodedCryptographicValue.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql From a0f4fa28b2a50a077c380646bb2828da85b3426d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 11 Mar 2025 09:30:01 +0000 Subject: [PATCH 23/35] Rust: hardcoded -> hard-coded. --- .../HardcodedCryptographicValueExtensions.qll | 12 +++---- .../CWE-798/HardcodedCryptographicValue.qhelp | 14 ++++---- .../CWE-798/HardcodedCryptographicValue.ql | 6 ++-- .../CWE-798/HardcodedCryptographicValueBad.rs | 2 +- .../security/CWE-798/test_cipher.rs | 36 +++++++++---------- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 5497cc0c99da..80fdcfd217e6 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -1,5 +1,5 @@ /** - * Provides classes and predicates for reasoning about hardcoded cryptographic value + * Provides classes and predicates for reasoning about hard-coded cryptographic value * vulnerabilities. */ @@ -32,17 +32,17 @@ class CryptographicValueKind extends string { } /** - * Provides default sources, sinks and barriers for detecting hardcoded cryptographic + * Provides default sources, sinks and barriers for detecting hard-coded cryptographic * value vulnerabilities, as well as extension points for adding your own. */ module HardcodedCryptographicValue { /** - * A data flow source for hardcoded cryptographic value vulnerabilities. + * A data flow source for hard-coded cryptographic value vulnerabilities. */ abstract class Source extends DataFlow::Node { } /** - * A data flow sink for hardcoded cryptographic value vulnerabilities. + * A data flow sink for hard-coded cryptographic value vulnerabilities. */ abstract class Sink extends DataFlow::Node { /** @@ -52,7 +52,7 @@ module HardcodedCryptographicValue { } /** - * A barrier for hardcoded cryptographic value vulnerabilities. + * A barrier for hard-coded cryptographic value vulnerabilities. */ abstract class Barrier extends DataFlow::Node { } @@ -81,7 +81,7 @@ module HardcodedCryptographicValue { } /** - * An externally modeled sink for hardcoded cryptographic value vulnerabilities. + * An externally modeled sink for hard-coded cryptographic value vulnerabilities. */ private class ModelsAsDataSinks extends Sink { CryptographicValueKind kind; diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp index f3b2d8319443..3a6813cdef09 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp @@ -5,17 +5,17 @@

      -Hardcoded passwords, keys, initialization vectors, and salts should not be used for cryptographic operations. +Hard-coded passwords, keys, initialization vectors, and salts should not be used for cryptographic operations.

      • - Attackers can easily recover hardcoded values if they have access to the source code or compiled executable. + Attackers can easily recover hard-coded values if they have access to the source code or compiled executable.
      • - Some hardcoded values are easily guessable. + Some hard-coded values are easily guessable.
      • - Use of hardcoded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis. + Use of hard-coded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis.
      @@ -23,20 +23,20 @@ Hardcoded passwords, keys, initialization vectors, and salts should not be used

      -Use randomly generated key material, initialization vectors, and salts. Use strong passwords that are not hardcoded. +Use randomly generated key material, initialization vectors, and salts. Use strong passwords that are not hard-coded.

      -The following example shows instantiating a cipher with hardcoded key material, making the encrypted data vulnerable to recovery. +The following example shows instantiating a cipher with hard-coded key material, making the encrypted data vulnerable to recovery.

      -In the fixed code below, the key material is randomly generated and not hardcoded, which protects the encrypted data against recovery. A real application would also need a strategy for secure key management after the key has been generated. +In the fixed code below, the key material is randomly generated and not hard-coded, which protects the encrypted data against recovery. A real application would also need a strategy for secure key management after the key has been generated.

      diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index 3fb9d4d74a2d..fee36ba2ab21 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -1,12 +1,12 @@ /** * @name Hard-coded cryptographic value - * @description Using hardcoded keys, passwords, salts or initialization + * @description Using hard-coded keys, passwords, salts or initialization * vectors is not secure. * @kind path-problem * @problem.severity warning * @security-severity 9.8 * @precision high - * @id rust/hardcoded-cryptographic-value + * @id rust/hard-coded-cryptographic-value * @tags security * external/cwe/cwe-259 * external/cwe/cwe-321 @@ -21,7 +21,7 @@ import codeql.rust.dataflow.TaintTracking import codeql.rust.dataflow.internal.DataFlowImpl /** - * A taint-tracking configuration for hardcoded cryptographic value vulnerabilities. + * A taint-tracking configuration for hard-coded cryptographic value vulnerabilities. */ module HardcodedCryptographicValueConfig implements DataFlow::ConfigSig { import HardcodedCryptographicValue diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs index c1923df1730f..11dacfc08c42 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs @@ -1,2 +1,2 @@ -let key: [u8;32] = [0;32]; // BAD: Using hardcoded keys for encryption +let key: [u8;32] = [0;32]; // BAD: Using hard-coded keys for encryption let cipher = Aes256Gcm::new(&key.into()); diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 2bf36213176f..fc7a464e70c5 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -15,18 +15,18 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher1 = RabbitKeyOnly::new(rabbit::Key::from_slice(key)); rabbit_cipher1.apply_keystream(&mut data); - let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] + let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); // $ Sink rabbit_cipher2.apply_keystream(&mut data); let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); rabbit_cipher3.apply_keystream(&mut data); - let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] + let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); // $ Sink rabbit_cipher4.apply_keystream(&mut data); - let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hardcoded-cryptographic-value] + let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); // $ Sink rabbit_cipher5.apply_keystream(&mut data); @@ -34,20 +34,20 @@ fn test_stream_cipher_rabbit( let const6: &[u8;16] = &[0u8;16]; // (unused, so good) - let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] + let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); // $ Sink rabbit_cipher7.apply_keystream(&mut data); - let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] + let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink rabbit_cipher8.apply_keystream(&mut data); - let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hardcoded-cryptographic-value] + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ Sink rabbit_cipher9.apply_keystream(&mut data); - let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hardcoded-cryptographic-value] + let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hard-coded-cryptographic-value] let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); // $ Sink rabbit_cipher10.apply_keystream(&mut data); } @@ -63,25 +63,25 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] + let const2 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] let aes_cipher2 = Aes256::new(const2.into()); // $ Sink aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); aes_cipher3.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] + let const2 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); // $ Sink aes_cipher4.encrypt_block(block128.into()); let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const6 = &[0u8;32]; // $ Alert[rust/hardcoded-cryptographic-value] + let const6 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ Sink _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const7 = &[0u8; 16]; // $ Alert[rust/hardcoded-cryptographic-value] + let const7 = &[0u8; 16]; // $ Alert[rust/hard-coded-cryptographic-value] let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ Sink _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); @@ -91,18 +91,18 @@ fn test_block_cipher_aes( let aes_cipher8 = cfb_mode::Encryptor::::new(key8.into(), iv.into()); _ = aes_cipher8.encrypt_b2b(input, output).unwrap(); - let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hardcoded-cryptographic-value] + let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hard-coded-cryptographic-value] let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); _ = aes_cipher9.encrypt_b2b(input, output).unwrap(); let key10: [u8; 32] = match base64::engine::general_purpose::STANDARD.decode(key_str) { Ok(x) => x.try_into().unwrap(), - Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hardcoded-cryptographic-value] + Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hard-coded-cryptographic-value] }; let aes_cipher10 = Aes256::new(&key10.into()); aes_cipher10.encrypt_block(block128.into()); - if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hardcoded-cryptographic-value] + if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hard-coded-cryptographic-value] let key11: [u8; 32] = const11.try_into().unwrap(); let aes_cipher11 = Aes256::new(&key11.into()); aes_cipher11.encrypt_block(block128.into()); @@ -121,14 +121,14 @@ fn test_aes_gcm( let cipher1 = Aes256Gcm::new(&key1); let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); - let key2: [u8;32] = [0;32]; // $ Alert[rust/hardcoded-cryptographic-value] - let nonce2 = [0;12]; // $ Alert[rust/hardcoded-cryptographic-value] + let key2: [u8;32] = [0;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let nonce2 = [0;12]; // $ Alert[rust/hard-coded-cryptographic-value] let cipher2 = Aes256Gcm::new(&key2.into()); // $ Sink let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ Sink - let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hardcoded-cryptographic-value] + let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::::from_slice(key3_array); - let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hardcoded-cryptographic-value] + let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hard-coded-cryptographic-value] let cipher3 = Aes256Gcm::new(&key3); // $ Sink let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink From 704b3850f42d5b3750238464ccbd468d37d0af46 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:24:58 +0000 Subject: [PATCH 24/35] Rust: Fix a mistake in the test. --- rust/ql/test/query-tests/security/CWE-798/test_cipher.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index fc7a464e70c5..79dfbabbd989 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -139,5 +139,5 @@ fn test_aes_gcm( _ = getrandom::fill(&mut key4).unwrap(); _ = getrandom2::getrandom(&mut nonce4).unwrap(); let cipher4 = Aes256Gcm::new(&key4.into()); - let _ = cipher2.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); + let _ = cipher4.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); } From f5daec9da0fef7b56a2b0f4df6bd2e0b59079495 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 17 Mar 2025 12:10:59 +0000 Subject: [PATCH 25/35] Rust: Fix after merge. --- .../src/queries/security/CWE-798/HardcodedCryptographicValue.ql | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index fee36ba2ab21..cd0dca79119b 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -19,6 +19,7 @@ import codeql.rust.security.HardcodedCryptographicValueExtensions import codeql.rust.dataflow.DataFlow import codeql.rust.dataflow.TaintTracking import codeql.rust.dataflow.internal.DataFlowImpl +import codeql.rust.dataflow.internal.Content /** * A taint-tracking configuration for hard-coded cryptographic value vulnerabilities. From 07011f74601fd7fc54848a1ac53534f43ba56ca8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 17 Mar 2025 12:22:09 +0000 Subject: [PATCH 26/35] Rust: Fix more after merge. --- rust/ql/src/queries/summary/Stats.qll | 3 --- 1 file changed, 3 deletions(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index c1914f68ed81..0df8a8b317f8 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -69,7 +69,6 @@ int getTaintEdgesCount() { } /** -<<<<<<< HEAD * Gets a kind of query for which `n` is a sink (if any). */ string getAQuerySinkKind(DataFlow::Node n) { @@ -81,8 +80,6 @@ string getAQuerySinkKind(DataFlow::Node n) { } /** -======= ->>>>>>> main * Gets a count of the total number of query sinks in the database. */ int getQuerySinksCount() { result = count(QuerySink s) } From 898c569f1b3287a1a33ac47d83e8f396b17af886 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:37:54 +0100 Subject: [PATCH 27/35] Rust: Change note. --- .../change-notes/2025-06-24-hardcoded-cryptographic-value.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2025-06-24-hardcoded-cryptographic-value.md diff --git a/rust/ql/src/change-notes/2025-06-24-hardcoded-cryptographic-value.md b/rust/ql/src/change-notes/2025-06-24-hardcoded-cryptographic-value.md new file mode 100644 index 000000000000..73bd81f03408 --- /dev/null +++ b/rust/ql/src/change-notes/2025-06-24-hardcoded-cryptographic-value.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `rust/hardcoded-crytographic-value`, for detecting use of hardcoded keys, passwords, salts and initialization vectors. From 0ec10e5c3031e17e53703fb3da78f427caeccfd7 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 17 Jul 2025 17:10:45 +0100 Subject: [PATCH 28/35] Rust: Corrections after the merge. --- .../rust/frameworks/genericarray.model.yml | 2 +- .../frameworks/stdlib/lang-core.model.yml | 4 +- .../HardcodedCryptographicValueExtensions.qll | 5 +- rust/ql/src/queries/summary/Stats.qll | 20 +- .../dataflow/local/DataFlowStep.expected | 2234 ----------------- .../HardcodedCryptographicValue.expected | 255 +- 6 files changed, 42 insertions(+), 2478 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml index 29a72e2666c2..ec88db8d5dab 100644 --- a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml @@ -1,7 +1,7 @@ extensions: - addsTo: pack: codeql/rust-all - extensible: summaryModel + extensible: summaryModelDeprecated data: - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_mut_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index 256473e8f95a..e3d9e419dd4c 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -1,7 +1,7 @@ extensions: - addsTo: pack: codeql/rust-all - extensible: sourceModel + extensible: sourceModelDeprecated data: - ["lang:core", "crate::mem::zeroed", "ReturnValue.Element", "constant-source", "manual"] - addsTo: @@ -12,8 +12,6 @@ extensions: - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] - ["lang:core", "<[_]>::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] - # Fmt - - ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 80fdcfd217e6..f92af99375f1 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -7,6 +7,7 @@ import rust private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink +private import codeql.rust.Concepts private import codeql.rust.security.SensitiveData /** @@ -44,7 +45,9 @@ module HardcodedCryptographicValue { /** * A data flow sink for hard-coded cryptographic value vulnerabilities. */ - abstract class Sink extends DataFlow::Node { + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "HardcodedCryptographicValue" } + /** * Gets the kind of credential this sink is interpreted as. */ diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 1e1f565c14e8..ba528a794338 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -4,6 +4,7 @@ import rust private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.rust.dataflow.internal.TaintTrackingImpl private import codeql.rust.internal.AstConsistency as AstConsistency private import codeql.rust.internal.PathResolutionConsistency as PathResolutionConsistency @@ -16,15 +17,15 @@ private import codeql.rust.Diagnostics private import codeql.rust.security.SensitiveData private import TaintReach // import all query extensions files, so that all extensions of `QuerySink` are found -private import codeql.rust.security.CleartextLoggingExtensions -private import codeql.rust.security.HardcodedCryptographicValueExtensions -private import codeql.rust.security.SqlInjectionExtensions -private import codeql.rust.security.WeakSensitiveDataHashingExtensions private import codeql.rust.security.regex.RegexInjectionExtensions private import codeql.rust.security.AccessInvalidPointerExtensions +private import codeql.rust.security.CleartextLoggingExtensions private import codeql.rust.security.CleartextTransmissionExtensions +private import codeql.rust.security.SqlInjectionExtensions private import codeql.rust.security.TaintedPathExtensions private import codeql.rust.security.UncontrolledAllocationSizeExtensions +private import codeql.rust.security.WeakSensitiveDataHashingExtensions +private import codeql.rust.security.HardcodedCryptographicValueExtensions /** * Gets a count of the total number of lines of code in the database. @@ -91,17 +92,6 @@ int getTaintEdgesCount() { ) } -/** - * Gets a kind of query for which `n` is a sink (if any). - */ -string getAQuerySinkKind(DataFlow::Node n) { - n instanceof SqlInjection::Sink and result = "SqlInjection" - or - n instanceof CleartextLogging::Sink and result = "CleartextLogging" - or - n instanceof HardcodedCryptographicValue::Sink and result = "HardcodedCryptographicValue" -} - /** * Gets a count of the total number of query sinks in the database. */ diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 9e5a9d533280..a51811179f00 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -857,2239 +857,6 @@ localStep | main.rs:519:17:519:18 | &c | main.rs:519:9:519:13 | c_ref | | main.rs:523:14:523:18 | [post] c_ref | main.rs:524:11:524:15 | c_ref | | main.rs:523:14:523:18 | c_ref | main.rs:524:11:524:15 | c_ref | -<<<<<<< HEAD -| main.rs:551:13:551:33 | result_questionmark(...) | main.rs:551:9:551:9 | _ | -| main.rs:563:36:563:41 | ...::new(...) | main.rs:563:36:563:41 | MacroExpr | -models -| 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | -| 2 | Summary: lang:alloc; <&&str as crate::string::SpecToString>::spec_to_string; Argument[self].Reference.Reference; ReturnValue; value | -| 3 | Summary: lang:alloc; <&str as crate::string::SpecToString>::spec_to_string; Argument[self].Reference; ReturnValue; value | -| 4 | Summary: lang:alloc; <_ as crate::borrow::ToOwned>::clone_into; Argument[self]; Argument[0].Reference; value | -| 5 | Summary: lang:alloc; <_ as crate::borrow::ToOwned>::to_owned; Argument[self]; ReturnValue; value | -| 6 | Summary: lang:alloc; ::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 7 | Summary: lang:alloc; ::as_ref; Argument[self]; ReturnValue; value | -| 8 | Summary: lang:alloc; ::add_assign; Argument[0]; Argument[self].Reference; value | -| 9 | Summary: lang:alloc; ::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 10 | Summary: lang:alloc; ::borrow_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 11 | Summary: lang:alloc; ::clone_from; Argument[0]; Argument[self].Reference; value | -| 12 | Summary: lang:alloc; ::as_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 13 | Summary: lang:alloc; ::as_ref; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 14 | Summary: lang:alloc; ::try_from; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 15 | Summary: lang:alloc; ::deref; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 16 | Summary: lang:alloc; ::deref_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 17 | Summary: lang:alloc; ::allocator; Argument[0].Field[1]; ReturnValue.Reference; value | -| 18 | Summary: lang:alloc; ::as_mut_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | -| 19 | Summary: lang:alloc; ::as_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | -| 20 | Summary: lang:alloc; ::downcast; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 21 | Summary: lang:alloc; ::into_inner; Argument[0].Reference; ReturnValue; value | -| 22 | Summary: lang:alloc; ::borrow; Argument[self].Field[0]; ReturnValue.Reference; value | -| 23 | Summary: lang:alloc; ::borrow_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 24 | Summary: lang:alloc; ::as_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 25 | Summary: lang:alloc; ::as_ref; Argument[self].Field[0]; ReturnValue.Reference; value | -| 26 | Summary: lang:alloc; ::deref; Argument[self].Field[0]; ReturnValue.Reference; value | -| 27 | Summary: lang:alloc; ::deref_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 28 | Summary: lang:alloc; ::index; Argument[self].Field[0].Element; ReturnValue.Reference; value | -| 29 | Summary: lang:alloc; ::index_mut; Argument[self].Field[0].Element; ReturnValue.Reference; value | -| 30 | Summary: lang:alloc; ::as_bytes; Argument[self].Field[0]; ReturnValue.Reference; value | -| 31 | Summary: lang:alloc; ::as_inner; Argument[self]; ReturnValue; value | -| 32 | Summary: lang:alloc; ::get_or_insert_with; Argument[0]; Argument[1].Parameter[0]; value | -| 33 | Summary: lang:alloc; ::clone; Argument[self].Reference; ReturnValue; value | -| 34 | Summary: lang:alloc; ::left_kv; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 35 | Summary: lang:alloc; ::right_kv; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 36 | Summary: lang:alloc; ::clone; Argument[self].Reference; ReturnValue; value | -| 37 | Summary: lang:alloc; ::ascend; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 38 | Summary: lang:alloc; ::choose_parent_kv; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 39 | Summary: lang:alloc; ::find_lower_bound_edge; Argument[0]; ReturnValue.Field[1]; value | -| 40 | Summary: lang:alloc; ::find_upper_bound_edge; Argument[0]; ReturnValue.Field[1]; value | -| 41 | Summary: lang:alloc; ::search_tree_for_bifurcation; Argument[self]; ReturnValue.Field[crate::result::Result::Ok(0)].Field[0]; value | -| 42 | Summary: lang:alloc; ::visit_nodes_in_order; Argument[0].ReturnValue; ReturnValue; value | -| 43 | Summary: lang:alloc; ::get_or_insert_with; Argument[0]; Argument[1].Parameter[0]; value | -| 44 | Summary: lang:alloc; ::split_off; Argument[self].Reference; ReturnValue; value | -| 45 | Summary: lang:alloc; ::retain; Argument[self].Element; Argument[0].Parameter[0].Reference; value | -| 46 | Summary: lang:alloc; ::retain_mut; Argument[self].Element; Argument[0].Parameter[0].Reference; value | -| 47 | Summary: lang:alloc; ::rfold; Argument[0]; ReturnValue; value | -| 48 | Summary: lang:alloc; ::try_rfold; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 49 | Summary: lang:alloc; ::try_rfold; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 50 | Summary: lang:alloc; ::fold; Argument[0]; ReturnValue; value | -| 51 | Summary: lang:alloc; ::try_fold; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 52 | Summary: lang:alloc; ::try_fold; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 53 | Summary: lang:alloc; ::rfold; Argument[0]; ReturnValue; value | -| 54 | Summary: lang:alloc; ::try_rfold; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 55 | Summary: lang:alloc; ::try_rfold; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 56 | Summary: lang:alloc; ::fold; Argument[0]; ReturnValue; value | -| 57 | Summary: lang:alloc; ::try_fold; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 58 | Summary: lang:alloc; ::try_fold; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 59 | Summary: lang:alloc; ::borrow; Argument[self]; ReturnValue; value | -| 60 | Summary: lang:alloc; ::as_ref; Argument[self]; ReturnValue; value | -| 61 | Summary: lang:alloc; ::index; Argument[self]; ReturnValue; value | -| 62 | Summary: lang:alloc; ::as_c_str; Argument[self].Reference; ReturnValue.Reference; value | -| 63 | Summary: lang:alloc; ::into_vec; Argument[self].Field[1]; ReturnValue; value | -| 64 | Summary: lang:alloc; ::nul_position; Argument[self].Field[0]; ReturnValue; value | -| 65 | Summary: lang:alloc; ::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 66 | Summary: lang:alloc; ::as_ref; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 67 | Summary: lang:alloc; ::try_from; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 68 | Summary: lang:alloc; ::downcast; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 69 | Summary: lang:alloc; ::try_unwrap; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 70 | Summary: lang:alloc; ::unwrap_or_clone; Argument[0].Reference; ReturnValue; value | -| 71 | Summary: lang:alloc; ::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 72 | Summary: lang:alloc; ::borrow_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 73 | Summary: lang:alloc; ::as_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 74 | Summary: lang:alloc; ::as_ref; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 75 | Summary: lang:alloc; ::borrow; Argument[self].Element; ReturnValue.Reference; value | -| 76 | Summary: lang:alloc; ::borrow_mut; Argument[self].Element; ReturnValue.Reference; value | -| 77 | Summary: lang:alloc; ::as_mut; Argument[self]; ReturnValue; value | -| 78 | Summary: lang:alloc; ::as_ref; Argument[self]; ReturnValue; value | -| 79 | Summary: lang:alloc; ::from; Argument[0]; ReturnValue; value | -| 80 | Summary: lang:alloc; ::add; Argument[self]; ReturnValue; value | -| 81 | Summary: lang:alloc; ::from_str; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 82 | Summary: lang:alloc; ::spec_to_string; Argument[self]; ReturnValue; value | -| 83 | Summary: lang:alloc; ::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 84 | Summary: lang:alloc; ::as_ref; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 85 | Summary: lang:alloc; ::try_from; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 86 | Summary: lang:alloc; ::downcast; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 87 | Summary: lang:alloc; ::try_unwrap; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 88 | Summary: lang:alloc; ::unwrap_or_clone; Argument[0].Reference; ReturnValue; value | -| 89 | Summary: lang:alloc; ::borrow; Argument[self].Element; ReturnValue.Reference; value | -| 90 | Summary: lang:alloc; ::borrow_mut; Argument[self].Element; ReturnValue.Reference; value | -| 91 | Summary: lang:alloc; ::as_mut; Argument[self]; ReturnValue; value | -| 92 | Summary: lang:alloc; ::as_ref; Argument[self]; ReturnValue; value | -| 93 | Summary: lang:alloc; ::from; Argument[0].Field[0]; ReturnValue; value | -| 94 | Summary: lang:alloc; ::push_within_capacity; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 95 | Summary: lang:alloc; ::as_inner; Argument[self]; ReturnValue; value | -| 96 | Summary: lang:alloc; ::fold; Argument[0]; ReturnValue; value | -| 97 | Summary: lang:alloc; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 98 | Summary: lang:alloc; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 99 | Summary: lang:alloc; ::as_into_iter; Argument[self]; ReturnValue; value | -| 100 | Summary: lang:alloc; ::downcast; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 101 | Summary: lang:alloc; ::spec_to_string; Argument[self]; ReturnValue; value | -| 102 | Summary: lang:alloc; <{766}::StringError as crate::error::Error>::description; Argument[self].Field[0]; ReturnValue.Reference; value | -| 103 | Summary: lang:alloc; crate::collections::btree::mem::replace; Argument[0].Reference; Argument[1].Parameter[0]; value | -| 104 | Summary: lang:alloc; crate::collections::btree::mem::replace; Argument[1].ReturnValue; Argument[0].Reference; value | -| 105 | Summary: lang:alloc; crate::collections::btree::mem::take_mut; Argument[0].Reference; Argument[1].Parameter[0]; value | -| 106 | Summary: lang:alloc; crate::collections::btree::mem::take_mut; Argument[1].ReturnValue; Argument[0].Reference; value | -| 107 | Summary: lang:core; <&_ as crate::borrow::Borrow>::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 108 | Summary: lang:core; <&_ as crate::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 109 | Summary: lang:core; <&_ as crate::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 110 | Summary: lang:core; <&mut _ as crate::borrow::Borrow>::borrow; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 111 | Summary: lang:core; <&mut _ as crate::borrow::BorrowMut>::borrow_mut; Argument[self].Reference.Reference; ReturnValue.Reference; value | -| 112 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_rfold; Argument[0]; ReturnValue; value | -| 113 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_rfold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 114 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_rfold; Argument[1].ReturnValue; ReturnValue; value | -| 115 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold; Argument[0]; ReturnValue; value | -| 116 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 117 | Summary: lang:core; <&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 118 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_fold; Argument[0]; ReturnValue; value | -| 119 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 120 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_fold; Argument[1].ReturnValue; ReturnValue; value | -| 121 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold; Argument[0]; ReturnValue; value | -| 122 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 123 | Summary: lang:core; <&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 124 | Summary: lang:core; <&mut _ as crate::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 125 | Summary: lang:core; <&mut _ as crate::ops::deref::DerefMut>::deref_mut; Argument[self].Reference; ReturnValue; value | -| 126 | Summary: lang:core; <[_] as crate::convert::AsMut>::as_mut; Argument[self]; ReturnValue; value | -| 127 | Summary: lang:core; <[_] as crate::convert::AsRef>::as_ref; Argument[self]; ReturnValue; value | -| 128 | Summary: lang:core; <[_] as crate::slice::SlicePattern>::as_slice; Argument[self]; ReturnValue; value | -| 129 | Summary: lang:core; <[_]>::align_to; Argument[self]; ReturnValue.Field[0]; value | -| 130 | Summary: lang:core; <[_]>::align_to_mut; Argument[self]; ReturnValue.Field[0]; value | -| 131 | Summary: lang:core; <[_]>::as_simd; Argument[self]; ReturnValue.Field[0]; value | -| 132 | Summary: lang:core; <[_]>::as_simd_mut; Argument[self]; ReturnValue.Field[0]; value | -| 133 | Summary: lang:core; <[_]>::partition_dedup; Argument[self]; ReturnValue.Field[0]; value | -| 134 | Summary: lang:core; <[_]>::partition_dedup_by; Argument[self]; ReturnValue.Field[0]; value | -| 135 | Summary: lang:core; <[_]>::partition_dedup_by_key; Argument[self]; ReturnValue.Field[0]; value | -| 136 | Summary: lang:core; <[u8]>::trim_ascii; Argument[self]; ReturnValue; value | -| 137 | Summary: lang:core; <[u8]>::trim_ascii_end; Argument[self]; ReturnValue; value | -| 138 | Summary: lang:core; <[u8]>::trim_ascii_start; Argument[self]; ReturnValue; value | -| 139 | Summary: lang:core; <_ as crate::array::SpecArrayClone>::clone; Argument[0].Reference; ReturnValue; value | -| 140 | Summary: lang:core; <_ as crate::async_iter::async_iter::IntoAsyncIterator>::into_async_iter; Argument[self]; ReturnValue; value | -| 141 | Summary: lang:core; <_ as crate::borrow::Borrow>::borrow; Argument[self]; ReturnValue; value | -| 142 | Summary: lang:core; <_ as crate::borrow::BorrowMut>::borrow_mut; Argument[self]; ReturnValue; value | -| 143 | Summary: lang:core; <_ as crate::clone::uninit::CopySpec>::clone_one; Argument[0]; Argument[1].Reference; value | -| 144 | Summary: lang:core; <_ as crate::convert::From>::from; Argument[0]; ReturnValue; value | -| 145 | Summary: lang:core; <_ as crate::future::into_future::IntoFuture>::into_future; Argument[self]; ReturnValue; value | -| 146 | Summary: lang:core; <_ as crate::iter::adapters::step_by::SpecRangeSetup>::setup; Argument[0]; ReturnValue; value | -| 147 | Summary: lang:core; <_ as crate::iter::traits::collect::IntoIterator>::into_iter; Argument[self]; ReturnValue; value | -| 148 | Summary: lang:core; <_ as crate::str::pattern::MultiCharEq>::matches; Argument[0]; Argument[self].Reference.Parameter[0]; value | -| 149 | Summary: lang:core; <_ as crate::str::pattern::MultiCharEq>::matches; Argument[self].Reference.ReturnValue; ReturnValue; value | -| 150 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 151 | Summary: lang:core; ::select_unpredictable; Argument[0]; ReturnValue; value | -| 152 | Summary: lang:core; ::select_unpredictable; Argument[1]; ReturnValue; value | -| 153 | Summary: lang:core; ::then; Argument[0].ReturnValue; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 154 | Summary: lang:core; ::then_some; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 155 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 156 | Summary: lang:core; ::to_ascii_lowercase; Argument[self].Reference; ReturnValue; value | -| 157 | Summary: lang:core; ::to_ascii_uppercase; Argument[self].Reference; ReturnValue; value | -| 158 | Summary: lang:core; ::borrow; Argument[self].Field[0]; ReturnValue.Reference; value | -| 159 | Summary: lang:core; ::borrow_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 160 | Summary: lang:core; ::as_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 161 | Summary: lang:core; ::as_ref; Argument[self].Field[0]; ReturnValue.Reference; value | -| 162 | Summary: lang:core; ::as_ref; Argument[self]; ReturnValue; value | -| 163 | Summary: lang:core; ::deref; Argument[self].Field[0]; ReturnValue.Reference; value | -| 164 | Summary: lang:core; ::deref_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 165 | Summary: lang:core; ::index; Argument[self].Field[0].Element; ReturnValue.Reference; value | -| 166 | Summary: lang:core; ::index; Argument[self]; ReturnValue; value | -| 167 | Summary: lang:core; ::index_mut; Argument[self].Field[0].Element; ReturnValue.Reference; value | -| 168 | Summary: lang:core; ::index_mut; Argument[self]; ReturnValue; value | -| 169 | Summary: lang:core; ::as_bytes; Argument[self].Field[0]; ReturnValue.Reference; value | -| 170 | Summary: lang:core; ::update; Argument[0].ReturnValue; ReturnValue; value | -| 171 | Summary: lang:core; ::filter_map; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 172 | Summary: lang:core; ::filter_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 173 | Summary: lang:core; ::map; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 174 | Summary: lang:core; ::map_split; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 175 | Summary: lang:core; ::filter_map; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 176 | Summary: lang:core; ::filter_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 177 | Summary: lang:core; ::map; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 178 | Summary: lang:core; ::map_split; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 179 | Summary: lang:core; ::get_or_init; Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 180 | Summary: lang:core; ::get_or_try_init; Argument[0].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 181 | Summary: lang:core; ::get_or_try_init; Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 182 | Summary: lang:core; ::get_or_try_init; Argument[0].ReturnValue; ReturnValue; value | -| 183 | Summary: lang:core; ::set; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 184 | Summary: lang:core; ::try_insert; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)].Field[1]; value | -| 185 | Summary: lang:core; ::try_insert; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | -| 186 | Summary: lang:core; ::then; Argument[0]; ReturnValue; value | -| 187 | Summary: lang:core; ::then; Argument[self]; ReturnValue; value | -| 188 | Summary: lang:core; ::then_with; Argument[0].ReturnValue; ReturnValue; value | -| 189 | Summary: lang:core; ::then_with; Argument[self]; ReturnValue; value | -| 190 | Summary: lang:core; ::from; Argument[0]; ReturnValue; value | -| 191 | Summary: lang:core; ::provide_ref; Argument[self]; ReturnValue; value | -| 192 | Summary: lang:core; ::provide_ref_with; Argument[self]; ReturnValue; value | -| 193 | Summary: lang:core; ::provide_value; Argument[self]; ReturnValue; value | -| 194 | Summary: lang:core; ::provide_value_with; Argument[self]; ReturnValue; value | -| 195 | Summary: lang:core; ::as_ref; Argument[self]; ReturnValue; value | -| 196 | Summary: lang:core; ::with_copy; Argument[0].ReturnValue; ReturnValue; value | -| 197 | Summary: lang:core; ::align; Argument[self]; ReturnValue; value | -| 198 | Summary: lang:core; ::alternate; Argument[self]; ReturnValue; value | -| 199 | Summary: lang:core; ::debug_as_hex; Argument[self]; ReturnValue; value | -| 200 | Summary: lang:core; ::fill; Argument[self]; ReturnValue; value | -| 201 | Summary: lang:core; ::precision; Argument[self]; ReturnValue; value | -| 202 | Summary: lang:core; ::sign; Argument[self]; ReturnValue; value | -| 203 | Summary: lang:core; ::sign_aware_zero_pad; Argument[self]; ReturnValue; value | -| 204 | Summary: lang:core; ::width; Argument[self]; ReturnValue; value | -| 205 | Summary: lang:core; ::entries; Argument[self]; ReturnValue; value | -| 206 | Summary: lang:core; ::entry; Argument[self]; ReturnValue; value | -| 207 | Summary: lang:core; ::entry_with; Argument[self]; ReturnValue; value | -| 208 | Summary: lang:core; ::entries; Argument[self]; ReturnValue; value | -| 209 | Summary: lang:core; ::entry; Argument[self]; ReturnValue; value | -| 210 | Summary: lang:core; ::key; Argument[self]; ReturnValue; value | -| 211 | Summary: lang:core; ::key_with; Argument[self]; ReturnValue; value | -| 212 | Summary: lang:core; ::value; Argument[self]; ReturnValue; value | -| 213 | Summary: lang:core; ::value_with; Argument[self]; ReturnValue; value | -| 214 | Summary: lang:core; ::entries; Argument[self]; ReturnValue; value | -| 215 | Summary: lang:core; ::entry; Argument[self]; ReturnValue; value | -| 216 | Summary: lang:core; ::entry_with; Argument[self]; ReturnValue; value | -| 217 | Summary: lang:core; ::field; Argument[self]; ReturnValue; value | -| 218 | Summary: lang:core; ::field_with; Argument[self]; ReturnValue; value | -| 219 | Summary: lang:core; ::field; Argument[self]; ReturnValue; value | -| 220 | Summary: lang:core; ::field_with; Argument[self]; ReturnValue; value | -| 221 | Summary: lang:core; ::into_inner; Argument[self].Field[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 222 | Summary: lang:core; ::clear; Argument[self]; ReturnValue; value | -| 223 | Summary: lang:core; ::set_init; Argument[self]; ReturnValue; value | -| 224 | Summary: lang:core; ::advance; Argument[self]; ReturnValue; value | -| 225 | Summary: lang:core; ::advance_unchecked; Argument[self]; ReturnValue; value | -| 226 | Summary: lang:core; ::ensure_init; Argument[self]; ReturnValue; value | -| 227 | Summary: lang:core; ::set_init; Argument[self]; ReturnValue; value | -| 228 | Summary: lang:core; ::fold; Argument[0].Field[0]; ReturnValue; value | -| 229 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 230 | Summary: lang:core; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 231 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 232 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 233 | Summary: lang:core; ::fold; Argument[0].ReturnValue; ReturnValue; value | -| 234 | Summary: lang:core; ::fold; Argument[self].Field[0]; ReturnValue; value | -| 235 | Summary: lang:core; ::fold; Argument[self]; ReturnValue; value | -| 236 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 237 | Summary: lang:core; ::rfold; Argument[self].Field[0].Field[0]; ReturnValue; value | -| 238 | Summary: lang:core; ::try_rfold; Argument[0].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 239 | Summary: lang:core; ::try_rfold; Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 240 | Summary: lang:core; ::try_rfold; Argument[self].Field[0]; ReturnValue; value | -| 241 | Summary: lang:core; ::fold; Argument[self].Field[0].Field[0]; ReturnValue; value | -| 242 | Summary: lang:core; ::try_fold; Argument[0].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 243 | Summary: lang:core; ::try_fold; Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 244 | Summary: lang:core; ::try_fold; Argument[self].Field[0]; ReturnValue; value | -| 245 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 246 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 247 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 248 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 249 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 250 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 251 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 252 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 253 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 254 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 255 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 256 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 257 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 258 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 259 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 260 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 261 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 262 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 263 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 264 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 265 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 266 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 267 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 268 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 269 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 270 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 271 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 272 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 273 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 274 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 275 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 276 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 277 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 278 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 279 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 280 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 281 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 282 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 283 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 284 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 285 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 286 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 287 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 288 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 289 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 290 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 291 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 292 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 293 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 294 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 295 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 296 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 297 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 298 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 299 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 300 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 301 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 302 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 303 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 304 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 305 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 306 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 307 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 308 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 309 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 310 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 311 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 312 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 313 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 314 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 315 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 316 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 317 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 318 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 319 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 320 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 321 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 322 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 323 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 324 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 325 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 326 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 327 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 328 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 329 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 330 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 331 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 332 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 333 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 334 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 335 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 336 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 337 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 338 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 339 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 340 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 341 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 342 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 343 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 344 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 345 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 346 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 347 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 348 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 349 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 350 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 351 | Summary: lang:core; ::fold; Argument[0]; Argument[1].Parameter[0]; value | -| 352 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 353 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 354 | Summary: lang:core; ::try_fold; Argument[0]; Argument[1].Parameter[0]; value | -| 355 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 356 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 357 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 358 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 359 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 360 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 361 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 362 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 363 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 364 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 365 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 366 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 367 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 368 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 369 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 370 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 371 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 372 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 373 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 374 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 375 | Summary: lang:core; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 376 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 377 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 378 | Summary: lang:core; ::spec_rfold; Argument[0]; Argument[1].Parameter[0]; value | -| 379 | Summary: lang:core; ::spec_rfold; Argument[0]; ReturnValue; value | -| 380 | Summary: lang:core; ::spec_rfold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 381 | Summary: lang:core; ::spec_rfold; Argument[1].ReturnValue; ReturnValue; value | -| 382 | Summary: lang:core; ::spec_try_rfold; Argument[0]; Argument[1].Parameter[0]; value | -| 383 | Summary: lang:core; ::spec_try_rfold; Argument[0]; ReturnValue; value | -| 384 | Summary: lang:core; ::spec_try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 385 | Summary: lang:core; ::spec_try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 386 | Summary: lang:core; ::spec_fold; Argument[0]; ReturnValue; value | -| 387 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 388 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; ReturnValue; value | -| 389 | Summary: lang:core; ::spec_try_fold; Argument[0]; ReturnValue; value | -| 390 | Summary: lang:core; ::rfold; Argument[0]; Argument[1].Parameter[0]; value | -| 391 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 392 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 393 | Summary: lang:core; ::try_rfold; Argument[0]; Argument[1].Parameter[0]; value | -| 394 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 395 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 396 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 397 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 398 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 399 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 400 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 401 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 402 | Summary: lang:core; ::spec_fold; Argument[0].Field[0]; ReturnValue; value | -| 403 | Summary: lang:core; ::spec_fold; Argument[0]; ReturnValue; value | -| 404 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 405 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; ReturnValue; value | -| 406 | Summary: lang:core; ::rfold; Argument[0].ReturnValue; ReturnValue; value | -| 407 | Summary: lang:core; ::rfold; Argument[0]; ReturnValue; value | -| 408 | Summary: lang:core; ::rfold; Argument[1].ReturnValue; ReturnValue; value | -| 409 | Summary: lang:core; ::rfold; Argument[self].Field[0]; ReturnValue; value | -| 410 | Summary: lang:core; ::rfold; Argument[self]; ReturnValue; value | -| 411 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 412 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 413 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 414 | Summary: lang:core; ::fold; Argument[0].ReturnValue; ReturnValue; value | -| 415 | Summary: lang:core; ::fold; Argument[self].Field[0]; ReturnValue; value | -| 416 | Summary: lang:core; ::fold; Argument[self]; ReturnValue; value | -| 417 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 418 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 419 | Summary: lang:core; ::spec_fold; Argument[0]; ReturnValue; value | -| 420 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 421 | Summary: lang:core; ::spec_fold; Argument[1].ReturnValue; ReturnValue; value | -| 422 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 423 | Summary: lang:core; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 424 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 425 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 426 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 427 | Summary: lang:core; ::nth_back; Argument[self].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 428 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 429 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 430 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 431 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 432 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 433 | Summary: lang:core; ::to_canonical; Argument[self].Reference; ReturnValue; value | -| 434 | Summary: lang:core; ::bitand; Argument[self]; ReturnValue; value | -| 435 | Summary: lang:core; ::bitor; Argument[self]; ReturnValue; value | -| 436 | Summary: lang:core; ::not; Argument[self]; ReturnValue; value | -| 437 | Summary: lang:core; ::bitand; Argument[self]; ReturnValue; value | -| 438 | Summary: lang:core; ::bitor; Argument[self]; ReturnValue; value | -| 439 | Summary: lang:core; ::not; Argument[self]; ReturnValue; value | -| 440 | Summary: lang:core; ::add; Argument[self]; ReturnValue; value | -| 441 | Summary: lang:core; ::add_small; Argument[self]; ReturnValue; value | -| 442 | Summary: lang:core; ::div_rem_small; Argument[self]; ReturnValue.Field[0]; value | -| 443 | Summary: lang:core; ::mul_digits; Argument[self]; ReturnValue; value | -| 444 | Summary: lang:core; ::mul_pow2; Argument[self]; ReturnValue; value | -| 445 | Summary: lang:core; ::mul_pow5; Argument[self]; ReturnValue; value | -| 446 | Summary: lang:core; ::mul_small; Argument[self]; ReturnValue; value | -| 447 | Summary: lang:core; ::sub; Argument[self]; ReturnValue; value | -| 448 | Summary: lang:core; ::add; Argument[self]; ReturnValue; value | -| 449 | Summary: lang:core; ::add_small; Argument[self]; ReturnValue; value | -| 450 | Summary: lang:core; ::div_rem_small; Argument[self]; ReturnValue.Field[0]; value | -| 451 | Summary: lang:core; ::mul_digits; Argument[self]; ReturnValue; value | -| 452 | Summary: lang:core; ::mul_pow2; Argument[self]; ReturnValue; value | -| 453 | Summary: lang:core; ::mul_pow5; Argument[self]; ReturnValue; value | -| 454 | Summary: lang:core; ::mul_small; Argument[self]; ReturnValue; value | -| 455 | Summary: lang:core; ::sub; Argument[self]; ReturnValue; value | -| 456 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 457 | Summary: lang:core; ::from_mut_unchecked; Argument[0]; ReturnValue; value | -| 458 | Summary: lang:core; ::new_unchecked; Argument[0]; ReturnValue; value | -| 459 | Summary: lang:core; ::get; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 460 | Summary: lang:core; ::get_mut; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 461 | Summary: lang:core; ::get_unchecked; Argument[0]; ReturnValue; value | -| 462 | Summary: lang:core; ::get_unchecked_mut; Argument[0]; ReturnValue; value | -| 463 | Summary: lang:core; ::index; Argument[0]; ReturnValue; value | -| 464 | Summary: lang:core; ::index_mut; Argument[0]; ReturnValue; value | -| 465 | Summary: lang:core; ::spec_try_fold; Argument[0]; ReturnValue; value | -| 466 | Summary: lang:core; ::spec_try_rfold; Argument[0]; ReturnValue; value | -| 467 | Summary: lang:core; ::try_rfold; Argument[0]; ReturnValue; value | -| 468 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 469 | Summary: lang:core; ::try_rfold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 470 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 471 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 472 | Summary: lang:core; ::try_fold; Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 473 | Summary: lang:core; ::wrap_mut_1; Argument[0]; ReturnValue; value | -| 474 | Summary: lang:core; ::wrap_mut_2; Argument[0]; ReturnValue; value | -| 475 | Summary: lang:core; ::clone; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 476 | Summary: lang:core; ::from; Argument[0].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Reference; value | -| 477 | Summary: lang:core; ::from; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 478 | Summary: lang:core; ::from_output; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 479 | Summary: lang:core; ::and; Argument[0]; ReturnValue; value | -| 480 | Summary: lang:core; ::and_then; Argument[0].ReturnValue; ReturnValue; value | -| 481 | Summary: lang:core; ::and_then; Argument[self].Field[crate::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 482 | Summary: lang:core; ::and_then; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 483 | Summary: lang:core; ::as_mut; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Reference; value | -| 484 | Summary: lang:core; ::as_ref; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Reference; value | -| 485 | Summary: lang:core; ::cloned; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 486 | Summary: lang:core; ::copied; Argument[self].Field[crate::option::Option::Some(0)].Reference; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 487 | Summary: lang:core; ::expect; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 488 | Summary: lang:core; ::flatten; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 489 | Summary: lang:core; ::get_or_insert; Argument[0]; Argument[self].Reference.Field[crate::option::Option::Some(0)]; value | -| 490 | Summary: lang:core; ::get_or_insert; Argument[0]; ReturnValue.Reference; value | -| 491 | Summary: lang:core; ::get_or_insert; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Reference; value | -| 492 | Summary: lang:core; ::get_or_insert_default; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Reference; value | -| 493 | Summary: lang:core; ::get_or_insert_with; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Reference; value | -| 494 | Summary: lang:core; ::insert; Argument[0]; Argument[self].Reference.Field[crate::option::Option::Some(0)]; value | -| 495 | Summary: lang:core; ::insert; Argument[0]; ReturnValue.Reference; value | -| 496 | Summary: lang:core; ::insert; Argument[self].Reference.Field[crate::option::Option::Some(0)]; ReturnValue.Reference; value | -| 497 | Summary: lang:core; ::inspect; Argument[self]; ReturnValue; value | -| 498 | Summary: lang:core; ::is_none_or; Argument[0].ReturnValue; ReturnValue; value | -| 499 | Summary: lang:core; ::is_none_or; Argument[self].Field[crate::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 500 | Summary: lang:core; ::is_some_and; Argument[0].ReturnValue; ReturnValue; value | -| 501 | Summary: lang:core; ::is_some_and; Argument[self].Field[crate::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 502 | Summary: lang:core; ::map; Argument[0].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 503 | Summary: lang:core; ::map; Argument[0].ReturnValue; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 504 | Summary: lang:core; ::map; Argument[self].Field[crate::option::Option::Some(0)].Field[0]; ReturnValue.Field[crate::option::Option::Some(0)].Field[0]; value | -| 505 | Summary: lang:core; ::map; Argument[self].Field[crate::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 506 | Summary: lang:core; ::map; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[1]; value | -| 507 | Summary: lang:core; ::map_or; Argument[0]; ReturnValue; value | -| 508 | Summary: lang:core; ::map_or; Argument[1].ReturnValue; ReturnValue; value | -| 509 | Summary: lang:core; ::map_or; Argument[self].Field[crate::option::Option::Some(0)]; Argument[1].Parameter[0]; value | -| 510 | Summary: lang:core; ::map_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 511 | Summary: lang:core; ::map_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 512 | Summary: lang:core; ::map_or_else; Argument[1].ReturnValue; ReturnValue; value | -| 513 | Summary: lang:core; ::map_or_else; Argument[self].Field[crate::option::Option::Some(0)]; Argument[1].Parameter[0]; value | -| 514 | Summary: lang:core; ::ok_or; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 515 | Summary: lang:core; ::ok_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 516 | Summary: lang:core; ::ok_or_else; Argument[0].ReturnValue; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 517 | Summary: lang:core; ::ok_or_else; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 518 | Summary: lang:core; ::or; Argument[0]; ReturnValue; value | -| 519 | Summary: lang:core; ::or; Argument[self]; ReturnValue; value | -| 520 | Summary: lang:core; ::or_else; Argument[0].ReturnValue; ReturnValue; value | -| 521 | Summary: lang:core; ::or_else; Argument[self]; ReturnValue; value | -| 522 | Summary: lang:core; ::replace; Argument[0]; Argument[self].Reference.Field[crate::option::Option::Some(0)]; value | -| 523 | Summary: lang:core; ::replace; Argument[self].Reference; ReturnValue; value | -| 524 | Summary: lang:core; ::take; Argument[self].Reference; ReturnValue; value | -| 525 | Summary: lang:core; ::take_if; Argument[self].Reference.Field[crate::option::Option::Some(0)]; Argument[0].Parameter[0].Reference; value | -| 526 | Summary: lang:core; ::take_if; Argument[self].Reference; ReturnValue; value | -| 527 | Summary: lang:core; ::transpose; Argument[self].Field[crate::option::Option::Some(0)].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 528 | Summary: lang:core; ::transpose; Argument[self].Field[crate::option::Option::Some(0)].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)].Field[crate::option::Option::Some(0)]; value | -| 529 | Summary: lang:core; ::unwrap; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 530 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 531 | Summary: lang:core; ::unwrap_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 532 | Summary: lang:core; ::unwrap_or_default; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 533 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 534 | Summary: lang:core; ::unwrap_or_else; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 535 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 536 | Summary: lang:core; ::unzip; Argument[self].Field[crate::option::Option::Some(0)].Field[0]; ReturnValue.Field[0].Field[crate::option::Option::Some(0)]; value | -| 537 | Summary: lang:core; ::unzip; Argument[self].Field[crate::option::Option::Some(0)].Field[1]; ReturnValue.Field[1].Field[crate::option::Option::Some(0)]; value | -| 538 | Summary: lang:core; ::xor; Argument[0]; ReturnValue; value | -| 539 | Summary: lang:core; ::xor; Argument[self]; ReturnValue; value | -| 540 | Summary: lang:core; ::zip; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[1]; value | -| 541 | Summary: lang:core; ::zip; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[0]; value | -| 542 | Summary: lang:core; ::zip_with; Argument[0].Field[crate::option::Option::Some(0)]; Argument[1].Parameter[1]; value | -| 543 | Summary: lang:core; ::zip_with; Argument[1].ReturnValue; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 544 | Summary: lang:core; ::zip_with; Argument[self].Field[crate::option::Option::Some(0)]; Argument[1].Parameter[0]; value | -| 545 | Summary: lang:core; ::deref; Argument[self].Field[0]; ReturnValue.Reference; value | -| 546 | Summary: lang:core; ::deref_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 547 | Summary: lang:core; ::max; Argument[0]; ReturnValue; value | -| 548 | Summary: lang:core; ::max; Argument[1]; ReturnValue; value | -| 549 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 550 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 551 | Summary: lang:core; ::sub; Argument[self]; ReturnValue; value | -| 552 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 553 | Summary: lang:core; ::clone; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 554 | Summary: lang:core; ::clone; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 555 | Summary: lang:core; ::from_output; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 556 | Summary: lang:core; ::and; Argument[0]; ReturnValue; value | -| 557 | Summary: lang:core; ::and; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 558 | Summary: lang:core; ::and_then; Argument[0].ReturnValue; ReturnValue; value | -| 559 | Summary: lang:core; ::and_then; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 560 | Summary: lang:core; ::and_then; Argument[self].Field[crate::result::Result::Ok(0)]; Argument[0].Parameter[0]; value | -| 561 | Summary: lang:core; ::as_deref; Argument[self].Reference.Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)].Reference; value | -| 562 | Summary: lang:core; ::as_deref_mut; Argument[self].Reference.Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)].Reference; value | -| 563 | Summary: lang:core; ::as_mut; Argument[self].Reference.Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)].Reference; value | -| 564 | Summary: lang:core; ::as_mut; Argument[self].Reference.Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | -| 565 | Summary: lang:core; ::as_ref; Argument[self].Reference.Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)].Reference; value | -| 566 | Summary: lang:core; ::as_ref; Argument[self].Reference.Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | -| 567 | Summary: lang:core; ::cloned; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 568 | Summary: lang:core; ::cloned; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 569 | Summary: lang:core; ::copied; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 570 | Summary: lang:core; ::copied; Argument[self].Field[crate::result::Result::Ok(0)].Reference; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 571 | Summary: lang:core; ::err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 572 | Summary: lang:core; ::expect; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 573 | Summary: lang:core; ::expect_err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value | -| 574 | Summary: lang:core; ::flatten; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 575 | Summary: lang:core; ::flatten; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 576 | Summary: lang:core; ::inspect; Argument[self]; ReturnValue; value | -| 577 | Summary: lang:core; ::inspect_err; Argument[self]; ReturnValue; value | -| 578 | Summary: lang:core; ::into_err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value | -| 579 | Summary: lang:core; ::into_ok; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 580 | Summary: lang:core; ::is_err_and; Argument[0].ReturnValue; ReturnValue; value | -| 581 | Summary: lang:core; ::is_err_and; Argument[self].Field[crate::result::Result::Err(0)]; Argument[0].Parameter[0]; value | -| 582 | Summary: lang:core; ::is_ok_and; Argument[0].ReturnValue; ReturnValue; value | -| 583 | Summary: lang:core; ::is_ok_and; Argument[self].Field[crate::result::Result::Ok(0)]; Argument[0].Parameter[0]; value | -| 584 | Summary: lang:core; ::map; Argument[0].ReturnValue; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 585 | Summary: lang:core; ::map_err; Argument[0].ReturnValue; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 586 | Summary: lang:core; ::map_err; Argument[self].Field[crate::result::Result::Err(0)]; Argument[0].Parameter[0]; value | -| 587 | Summary: lang:core; ::map_err; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 588 | Summary: lang:core; ::map_or; Argument[0]; ReturnValue; value | -| 589 | Summary: lang:core; ::map_or; Argument[1].ReturnValue; ReturnValue; value | -| 590 | Summary: lang:core; ::map_or; Argument[self].Field[crate::result::Result::Ok(0)]; Argument[1].Parameter[0]; value | -| 591 | Summary: lang:core; ::map_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 592 | Summary: lang:core; ::map_or_else; Argument[1].ReturnValue; ReturnValue; value | -| 593 | Summary: lang:core; ::map_or_else; Argument[self].Field[crate::result::Result::Err(0)]; Argument[0].Parameter[0]; value | -| 594 | Summary: lang:core; ::map_or_else; Argument[self].Field[crate::result::Result::Ok(0)]; Argument[1].Parameter[0]; value | -| 595 | Summary: lang:core; ::ok; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 596 | Summary: lang:core; ::or; Argument[0]; ReturnValue; value | -| 597 | Summary: lang:core; ::or; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 598 | Summary: lang:core; ::or_else; Argument[0].ReturnValue; ReturnValue; value | -| 599 | Summary: lang:core; ::or_else; Argument[self].Field[crate::result::Result::Err(0)]; Argument[0].Parameter[0]; value | -| 600 | Summary: lang:core; ::or_else; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 601 | Summary: lang:core; ::transpose; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[crate::result::Result::Err(0)]; value | -| 602 | Summary: lang:core; ::transpose; Argument[self].Field[crate::result::Result::Ok(0)].Field[crate::option::Option::Some(0)]; ReturnValue.Field[crate::option::Option::Some(0)].Field[crate::result::Result::Ok(0)]; value | -| 603 | Summary: lang:core; ::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 604 | Summary: lang:core; ::unwrap_err; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value | -| 605 | Summary: lang:core; ::unwrap_err_unchecked; Argument[self].Field[crate::result::Result::Err(0)]; ReturnValue; value | -| 606 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 607 | Summary: lang:core; ::unwrap_or; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 608 | Summary: lang:core; ::unwrap_or_default; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 609 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 610 | Summary: lang:core; ::unwrap_or_else; Argument[self].Field[crate::result::Result::Err(0)].Reference; ReturnValue; value | -| 611 | Summary: lang:core; ::unwrap_or_else; Argument[self].Field[crate::result::Result::Err(0)]; Argument[0].Parameter[0]; value | -| 612 | Summary: lang:core; ::unwrap_or_else; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 613 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 614 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 615 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 616 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 617 | Summary: lang:core; ::collect; Argument[self].Element; ReturnValue.Element; value | -| 618 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 619 | Summary: lang:core; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 620 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 621 | Summary: lang:core; ::for_each; Argument[self].Element; Argument[0].Parameter[0]; value | -| 622 | Summary: lang:core; ::map; Argument[self].Element; Argument[0].Parameter[0]; value | -| 623 | Summary: lang:core; ::next; Argument[self].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 624 | Summary: lang:core; ::nth; Argument[self].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 625 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 626 | Summary: lang:core; ::fold; Argument[1].ReturnValue; Argument[1].Parameter[0]; value | -| 627 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 628 | Summary: lang:core; ::call; Argument[0].Field[0]; ReturnValue; value | -| 629 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 630 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 631 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 632 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 633 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 634 | Summary: lang:core; ::fold; Argument[0]; ReturnValue; value | -| 635 | Summary: lang:core; ::fold; Argument[1].ReturnValue; ReturnValue; value | -| 636 | Summary: lang:core; ::try_fold; Argument[0]; ReturnValue; value | -| 637 | Summary: lang:core; ::matching; Argument[0]; ReturnValue.Field[crate::option::Option::Some(0)].Field[0]; value | -| 638 | Summary: lang:core; ::matching; Argument[1]; ReturnValue.Field[crate::option::Option::Some(0)].Field[1]; value | -| 639 | Summary: lang:core; ::clone_from; Argument[0]; Argument[self].Reference; value | -| 640 | Summary: lang:core; ::clone_from; Argument[0]; Argument[self].Reference; value | -| 641 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 642 | Summary: lang:core; ::clamp; Argument[0]; ReturnValue; value | -| 643 | Summary: lang:core; ::clamp; Argument[1]; ReturnValue; value | -| 644 | Summary: lang:core; ::clamp; Argument[self]; ReturnValue; value | -| 645 | Summary: lang:core; ::maximum; Argument[0]; ReturnValue; value | -| 646 | Summary: lang:core; ::maximum; Argument[self]; ReturnValue; value | -| 647 | Summary: lang:core; ::minimum; Argument[0]; ReturnValue; value | -| 648 | Summary: lang:core; ::minimum; Argument[self]; ReturnValue; value | -| 649 | Summary: lang:core; ::next_down; Argument[self]; ReturnValue; value | -| 650 | Summary: lang:core; ::next_up; Argument[self]; ReturnValue; value | -| 651 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 652 | Summary: lang:core; ::clamp; Argument[0]; ReturnValue; value | -| 653 | Summary: lang:core; ::clamp; Argument[1]; ReturnValue; value | -| 654 | Summary: lang:core; ::clamp; Argument[self]; ReturnValue; value | -| 655 | Summary: lang:core; ::maximum; Argument[0]; ReturnValue; value | -| 656 | Summary: lang:core; ::maximum; Argument[self]; ReturnValue; value | -| 657 | Summary: lang:core; ::minimum; Argument[0]; ReturnValue; value | -| 658 | Summary: lang:core; ::minimum; Argument[self]; ReturnValue; value | -| 659 | Summary: lang:core; ::next_down; Argument[self]; ReturnValue; value | -| 660 | Summary: lang:core; ::next_up; Argument[self]; ReturnValue; value | -| 661 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 662 | Summary: lang:core; ::clamp; Argument[0]; ReturnValue; value | -| 663 | Summary: lang:core; ::clamp; Argument[1]; ReturnValue; value | -| 664 | Summary: lang:core; ::clamp; Argument[self]; ReturnValue; value | -| 665 | Summary: lang:core; ::maximum; Argument[0]; ReturnValue; value | -| 666 | Summary: lang:core; ::maximum; Argument[self]; ReturnValue; value | -| 667 | Summary: lang:core; ::minimum; Argument[0]; ReturnValue; value | -| 668 | Summary: lang:core; ::minimum; Argument[self]; ReturnValue; value | -| 669 | Summary: lang:core; ::next_down; Argument[self]; ReturnValue; value | -| 670 | Summary: lang:core; ::next_up; Argument[self]; ReturnValue; value | -| 671 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 672 | Summary: lang:core; ::clamp; Argument[0]; ReturnValue; value | -| 673 | Summary: lang:core; ::clamp; Argument[1]; ReturnValue; value | -| 674 | Summary: lang:core; ::clamp; Argument[self]; ReturnValue; value | -| 675 | Summary: lang:core; ::maximum; Argument[0]; ReturnValue; value | -| 676 | Summary: lang:core; ::maximum; Argument[self]; ReturnValue; value | -| 677 | Summary: lang:core; ::minimum; Argument[0]; ReturnValue; value | -| 678 | Summary: lang:core; ::minimum; Argument[self]; ReturnValue; value | -| 679 | Summary: lang:core; ::next_down; Argument[self]; ReturnValue; value | -| 680 | Summary: lang:core; ::next_up; Argument[self]; ReturnValue; value | -| 681 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 682 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 683 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 684 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 685 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 686 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 687 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 688 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 689 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 690 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 691 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 692 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 693 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 694 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 695 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 696 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 697 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 698 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 699 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 700 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 701 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 702 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 703 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 704 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 705 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 706 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 707 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 708 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 709 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 710 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 711 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 712 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 713 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 714 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 715 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 716 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 717 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 718 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 719 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 720 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 721 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 722 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 723 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 724 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 725 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 726 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 727 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 728 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 729 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 730 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 731 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 732 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 733 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 734 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 735 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 736 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 737 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 738 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 739 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 740 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 741 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 742 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 743 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 744 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 745 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 746 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 747 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 748 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 749 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 750 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 751 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 752 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 753 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 754 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 755 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 756 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 757 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 758 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 759 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 760 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 761 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 762 | Summary: lang:core; ::abs; Argument[self]; ReturnValue; value | -| 763 | Summary: lang:core; ::checked_abs; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 764 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 765 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 766 | Summary: lang:core; ::overflowing_abs; Argument[self]; ReturnValue.Field[0]; value | -| 767 | Summary: lang:core; ::overflowing_div; Argument[self]; ReturnValue.Field[0]; value | -| 768 | Summary: lang:core; ::overflowing_div_euclid; Argument[self]; ReturnValue.Field[0]; value | -| 769 | Summary: lang:core; ::saturating_abs; Argument[self]; ReturnValue; value | -| 770 | Summary: lang:core; ::saturating_div; Argument[self]; ReturnValue; value | -| 771 | Summary: lang:core; ::strict_abs; Argument[self]; ReturnValue; value | -| 772 | Summary: lang:core; ::strict_div; Argument[self]; ReturnValue; value | -| 773 | Summary: lang:core; ::strict_div_euclid; Argument[self]; ReturnValue; value | -| 774 | Summary: lang:core; ::wrapping_abs; Argument[self]; ReturnValue; value | -| 775 | Summary: lang:core; ::wrapping_div; Argument[self]; ReturnValue; value | -| 776 | Summary: lang:core; ::wrapping_div_euclid; Argument[self]; ReturnValue; value | -| 777 | Summary: lang:core; ::as_mut; Argument[self]; ReturnValue; value | -| 778 | Summary: lang:core; ::as_ref; Argument[self]; ReturnValue; value | -| 779 | Summary: lang:core; ::as_str; Argument[self]; ReturnValue; value | -| 780 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 781 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 782 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 783 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 784 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 785 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 786 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 787 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 788 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 789 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 790 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 791 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 792 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 793 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 794 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 795 | Summary: lang:core; ::clone; Argument[self].Reference; ReturnValue; value | -| 796 | Summary: lang:core; ::index; Argument[0].Reference.Element; ReturnValue.Reference; value | -| 797 | Summary: lang:core; ::index_mut; Argument[0].Reference.Element; ReturnValue.Reference; value | -| 798 | Summary: lang:core; ::checked_next_multiple_of; Argument[self]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 799 | Summary: lang:core; ::next_multiple_of; Argument[self]; ReturnValue; value | -| 800 | Summary: lang:core; crate::array::drain::drain_array_with; Argument[1].ReturnValue; ReturnValue; value | -| 801 | Summary: lang:core; crate::cmp::max; Argument[0]; ReturnValue; value | -| 802 | Summary: lang:core; crate::cmp::max; Argument[1]; ReturnValue; value | -| 803 | Summary: lang:core; crate::cmp::max_by; Argument[0]; Argument[2].Parameter[1].Reference; value | -| 804 | Summary: lang:core; crate::cmp::max_by; Argument[0]; ReturnValue; value | -| 805 | Summary: lang:core; crate::cmp::max_by; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 806 | Summary: lang:core; crate::cmp::max_by; Argument[1]; ReturnValue; value | -| 807 | Summary: lang:core; crate::cmp::max_by_key; Argument[0]; Argument[2].Parameter[0].Reference; value | -| 808 | Summary: lang:core; crate::cmp::max_by_key; Argument[0]; ReturnValue; value | -| 809 | Summary: lang:core; crate::cmp::max_by_key; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 810 | Summary: lang:core; crate::cmp::max_by_key; Argument[1]; ReturnValue; value | -| 811 | Summary: lang:core; crate::cmp::min; Argument[0]; ReturnValue; value | -| 812 | Summary: lang:core; crate::cmp::min; Argument[1]; ReturnValue; value | -| 813 | Summary: lang:core; crate::cmp::min_by; Argument[0]; Argument[2].Parameter[1].Reference; value | -| 814 | Summary: lang:core; crate::cmp::min_by; Argument[0]; ReturnValue; value | -| 815 | Summary: lang:core; crate::cmp::min_by; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 816 | Summary: lang:core; crate::cmp::min_by; Argument[1]; ReturnValue; value | -| 817 | Summary: lang:core; crate::cmp::min_by_key; Argument[0]; Argument[2].Parameter[0].Reference; value | -| 818 | Summary: lang:core; crate::cmp::min_by_key; Argument[0]; ReturnValue; value | -| 819 | Summary: lang:core; crate::cmp::min_by_key; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 820 | Summary: lang:core; crate::cmp::min_by_key; Argument[1]; ReturnValue; value | -| 821 | Summary: lang:core; crate::cmp::minmax; Argument[0]; ReturnValue.Element; value | -| 822 | Summary: lang:core; crate::cmp::minmax; Argument[1]; ReturnValue.Element; value | -| 823 | Summary: lang:core; crate::cmp::minmax_by; Argument[0]; Argument[2].Parameter[1].Reference; value | -| 824 | Summary: lang:core; crate::cmp::minmax_by; Argument[0]; ReturnValue.Element; value | -| 825 | Summary: lang:core; crate::cmp::minmax_by; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 826 | Summary: lang:core; crate::cmp::minmax_by; Argument[1]; ReturnValue.Element; value | -| 827 | Summary: lang:core; crate::cmp::minmax_by_key; Argument[0]; Argument[2].Parameter[0].Reference; value | -| 828 | Summary: lang:core; crate::cmp::minmax_by_key; Argument[0]; ReturnValue.Element; value | -| 829 | Summary: lang:core; crate::cmp::minmax_by_key; Argument[1]; Argument[2].Parameter[0].Reference; value | -| 830 | Summary: lang:core; crate::cmp::minmax_by_key; Argument[1]; ReturnValue.Element; value | -| 831 | Summary: lang:core; crate::contracts::build_check_ensures; Argument[0]; ReturnValue; value | -| 832 | Summary: lang:core; crate::convert::identity; Argument[0]; ReturnValue; value | -| 833 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | -| 834 | Summary: lang:core; crate::intrinsics::contract_check_ensures; Argument[0]; Argument[1].Parameter[0]; value | -| 835 | Summary: lang:core; crate::intrinsics::select_unpredictable; Argument[1]; ReturnValue; value | -| 836 | Summary: lang:core; crate::intrinsics::select_unpredictable; Argument[2]; ReturnValue; value | -| 837 | Summary: lang:core; crate::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | -| 838 | Summary: lang:core; crate::iter::traits::iterator::Iterator::for_each; Argument[self].Element; Argument[0].Parameter[0]; value | -| 839 | Summary: lang:core; crate::iter::traits::iterator::Iterator::map; Argument[self].Element; Argument[0].Parameter[0]; value | -| 840 | Summary: lang:core; crate::iter::traits::iterator::Iterator::next; Argument[self].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 841 | Summary: lang:core; crate::iter::traits::iterator::Iterator::nth; Argument[self].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 842 | Summary: lang:core; crate::mem::copy; Argument[0].Reference; ReturnValue; value | -| 843 | Summary: lang:core; crate::mem::replace; Argument[0].Reference; ReturnValue; value | -| 844 | Summary: lang:core; crate::mem::replace; Argument[1]; Argument[0].Reference; value | -| 845 | Summary: lang:core; crate::mem::take; Argument[0].Reference; ReturnValue; value | -| 846 | Summary: lang:core; crate::num::flt2dec::strategy::dragon::mul_pow10; Argument[0]; ReturnValue; value | -| 847 | Summary: lang:core; crate::num::flt2dec::to_exact_exp_str; Argument[5].Element; Argument[0].Parameter[1].Reference; value | -| 848 | Summary: lang:core; crate::num::flt2dec::to_exact_fixed_str; Argument[4].Element; Argument[0].Parameter[1].Reference; value | -| 849 | Summary: lang:core; crate::num::flt2dec::to_shortest_exp_str; Argument[5]; Argument[0].Parameter[1]; value | -| 850 | Summary: lang:core; crate::num::flt2dec::to_shortest_str; Argument[4]; Argument[0].Parameter[1]; value | -| 851 | Summary: lang:core; crate::panic::abort_unwind; Argument[0].ReturnValue; ReturnValue; value | -| 852 | Summary: lang:core; crate::ptr::from_mut; Argument[0]; ReturnValue; value | -| 853 | Summary: lang:core; crate::ptr::from_ref; Argument[0]; ReturnValue; value | -| 854 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value | -| 855 | Summary: lang:core; crate::ptr::read_unaligned; Argument[0].Reference; ReturnValue; value | -| 856 | Summary: lang:core; crate::ptr::read_volatile; Argument[0].Reference; ReturnValue; value | -| 857 | Summary: lang:core; crate::ptr::replace; Argument[0].Reference; ReturnValue; value | -| 858 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value | -| 859 | Summary: lang:core; crate::ptr::write_unaligned; Argument[1]; Argument[0].Reference; value | -| 860 | Summary: lang:core; crate::ptr::write_volatile; Argument[1]; Argument[0].Reference; value | -| 861 | Summary: lang:core; crate::slice::sort::shared::find_existing_run; Argument[1].ReturnValue; ReturnValue.Field[1]; value | -| 862 | Summary: lang:core; crate::slice::sort::shared::smallsort::sort4_stable; Argument[0].Reference; Argument[2].Parameter[1].Reference; value | -| 863 | Summary: lang:core; crate::str::validations::next_code_point; Argument[0].Element; ReturnValue; value | -| 864 | Summary: lang:core; crate::unicode::unicode_data::conversions::to_lower; Argument[0]; ReturnValue.Element; value | -| 865 | Summary: lang:core; crate::unicode::unicode_data::conversions::to_upper; Argument[0]; ReturnValue.Element; value | -| 866 | Summary: lang:proc_macro; <&[u8] as crate::bridge::Mark>::mark; Argument[0]; ReturnValue; value | -| 867 | Summary: lang:proc_macro; <&[u8] as crate::bridge::Unmark>::unmark; Argument[self]; ReturnValue; value | -| 868 | Summary: lang:proc_macro; <&[u8] as crate::bridge::rpc::DecodeMut>::decode; Argument[0].Element; Argument[0].Reference.Reference; value | -| 869 | Summary: lang:proc_macro; <&[u8] as crate::bridge::rpc::DecodeMut>::decode; Argument[0].Element; ReturnValue.Reference; value | -| 870 | Summary: lang:proc_macro; <&str as crate::bridge::Mark>::mark; Argument[0]; ReturnValue; value | -| 871 | Summary: lang:proc_macro; <&str as crate::bridge::Unmark>::unmark; Argument[self]; ReturnValue; value | -| 872 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 873 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 874 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 875 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 876 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 877 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 878 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 879 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 880 | Summary: lang:proc_macro; ::into_token_stream; Argument[self]; ReturnValue; value | -| 881 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 882 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 883 | Summary: lang:proc_macro; ::take; Argument[self].Reference; ReturnValue; value | -| 884 | Summary: lang:proc_macro; ::clone; Argument[self].Reference; ReturnValue; value | -| 885 | Summary: lang:proc_macro; ::clone; Argument[self]; ReturnValue; value | -| 886 | Summary: lang:proc_macro; ::clone; Argument[self]; ReturnValue; value | -| 887 | Summary: lang:proc_macro; ::run_bridge_and_client; Argument[2].ReturnValue; ReturnValue; value | -| 888 | Summary: lang:proc_macro; ::run_bridge_and_client; Argument[2].ReturnValue; ReturnValue; value | -| 889 | Summary: lang:proc_macro; ::next; Argument[self].Field[0].Element; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 890 | Summary: lang:proc_macro; ::error; Argument[self]; ReturnValue; value | -| 891 | Summary: lang:proc_macro; ::help; Argument[self]; ReturnValue; value | -| 892 | Summary: lang:proc_macro; ::note; Argument[self]; ReturnValue; value | -| 893 | Summary: lang:proc_macro; ::span_error; Argument[self]; ReturnValue; value | -| 894 | Summary: lang:proc_macro; ::span_help; Argument[self]; ReturnValue; value | -| 895 | Summary: lang:proc_macro; ::span_note; Argument[self]; ReturnValue; value | -| 896 | Summary: lang:proc_macro; ::span_warning; Argument[self]; ReturnValue; value | -| 897 | Summary: lang:proc_macro; ::warning; Argument[self]; ReturnValue; value | -| 898 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 899 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 900 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 901 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 902 | Summary: lang:proc_macro; ::into_spans; Argument[self]; ReturnValue; value | -| 903 | Summary: lang:proc_macro; ::decode; Argument[0].Element; Argument[0].Reference.Reference; value | -| 904 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 905 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 906 | Summary: lang:proc_macro; ::decode; Argument[0].Element; Argument[0].Reference.Reference; value | -| 907 | Summary: lang:proc_macro; ::decode; Argument[0].Element; ReturnValue; value | -| 908 | Summary: lang:proc_macro; ::mark; Argument[0]; ReturnValue; value | -| 909 | Summary: lang:proc_macro; ::unmark; Argument[self]; ReturnValue; value | -| 910 | Summary: lang:proc_macro; ::decode; Argument[0].Element; Argument[0].Reference.Reference; value | -| 911 | Summary: lang:proc_macro; crate::bridge::client::state::set; Argument[1].ReturnValue; ReturnValue; value | -| 912 | Summary: lang:proc_macro; crate::bridge::client::state::set; Argument[1]; Argument[1].Parameter[0]; value | -| 913 | Summary: lang:proc_macro; crate::bridge::client::state::with; Argument[0].ReturnValue; ReturnValue; value | -| 914 | Summary: lang:std; <&[u8] as crate::io::BufRead>::consume; Argument[self].Element; Argument[self].Reference.Reference; value | -| 915 | Summary: lang:std; <&[u8] as crate::io::BufRead>::fill_buf; Argument[self].Reference; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 916 | Summary: lang:std; <&[u8] as crate::io::Read>::read_buf_exact; Argument[self].Element; Argument[self].Reference.Reference; value | -| 917 | Summary: lang:std; <&[u8] as crate::io::Read>::read_exact; Argument[self].Element; Argument[self].Reference.Reference; value | -| 918 | Summary: lang:std; <&[u8] as crate::io::Read>::read_to_end; Argument[self].Element; Argument[self].Reference.Reference; value | -| 919 | Summary: lang:std; <&[u8] as crate::io::Read>::read_to_string; Argument[self].Element; Argument[self].Reference.Reference; value | -| 920 | Summary: lang:std; <&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to; Argument[self].Element; Argument[self].Reference.Reference; value | -| 921 | Summary: lang:std; ::fold; Argument[0]; ReturnValue; value | -| 922 | Summary: lang:std; ::fold; Argument[0]; ReturnValue; value | -| 923 | Summary: lang:std; ::pretty; Argument[self]; ReturnValue; value | -| 924 | Summary: lang:std; ::show_backtrace; Argument[self]; ReturnValue; value | -| 925 | Summary: lang:std; ::as_ref; Argument[self]; ReturnValue; value | -| 926 | Summary: lang:std; ::borrow; Argument[self].Element; ReturnValue.Reference; value | -| 927 | Summary: lang:std; ::as_ref; Argument[self]; ReturnValue; value | -| 928 | Summary: lang:std; ::deref; Argument[self].Element; ReturnValue.Reference; value | -| 929 | Summary: lang:std; ::deref_mut; Argument[self].Element; ReturnValue.Reference; value | -| 930 | Summary: lang:std; ::as_os_str; Argument[self]; ReturnValue; value | -| 931 | Summary: lang:std; ::mode; Argument[self]; ReturnValue; value | -| 932 | Summary: lang:std; ::recursive; Argument[self]; ReturnValue; value | -| 933 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 934 | Summary: lang:std; ::set_created; Argument[self]; ReturnValue; value | -| 935 | Summary: lang:std; ::as_inner_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 936 | Summary: lang:std; ::set_accessed; Argument[self]; ReturnValue; value | -| 937 | Summary: lang:std; ::set_modified; Argument[self]; ReturnValue; value | -| 938 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 939 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 940 | Summary: lang:std; ::custom_flags; Argument[self]; ReturnValue; value | -| 941 | Summary: lang:std; ::mode; Argument[self]; ReturnValue; value | -| 942 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 943 | Summary: lang:std; ::as_inner_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 944 | Summary: lang:std; ::append; Argument[self]; ReturnValue; value | -| 945 | Summary: lang:std; ::create; Argument[self]; ReturnValue; value | -| 946 | Summary: lang:std; ::create_new; Argument[self]; ReturnValue; value | -| 947 | Summary: lang:std; ::read; Argument[self]; ReturnValue; value | -| 948 | Summary: lang:std; ::truncate; Argument[self]; ReturnValue; value | -| 949 | Summary: lang:std; ::write; Argument[self]; ReturnValue; value | -| 950 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 951 | Summary: lang:std; ::advance_slices; Argument[0].Reference.Element; Argument[0].Reference.Reference; value | -| 952 | Summary: lang:std; ::advance_slices; Argument[0].Reference.Element; Argument[0].Reference.Reference; value | -| 953 | Summary: lang:std; ::error; Argument[self].Field[1]; ReturnValue.Reference; value | -| 954 | Summary: lang:std; ::into_error; Argument[self].Field[1]; ReturnValue; value | -| 955 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 956 | Summary: lang:std; ::into_parts; Argument[self].Field[0]; ReturnValue.Field[1]; value | -| 957 | Summary: lang:std; ::into_parts; Argument[self].Field[1]; ReturnValue.Field[0]; value | -| 958 | Summary: lang:std; ::from; Argument[0].Field[1]; ReturnValue; value | -| 959 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 960 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 961 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 962 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 963 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 964 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 965 | Summary: lang:std; ::as_fd; Argument[self].Reference; ReturnValue; value | -| 966 | Summary: lang:std; ::new; Argument[0].ReturnValue; ReturnValue; value | -| 967 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 968 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 969 | Summary: lang:std; ::as_ref; Argument[self]; ReturnValue; value | -| 970 | Summary: lang:std; ::as_ref; Argument[self]; ReturnValue; value | -| 971 | Summary: lang:std; ::as_path; Argument[self]; ReturnValue; value | -| 972 | Summary: lang:std; ::arg0; Argument[self]; ReturnValue; value | -| 973 | Summary: lang:std; ::gid; Argument[self]; ReturnValue; value | -| 974 | Summary: lang:std; ::groups; Argument[self]; ReturnValue; value | -| 975 | Summary: lang:std; ::pre_exec; Argument[self]; ReturnValue; value | -| 976 | Summary: lang:std; ::process_group; Argument[self]; ReturnValue; value | -| 977 | Summary: lang:std; ::uid; Argument[self]; ReturnValue; value | -| 978 | Summary: lang:std; ::arg; Argument[self]; ReturnValue; value | -| 979 | Summary: lang:std; ::args; Argument[self]; ReturnValue; value | -| 980 | Summary: lang:std; ::current_dir; Argument[self]; ReturnValue; value | -| 981 | Summary: lang:std; ::env; Argument[self]; ReturnValue; value | -| 982 | Summary: lang:std; ::env_clear; Argument[self]; ReturnValue; value | -| 983 | Summary: lang:std; ::env_remove; Argument[self]; ReturnValue; value | -| 984 | Summary: lang:std; ::envs; Argument[self]; ReturnValue; value | -| 985 | Summary: lang:std; ::stderr; Argument[self]; ReturnValue; value | -| 986 | Summary: lang:std; ::stdin; Argument[self]; ReturnValue; value | -| 987 | Summary: lang:std; ::stdout; Argument[self]; ReturnValue; value | -| 988 | Summary: lang:std; ::report; Argument[self]; ReturnValue; value | -| 989 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 990 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 991 | Summary: lang:std; ::is_leader; Argument[self].Field[0]; ReturnValue; value | -| 992 | Summary: lang:std; ::write; Argument[1]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 993 | Summary: lang:std; ::write; Argument[1]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 994 | Summary: lang:std; ::write; Argument[1]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 995 | Summary: lang:std; ::set; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 996 | Summary: lang:std; ::try_insert; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)].Field[1]; value | -| 997 | Summary: lang:std; ::wait; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 998 | Summary: lang:std; ::wait_timeout; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)].Field[0]; value | -| 999 | Summary: lang:std; ::wait_timeout_ms; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)].Field[0]; value | -| 1000 | Summary: lang:std; ::wait_timeout_while; Argument[0].Reference; Argument[2].Parameter[0].Reference; value | -| 1001 | Summary: lang:std; ::wait_timeout_while; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)].Field[0]; value | -| 1002 | Summary: lang:std; ::wait_while; Argument[0].Reference; Argument[1].Parameter[0].Reference; value | -| 1003 | Summary: lang:std; ::wait_while; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 1004 | Summary: lang:std; ::timed_out; Argument[self].Field[0]; ReturnValue; value | -| 1005 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1006 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1007 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1008 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1009 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1010 | Summary: lang:std; ::try_map; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1011 | Summary: lang:std; ::bind; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 1012 | Summary: lang:std; ::bind; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 1013 | Summary: lang:std; ::connect; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 1014 | Summary: lang:std; ::connect; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 1015 | Summary: lang:std; ::bind; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 1016 | Summary: lang:std; ::bind; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 1017 | Summary: lang:std; ::connect; Argument[0].Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 1018 | Summary: lang:std; ::connect; Argument[0].Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 1019 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1020 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 1021 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1022 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 1023 | Summary: lang:std; ::as_inner; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1024 | Summary: lang:std; ::as_inner_mut; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1025 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 1026 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 1027 | Summary: lang:std; ::as_file_desc; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1028 | Summary: lang:std; ::into_raw; Argument[self].Field[0]; ReturnValue; value | -| 1029 | Summary: lang:std; ::index; Argument[self]; ReturnValue; value | -| 1030 | Summary: lang:std; ::into_string; Argument[self]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1031 | Summary: lang:std; ::name; Argument[self]; ReturnValue; value | -| 1032 | Summary: lang:std; ::no_hooks; Argument[self]; ReturnValue; value | -| 1033 | Summary: lang:std; ::stack_size; Argument[self]; ReturnValue; value | -| 1034 | Summary: lang:std; ::as_u64; Argument[self].Field[0]; ReturnValue; value | -| 1035 | Summary: lang:std; ::try_with; Argument[0].ReturnValue; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 1036 | Summary: lang:std; ::with; Argument[0].ReturnValue; ReturnValue; value | -| 1037 | Summary: lang:std; ::into_inner; Argument[self].Field[0]; ReturnValue; value | -| 1038 | Summary: lang:std; ::duration; Argument[self].Field[0]; ReturnValue; value | -| 1039 | Summary: lang:std; ::as_raw_fd; Argument[self].Reference; ReturnValue; value | -| 1040 | Summary: lang:std; ::from_raw_fd; Argument[0]; ReturnValue; value | -| 1041 | Summary: lang:std; ::into_raw_fd; Argument[self]; ReturnValue; value | -| 1042 | Summary: lang:std; <{486}::StaticStrPayload as crate::panic::PanicPayload>::as_str; Argument[self].Field[0]; ReturnValue.Field[crate::option::Option::Some(0)]; value | -| 1043 | Summary: lang:std; <{486}::StaticStrPayload as crate::panic::PanicPayload>::get; Argument[self].Field[0]; ReturnValue.Reference; value | -| 1044 | Summary: lang:std; <{491}::RewrapBox as crate::panic::PanicPayload>::get; Argument[self].Field[0].Reference; ReturnValue.Reference; value | -| 1045 | Summary: lang:std; crate::backtrace::helper::lazy_resolve; Argument[0]; ReturnValue; value | -| 1046 | Summary: lang:std; crate::io::append_to_string; Argument[1].ReturnValue.Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1047 | Summary: lang:std; crate::io::append_to_string; Argument[1].ReturnValue; ReturnValue; value | -| 1048 | Summary: lang:std; crate::io::default_read_buf; Argument[0].ReturnValue.Field[crate::option::Option::Some(0)]; ReturnValue; value | -| 1049 | Summary: lang:std; crate::io::default_read_buf; Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)]; ReturnValue; value | -| 1050 | Summary: lang:std; crate::io::default_read_vectored; Argument[0].ReturnValue; ReturnValue; value | -| 1051 | Summary: lang:std; crate::io::default_write_vectored; Argument[0].ReturnValue; ReturnValue; value | -| 1052 | Summary: lang:std; crate::sys::backtrace::__rust_begin_short_backtrace; Argument[0].ReturnValue; ReturnValue; value | -| 1053 | Summary: lang:std; crate::sys::backtrace::__rust_end_short_backtrace; Argument[0].ReturnValue; ReturnValue; value | -| 1054 | Summary: lang:std; crate::sys::pal::common::small_c_string::run_path_with_cstr; Argument[1].ReturnValue; ReturnValue; value | -| 1055 | Summary: lang:std; crate::sys::pal::common::small_c_string::run_with_cstr; Argument[1].ReturnValue; ReturnValue; value | -| 1056 | Summary: lang:std; crate::sys::pal::unix::cvt; Argument[0]; ReturnValue.Field[crate::result::Result::Ok(0)]; value | -| 1057 | Summary: lang:std; crate::sys_common::ignore_notfound; Argument[0].Field[crate::result::Result::Err(0)]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1058 | Summary: lang:std; crate::thread::current::set_current; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value | -| 1059 | Summary: lang:std; crate::thread::current::try_with_current; Argument[0].ReturnValue; ReturnValue; value | -| 1060 | Summary: lang:std; crate::thread::with_current_name; Argument[0].ReturnValue; ReturnValue; value | -| 1061 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_mut_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 1062 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 1063 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::try_from_mut_slice; Argument[0].Reference; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | -| 1064 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::try_from_slice; Argument[0].Reference; ReturnValue.Field[crate::result::Result::Ok(0)].Reference; value | -storeStep -| file://:0:0:0:0 | [summary] to write: Argument[0].Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0].Reference in lang:alloc::_::::retain | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0] in lang:alloc::_::::retain | -| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0].Reference in lang:alloc::_::::retain_mut | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0] in lang:alloc::_::::retain_mut | -| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0].Reference in lang:core::_::::take_if | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0] in lang:core::_::::take_if | -| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[1].Reference in lang:core::_::crate::num::flt2dec::to_exact_exp_str | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[1] in lang:core::_::crate::num::flt2dec::to_exact_exp_str | -| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[1].Reference in lang:core::_::crate::num::flt2dec::to_exact_fixed_str | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[1] in lang:core::_::crate::num::flt2dec::to_exact_fixed_str | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:alloc::_::<_ as crate::borrow::ToOwned>::clone_into | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:alloc::_::<_ as crate::borrow::ToOwned>::clone_into | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:alloc::_::crate::collections::btree::mem::replace | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:alloc::_::crate::collections::btree::mem::replace | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:alloc::_::crate::collections::btree::mem::take_mut | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:alloc::_::crate::collections::btree::mem::take_mut | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:core::_::crate::mem::replace | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::crate::mem::replace | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:core::_::crate::ptr::write | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::crate::ptr::write | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:core::_::crate::ptr::write_unaligned | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::crate::ptr::write_unaligned | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:core::_::crate::ptr::write_volatile | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::crate::ptr::write_volatile | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [post] [summary param] 0 in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:proc_macro::_::::decode | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] to write: Argument[0].Reference.Reference in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Reference in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:proc_macro::_::crate::bridge::client::state::set | function argument at 0 | file://:0:0:0:0 | [post] [summary param] 1 in lang:proc_macro::_::crate::bridge::client::state::set | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::filter_map | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::map | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::map_split | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::map_split | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::filter_map | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::map | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:core::_::::map_split | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:core::_::::map_split | -| file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0].Reference in lang:std::_::::wait_while | &ref | file://:0:0:0:0 | [summary] to write: Argument[1].Parameter[0] in lang:std::_::::wait_while | -| file://:0:0:0:0 | [summary] to write: Argument[1].Reference in lang:core::_::<_ as crate::clone::uninit::CopySpec>::clone_one | &ref | file://:0:0:0:0 | [post] [summary param] 1 in lang:core::_::<_ as crate::clone::uninit::CopySpec>::clone_one | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::max_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::max_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::max_by_key | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::max_by_key | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::min_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::min_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::min_by_key | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::min_by_key | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::minmax_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::minmax_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:core::_::crate::cmp::minmax_by_key | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:core::_::crate::cmp::minmax_by_key | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0].Reference in lang:std::_::::wait_timeout_while | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[0] in lang:std::_::::wait_timeout_while | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1].Reference in lang:core::_::crate::cmp::max_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1] in lang:core::_::crate::cmp::max_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1].Reference in lang:core::_::crate::cmp::min_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1] in lang:core::_::crate::cmp::min_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1].Reference in lang:core::_::crate::cmp::minmax_by | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1] in lang:core::_::crate::cmp::minmax_by | -| file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1].Reference in lang:core::_::crate::slice::sort::shared::smallsort::sort4_stable | &ref | file://:0:0:0:0 | [summary] to write: Argument[2].Parameter[1] in lang:core::_::crate::slice::sort::shared::smallsort::sort4_stable | -| file://:0:0:0:0 | [summary] to write: Argument[self].Element in lang:core::_::::for_each | element | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::for_each | -| file://:0:0:0:0 | [summary] to write: Argument[self].Element in lang:core::_::::map | element | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::for_each | element | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::for_each | -| file://:0:0:0:0 | [summary] to write: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::map | element | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::map | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::and_then | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::is_none_or | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::is_none_or | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::is_some_and | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::is_some_and | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map_or | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map_or_else | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::is_err_and | Err | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::is_err_and | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::map_err | Err | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::map_or_else | Err | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::or_else | Err | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::unwrap_or_else | Err | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::and_then | Ok | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::is_ok_and | Ok | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::is_ok_and | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::map_or | Ok | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary] to write: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::map_or_else | Ok | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:alloc::_::::add_assign | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:alloc::_::::add_assign | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:alloc::_::::clone_from | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:alloc::_::::clone_from | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::get_or_insert | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::get_or_insert | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::insert | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::insert | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::replace | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::replace | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::clone_from | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::clone_from | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::clone_from | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:core::_::::clone_from | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::BufRead>::consume | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::BufRead>::consume | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_exact | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_exact | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | &ref | file://:0:0:0:0 | [post] [summary param] self in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::get_or_insert | Some | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::get_or_insert | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::insert | Some | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::insert | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::replace | Some | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:core::_::::replace | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::BufRead>::consume | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::BufRead>::consume | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_exact | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_exact | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | -| file://:0:0:0:0 | [summary] to write: Argument[self].Reference.Reference in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | &ref | file://:0:0:0:0 | [summary] to write: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<_ as crate::convert::Into>::into | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::::collect | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::collect | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::cmp::minmax | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::cmp::minmax | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::cmp::minmax_by | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::cmp::minmax_by | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::cmp::minmax_by_key | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::cmp::minmax_by_key | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::iter::traits::iterator::Iterator::collect | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::iter::traits::iterator::Iterator::collect | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::unicode::unicode_data::conversions::to_lower | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::unicode::unicode_data::conversions::to_lower | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Element in lang:core::_::crate::unicode::unicode_data::conversions::to_upper | element | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::unicode::unicode_data::conversions::to_upper | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::align_to | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::align_to_mut | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::as_simd | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::as_simd | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::as_simd_mut | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::as_simd_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::partition_dedup | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::partition_dedup | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::partition_dedup_by | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::partition_dedup_by | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::partition_dedup_by_key | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::partition_dedup_by_key | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::div_rem_small | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::div_rem_small | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::div_rem_small | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::div_rem_small | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::unzip | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_abs | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::overflowing_div_euclid | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::overflowing_div_euclid | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:std::_::::into_parts | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::into_parts | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0] in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[0].Reference in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:alloc::_::::find_lower_bound_edge | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::find_lower_bound_edge | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:alloc::_::::find_upper_bound_edge | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::find_upper_bound_edge | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::<[_]>::align_to | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::::unzip | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::crate::slice::sort::shared::find_existing_run | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::slice::sort::shared::find_existing_run | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:std::_::::into_parts | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::into_parts | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1] in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[1].Reference in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2] in lang:core::_::<[_]>::align_to | tuple.2 | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference in lang:core::_::<[_]>::align_to | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2] in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference.Element in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[2].Reference in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::then | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::then | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::then_some | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::then_some | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::nth_back | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::nth_back | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::get | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::get | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::get_mut | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::get_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::clone | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::clone | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::from | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::from | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::from_output | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::from_output | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::as_mut | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::as_ref | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::cloned | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::copied | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::copied | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::map | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::zip | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::zip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::err | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::err | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::ok | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::ok | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::next | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::next | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::nth | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::nth | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::matching | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::matching | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_abs | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_abs | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::checked_next_multiple_of | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::checked_next_multiple_of | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::crate::iter::traits::iterator::Iterator::next | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::iter::traits::iterator::Iterator::next | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::crate::iter::traits::iterator::Iterator::nth | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::iter::traits::iterator::Iterator::nth | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:proc_macro::_::::next | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:proc_macro::_::::next | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::as_str | Some | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::as_str | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[0] in lang:core::_::::map | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[0] in lang:core::_::::zip | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::zip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[0] in lang:core::_::::matching | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::matching | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[1] in lang:core::_::::map | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[1] in lang:core::_::::zip | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::zip | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[1] in lang:core::_::::matching | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::matching | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[crate::result::Result::Err(0)] in lang:core::_::::transpose | Err | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Reference in lang:core::_::::from | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::from | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Reference in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)].Reference in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::try_from | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::try_from | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::downcast | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::downcast | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::left_kv | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::left_kv | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::right_kv | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::right_kv | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::ascend | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::ascend | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::choose_parent_kv | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::choose_parent_kv | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::try_from | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::try_from | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::downcast | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::downcast | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::try_unwrap | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::try_unwrap | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::try_from | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::try_from | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::downcast | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::downcast | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::try_unwrap | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::try_unwrap | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::push_within_capacity | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::push_within_capacity | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:alloc::_::::downcast | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::downcast | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::filter_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::filter_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::set | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::set | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::try_insert | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::ok_or | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::ok_or | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::ok_or_else | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::ok_or_else | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::transpose | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::clone | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::clone | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::and | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::and | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::and_then | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref_mut | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_mut | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_ref | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::cloned | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::copied | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::copied | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::flatten | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::flatten | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::map_err | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::write | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::write | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::write | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::write | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::write | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::write | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::set | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::set | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_insert | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_map | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::into_string | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::into_string | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::crate::io::append_to_string | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::crate::io::append_to_string | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::crate::sys_common::ignore_notfound | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::crate::sys_common::ignore_notfound | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::crate::thread::current::set_current | Err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::crate::thread::current::set_current | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Field[1] in lang:core::_::::try_insert | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Field[1] in lang:std::_::::try_insert | tuple.1 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Reference in lang:core::_::::as_deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Reference in lang:core::_::::as_deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Reference in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)].Reference in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Err(0)] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:alloc::_::::search_tree_for_bifurcation | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::search_tree_for_bifurcation | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:alloc::_::::from_str | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::from_str | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_insert | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::ok_or | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::ok_or | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::ok_or_else | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::ok_or_else | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::clone | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::clone | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::from_output | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::from_output | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_mut | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_ref | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::cloned | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::copied | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::copied | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::map | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::map | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::map_err | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::or | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::or | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::or_else | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::parse | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::parse | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::<&[u8] as crate::io::BufRead>::fill_buf | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<&[u8] as crate::io::BufRead>::fill_buf | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait_timeout | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout_ms | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait_timeout_ms | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout_while | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait_timeout_while | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_while | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::wait_while | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::try_with | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::try_with | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::crate::sys::pal::unix::cvt | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::crate::sys::pal::unix::cvt | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::chunk | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::chunk | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text_with_charset | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[0] in lang:alloc::_::::search_tree_for_bifurcation | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:alloc::_::::search_tree_for_bifurcation | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[0] in lang:std::_::::wait_timeout | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[0] in lang:std::_::::wait_timeout_ms | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout_ms | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[0] in lang:std::_::::wait_timeout_while | tuple.0 | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::::wait_timeout_while | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Field[crate::option::Option::Some(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::chunk | Some | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::chunk | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::try_insert | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue.Field[crate::result::Result::Ok(0)] in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::allocator | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::allocator | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_mut_ptr | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_mut_ptr | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ptr | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ptr | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::index | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::index | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::index_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::index_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_bytes | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_bytes | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_c_str | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_c_str | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:alloc::_::<{766}::StringError as crate::error::Error>::description | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:alloc::_::<{766}::StringError as crate::error::Error>::description | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::borrow_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::index | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::index | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::index_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::as_bytes | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::as_bytes | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::get_or_insert | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::get_or_insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::get_or_insert_default | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::get_or_insert_default | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::get_or_insert_with | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::get_or_insert_with | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::insert | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::insert | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::index | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::index | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:core::_::::index_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::borrow | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::borrow | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::deref | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::deref | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::deref_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::error | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::error | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_inner_mut | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::::as_file_desc | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::::as_file_desc | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | -| file://:0:0:0:0 | [summary] to write: ReturnValue.Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | &ref | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | -| main.rs:97:14:97:22 | source(...) | tuple.0 | main.rs:97:13:97:26 | TupleExpr | -| main.rs:97:25:97:25 | 2 | tuple.1 | main.rs:97:13:97:26 | TupleExpr | -| main.rs:103:14:103:14 | 2 | tuple.0 | main.rs:103:13:103:30 | TupleExpr | -| main.rs:103:17:103:26 | source(...) | tuple.1 | main.rs:103:13:103:30 | TupleExpr | -| main.rs:103:29:103:29 | 2 | tuple.2 | main.rs:103:13:103:30 | TupleExpr | -| main.rs:111:18:111:18 | 2 | tuple.0 | main.rs:111:17:111:31 | TupleExpr | -| main.rs:111:21:111:30 | source(...) | tuple.1 | main.rs:111:17:111:31 | TupleExpr | -| main.rs:114:11:114:20 | source(...) | tuple.0 | main.rs:114:5:114:5 | [post] a | -| main.rs:115:11:115:11 | 2 | tuple.1 | main.rs:115:5:115:5 | [post] a | -| main.rs:121:14:121:14 | 3 | tuple.0 | main.rs:121:13:121:27 | TupleExpr | -| main.rs:121:17:121:26 | source(...) | tuple.1 | main.rs:121:13:121:27 | TupleExpr | -| main.rs:122:14:122:14 | a | tuple.0 | main.rs:122:13:122:18 | TupleExpr | -| main.rs:122:17:122:17 | 3 | tuple.1 | main.rs:122:13:122:18 | TupleExpr | -| main.rs:137:24:137:32 | source(...) | Point.x | main.rs:137:13:137:40 | Point {...} | -| main.rs:137:38:137:38 | 2 | Point.y | main.rs:137:13:137:40 | Point {...} | -| main.rs:143:28:143:36 | source(...) | Point.x | main.rs:143:17:143:44 | Point {...} | -| main.rs:143:42:143:42 | 2 | Point.y | main.rs:143:17:143:44 | Point {...} | -| main.rs:145:11:145:20 | source(...) | Point.y | main.rs:145:5:145:5 | [post] p | -| main.rs:151:12:151:21 | source(...) | Point.x | main.rs:150:13:153:5 | Point {...} | -| main.rs:152:12:152:12 | 2 | Point.y | main.rs:150:13:153:5 | Point {...} | -| main.rs:166:16:169:9 | Point {...} | Point3D.plane | main.rs:165:13:171:5 | Point3D {...} | -| main.rs:167:16:167:16 | 2 | Point.x | main.rs:166:16:169:9 | Point {...} | -| main.rs:168:16:168:25 | source(...) | Point.y | main.rs:166:16:169:9 | Point {...} | -| main.rs:170:12:170:12 | 4 | Point3D.z | main.rs:165:13:171:5 | Point3D {...} | -| main.rs:180:16:180:32 | Point {...} | Point3D.plane | main.rs:179:13:182:5 | Point3D {...} | -| main.rs:180:27:180:27 | 2 | Point.x | main.rs:180:16:180:32 | Point {...} | -| main.rs:180:30:180:30 | y | Point.y | main.rs:180:16:180:32 | Point {...} | -| main.rs:181:12:181:12 | 4 | Point3D.z | main.rs:179:13:182:5 | Point3D {...} | -| main.rs:198:27:198:36 | source(...) | MyTupleStruct(0) | main.rs:198:13:198:40 | MyTupleStruct(...) | -| main.rs:198:39:198:39 | 2 | MyTupleStruct(1) | main.rs:198:13:198:40 | MyTupleStruct(...) | -| main.rs:214:27:214:36 | source(...) | Some | main.rs:214:14:214:37 | ...::Some(...) | -| main.rs:215:27:215:27 | 2 | Some | main.rs:215:14:215:28 | ...::Some(...) | -| main.rs:227:19:227:28 | source(...) | Some | main.rs:227:14:227:29 | Some(...) | -| main.rs:228:19:228:19 | 2 | Some | main.rs:228:14:228:20 | Some(...) | -| main.rs:240:19:240:28 | source(...) | Some | main.rs:240:14:240:29 | Some(...) | -| main.rs:245:19:245:28 | source(...) | Some | main.rs:245:14:245:29 | Some(...) | -| main.rs:248:19:248:19 | 0 | Some | main.rs:248:14:248:20 | Some(...) | -| main.rs:253:19:253:28 | source(...) | Some | main.rs:253:14:253:29 | Some(...) | -| main.rs:261:19:261:28 | source(...) | Some | main.rs:261:14:261:29 | Some(...) | -| main.rs:262:19:262:19 | 2 | Some | main.rs:262:14:262:20 | Some(...) | -| main.rs:266:10:266:10 | 0 | Some | main.rs:266:5:266:11 | Some(...) | -| main.rs:270:36:270:45 | source(...) | Ok | main.rs:270:33:270:46 | Ok(...) | -| main.rs:276:37:276:46 | source(...) | Err | main.rs:276:33:276:47 | Err(...) | -| main.rs:284:35:284:44 | source(...) | Ok | main.rs:284:32:284:45 | Ok(...) | -| main.rs:285:35:285:35 | 2 | Ok | main.rs:285:32:285:36 | Ok(...) | -| main.rs:286:36:286:45 | source(...) | Err | main.rs:286:32:286:46 | Err(...) | -| main.rs:293:8:293:8 | 0 | Ok | main.rs:293:5:293:9 | Ok(...) | -| main.rs:297:35:297:44 | source(...) | Ok | main.rs:297:32:297:45 | Ok(...) | -| main.rs:301:36:301:45 | source(...) | Err | main.rs:301:32:301:46 | Err(...) | -| main.rs:312:29:312:38 | source(...) | A | main.rs:312:14:312:39 | ...::A(...) | -| main.rs:313:29:313:29 | 2 | B | main.rs:313:14:313:30 | ...::B(...) | -| main.rs:330:16:330:25 | source(...) | A | main.rs:330:14:330:26 | A(...) | -| main.rs:331:16:331:16 | 2 | B | main.rs:331:14:331:17 | B(...) | -| main.rs:352:18:352:27 | source(...) | C | main.rs:351:14:353:5 | ...::C {...} | -| main.rs:354:41:354:41 | 2 | D | main.rs:354:14:354:43 | ...::D {...} | -| main.rs:372:18:372:27 | source(...) | C | main.rs:371:14:373:5 | C {...} | -| main.rs:374:27:374:27 | 2 | D | main.rs:374:14:374:29 | D {...} | -| main.rs:392:17:392:17 | 1 | element | main.rs:392:16:392:33 | [...] | -| main.rs:392:20:392:20 | 2 | element | main.rs:392:16:392:33 | [...] | -| main.rs:392:23:392:32 | source(...) | element | main.rs:392:16:392:33 | [...] | -| main.rs:396:17:396:26 | source(...) | element | main.rs:396:16:396:31 | [...; 10] | -| main.rs:400:17:400:17 | 1 | element | main.rs:400:16:400:24 | [...] | -| main.rs:400:20:400:20 | 2 | element | main.rs:400:16:400:24 | [...] | -| main.rs:400:23:400:23 | 3 | element | main.rs:400:16:400:24 | [...] | -| main.rs:406:17:406:17 | 1 | element | main.rs:406:16:406:33 | [...] | -| main.rs:406:20:406:20 | 2 | element | main.rs:406:16:406:33 | [...] | -| main.rs:406:23:406:32 | source(...) | element | main.rs:406:16:406:33 | [...] | -| main.rs:411:17:411:17 | 1 | element | main.rs:411:16:411:24 | [...] | -| main.rs:411:20:411:20 | 2 | element | main.rs:411:16:411:24 | [...] | -| main.rs:411:23:411:23 | 3 | element | main.rs:411:16:411:24 | [...] | -| main.rs:418:17:418:17 | 1 | element | main.rs:418:16:418:33 | [...] | -| main.rs:418:20:418:20 | 2 | element | main.rs:418:16:418:33 | [...] | -| main.rs:418:23:418:32 | source(...) | element | main.rs:418:16:418:33 | [...] | -| main.rs:429:24:429:24 | 1 | element | main.rs:429:23:429:31 | [...] | -| main.rs:429:27:429:27 | 2 | element | main.rs:429:23:429:31 | [...] | -| main.rs:429:30:429:30 | 3 | element | main.rs:429:23:429:31 | [...] | -| main.rs:432:18:432:27 | source(...) | element | main.rs:432:5:432:11 | [post] mut_arr | -| main.rs:444:41:444:67 | default_name | captured default_name | main.rs:444:41:444:67 | \|...\| ... | -| main.rs:479:15:479:24 | source(...) | element | main.rs:479:14:479:34 | [...] | -| main.rs:479:27:479:27 | 2 | element | main.rs:479:14:479:34 | [...] | -| main.rs:479:30:479:30 | 3 | element | main.rs:479:14:479:34 | [...] | -| main.rs:479:33:479:33 | 4 | element | main.rs:479:14:479:34 | [...] | -| main.rs:504:23:504:32 | source(...) | element | main.rs:504:22:504:42 | [...] | -| main.rs:504:35:504:35 | 2 | element | main.rs:504:22:504:42 | [...] | -| main.rs:504:38:504:38 | 3 | element | main.rs:504:22:504:42 | [...] | -| main.rs:504:41:504:41 | 4 | element | main.rs:504:22:504:42 | [...] | -| main.rs:519:18:519:18 | c | &ref | main.rs:519:17:519:18 | &c | -| main.rs:522:15:522:15 | b | &ref | main.rs:522:14:522:15 | &b | -| main.rs:531:27:531:27 | 0 | Some | main.rs:531:22:531:28 | Some(...) | -readStep -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::allocator | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[0].Field[1] in lang:alloc::_::::allocator | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::as_mut_ptr | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::as_mut_ptr | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::as_ptr | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::as_ptr | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::into_inner | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::into_inner | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::visit_nodes_in_order | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:alloc::_::::visit_nodes_in_order | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:alloc::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:alloc::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:alloc::_::::try_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:alloc::_::::try_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:alloc::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:alloc::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:alloc::_::::try_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:alloc::_::::try_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::unwrap_or_clone | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::unwrap_or_clone | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::unwrap_or_clone | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::unwrap_or_clone | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::::from | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[0].Field[0] in lang:alloc::_::::from | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::crate::collections::btree::mem::replace | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::crate::collections::btree::mem::replace | -| file://:0:0:0:0 | [summary param] 0 in lang:alloc::_::crate::collections::btree::mem::take_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::crate::collections::btree::mem::take_mut | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::<_ as crate::array::SpecArrayClone>::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::<_ as crate::array::SpecArrayClone>::clone | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::then | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::then | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::update | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::update | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::filter_map | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map_split | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::map_split | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::filter_map | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::filter_map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map_split | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::map_split | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::get_or_init | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::get_or_init | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::get_or_try_init | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::get_or_try_init | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::then_with | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::then_with | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::with_copy | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::with_copy | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[0].Field[0] in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::spec_fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[0].Field[0] in lang:core::_::::spec_fold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::from | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::from | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::and_then | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::is_none_or | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::is_none_or | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::is_some_and | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::is_some_and | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::ok_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::ok_or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::zip | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:core::_::::zip | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::and_then | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::is_err_and | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::is_err_and | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::is_ok_and | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::is_ok_and | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map_err | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::map_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::call | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[0].Field[0] in lang:core::_::::call | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::index | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::index | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::index_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::mem::copy | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::mem::copy | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::mem::replace | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::mem::replace | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::mem::take | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::mem::take | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::panic::abort_unwind | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::crate::panic::abort_unwind | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::ptr::read | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::ptr::read | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::ptr::read_unaligned | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::ptr::read_unaligned | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::ptr::read_volatile | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::ptr::read_volatile | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::ptr::replace | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::ptr::replace | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::slice::sort::shared::smallsort::sort4_stable | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::crate::slice::sort::shared::smallsort::sort4_stable | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::str::validations::next_code_point | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:core::_::crate::str::validations::next_code_point | -| file://:0:0:0:0 | [summary param] 0 in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:proc_macro::_::<&[u8] as crate::bridge::rpc::DecodeMut>::decode | -| file://:0:0:0:0 | [summary param] 0 in lang:proc_macro::_::::decode | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary param] 0 in lang:proc_macro::_::::decode | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary param] 0 in lang:proc_macro::_::::decode | element | file://:0:0:0:0 | [summary] read: Argument[0].Element in lang:proc_macro::_::::decode | -| file://:0:0:0:0 | [summary param] 0 in lang:proc_macro::_::crate::bridge::client::state::with | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:proc_macro::_::crate::bridge::client::state::with | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::advance_slices | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::from | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[0].Field[1] in lang:std::_::::from | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::new | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::::new | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::wait_timeout_while | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::wait_timeout_while | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::wait_while | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::wait_while | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::bind | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:std::_::::bind | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::bind | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:std::_::::bind | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::connect | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:std::_::::connect | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::connect | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:std::_::::connect | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::bind | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:std::_::::bind | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::bind | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:std::_::::bind | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::connect | Ok | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Ok(0)] in lang:std::_::::connect | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::connect | Some | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::option::Option::Some(0)] in lang:std::_::::connect | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::try_with | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::::try_with | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::::with | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::::with | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::io::default_read_buf | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::io::default_read_buf | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::io::default_read_vectored | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::io::default_read_vectored | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::io::default_write_vectored | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::io::default_write_vectored | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::sys::backtrace::__rust_begin_short_backtrace | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::sys::backtrace::__rust_begin_short_backtrace | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::sys::backtrace::__rust_end_short_backtrace | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::sys::backtrace::__rust_end_short_backtrace | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::sys_common::ignore_notfound | Err | file://:0:0:0:0 | [summary] read: Argument[0].Field[crate::result::Result::Err(0)] in lang:std::_::crate::sys_common::ignore_notfound | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::thread::current::try_with_current | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::thread::current::try_with_current | -| file://:0:0:0:0 | [summary param] 0 in lang:std::_::crate::thread::with_current_name | function return | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::thread::with_current_name | -<<<<<<< HEAD -| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_mut_slice | -| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::from_slice | -| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_mut_slice | -| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/fizyk20/generic-array.git:generic-array::_::::try_from_slice | -======= -| file://:0:0:0:0 | [summary param] 0 in repo:https://github.com/rust-lang/regex:regex::_::crate::escape | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference in repo:https://github.com/rust-lang/regex:regex::_::crate::escape | ->>>>>>> main -| file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::crate::collections::btree::mem::replace | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::crate::collections::btree::mem::replace | -| file://:0:0:0:0 | [summary param] 1 in lang:alloc::_::crate::collections::btree::mem::take_mut | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:alloc::_::crate::collections::btree::mem::take_mut | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::spec_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::spec_try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::spec_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::spec_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::spec_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_rfold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::try_fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::map_or | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::map_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::zip_with | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::map_or | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::map_or_else | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::::fold | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::crate::array::drain::drain_array_with | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::crate::array::drain::drain_array_with | -| file://:0:0:0:0 | [summary param] 1 in lang:core::_::crate::slice::sort::shared::find_existing_run | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::crate::slice::sort::shared::find_existing_run | -| file://:0:0:0:0 | [summary param] 1 in lang:proc_macro::_::crate::bridge::client::state::set | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:proc_macro::_::crate::bridge::client::state::set | -| file://:0:0:0:0 | [summary param] 1 in lang:std::_::crate::io::append_to_string | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:std::_::crate::io::append_to_string | -| file://:0:0:0:0 | [summary param] 1 in lang:std::_::crate::sys::pal::common::small_c_string::run_path_with_cstr | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:std::_::crate::sys::pal::common::small_c_string::run_path_with_cstr | -| file://:0:0:0:0 | [summary param] 1 in lang:std::_::crate::sys::pal::common::small_c_string::run_with_cstr | function return | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:std::_::crate::sys::pal::common::small_c_string::run_with_cstr | -| file://:0:0:0:0 | [summary param] 2 in lang:proc_macro::_::::run_bridge_and_client | function return | file://:0:0:0:0 | [summary] read: Argument[2].ReturnValue in lang:proc_macro::_::::run_bridge_and_client | -| file://:0:0:0:0 | [summary param] 2 in lang:proc_macro::_::::run_bridge_and_client | function return | file://:0:0:0:0 | [summary] read: Argument[2].ReturnValue in lang:proc_macro::_::::run_bridge_and_client | -| file://:0:0:0:0 | [summary param] 4 in lang:core::_::crate::num::flt2dec::to_exact_fixed_str | element | file://:0:0:0:0 | [summary] read: Argument[4].Element in lang:core::_::crate::num::flt2dec::to_exact_fixed_str | -| file://:0:0:0:0 | [summary param] 5 in lang:core::_::crate::num::flt2dec::to_exact_exp_str | element | file://:0:0:0:0 | [summary] read: Argument[5].Element in lang:core::_::crate::num::flt2dec::to_exact_exp_str | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::<&&str as crate::string::SpecToString>::spec_to_string | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::<&&str as crate::string::SpecToString>::spec_to_string | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::<&str as crate::string::SpecToString>::spec_to_string | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::<&str as crate::string::SpecToString>::spec_to_string | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::deref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_ref | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::deref | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::deref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::deref_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::index | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::index | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::index_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::index_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_bytes | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::as_bytes | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::split_off | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::split_off | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::retain | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::retain | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::retain_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::retain_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_c_str | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_c_str | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::into_vec | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[self].Field[1] in lang:alloc::_::::into_vec | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::nul_position | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::nul_position | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::::borrow_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:alloc::_::<{766}::StringError as crate::error::Error>::description | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::<{766}::StringError as crate::error::Error>::description | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&_ as crate::clone::Clone>::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&_ as crate::clone::Clone>::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&_ as crate::ops::deref::Deref>::deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&_ as crate::ops::deref::Deref>::deref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::ops::deref::Deref>::deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::ops::deref::Deref>::deref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<&mut _ as crate::ops::deref::DerefMut>::deref_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::ops::deref::DerefMut>::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<[_]>::align_to | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::<[_]>::align_to | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::convert::Into>::into | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::convert::Into>::into | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::<_ as crate::convert::Into>::into | -| file://:0:0:0:0 | [summary param] self in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::to_ascii_lowercase | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::to_ascii_lowercase | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::to_ascii_uppercase | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::to_ascii_uppercase | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::borrow | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::borrow_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::borrow_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_ref | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::deref | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::deref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::deref_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::index | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::index | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::index_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_bytes | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::as_bytes | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::rfold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::try_rfold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::try_fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::rfold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::fold | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::nth_back | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::nth_back | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::to_canonical | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::to_canonical | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::and_then | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::cloned | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::copied | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::copied | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::expect | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::flatten | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::flatten | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::get_or_insert | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::get_or_insert_default | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert_default | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::get_or_insert_with | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert_with | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::insert | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::insert | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::is_none_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::is_none_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::is_some_and | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::is_some_and | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_or_else | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::ok_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::ok_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::ok_or_else | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::ok_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::replace | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::replace | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::take | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::take | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::take_if | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::take_if | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::transpose | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unwrap | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_default | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unwrap_unchecked | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unzip | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::zip | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::zip | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::zip_with | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::zip_with | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::deref | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::deref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::deref_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::and | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::and | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::and_then | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::and_then | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::and_then | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_deref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_deref_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::cloned | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::cloned | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::cloned | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::copied | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::copied | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::copied | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::copied | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::expect | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::expect_err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::flatten | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::flatten | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::flatten | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::flatten | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::into_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::into_err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::into_ok | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::into_ok | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::is_err_and | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::is_err_and | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::is_ok_and | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::is_ok_and | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_err | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::map_err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_or | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::map_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_or_else | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map_or_else | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::map_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::ok | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::ok | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::or | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::or_else | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::or_else | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::transpose | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::transpose | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err_unchecked | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err_unchecked | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_default | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_unchecked | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::collect | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::collect | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::for_each | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::for_each | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::map | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::map | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::next | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::next | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::nth | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::::nth | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::collect | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::collect | -| file://:0:0:0:0 | [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::for_each | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::for_each | -| file://:0:0:0:0 | [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::map | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::map | -| file://:0:0:0:0 | [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::next | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::next | -| file://:0:0:0:0 | [summary param] self in lang:core::_::crate::iter::traits::iterator::Iterator::nth | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:core::_::crate::iter::traits::iterator::Iterator::nth | -| file://:0:0:0:0 | [summary param] self in lang:proc_macro::_::::take | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:proc_macro::_::::take | -| file://:0:0:0:0 | [summary param] self in lang:proc_macro::_::::clone | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:proc_macro::_::::clone | -| file://:0:0:0:0 | [summary param] self in lang:proc_macro::_::::next | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:proc_macro::_::::next | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::BufRead>::consume | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::BufRead>::consume | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::BufRead>::fill_buf | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:std::_::<&[u8] as crate::io::BufRead>::fill_buf | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::Read>::read_buf_exact | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_exact | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::Read>::read_exact | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::Read>::read_to_end | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::Read>::read_to_string | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::<&[u8] as crate::io::copy::BufferedReaderSpec>::copy_to | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::borrow | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::::borrow | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::deref | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::::deref | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::deref_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Element in lang:std::_::::deref_mut | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::error | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[self].Field[1] in lang:std::_::::error | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_error | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[self].Field[1] in lang:std::_::::into_error | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_parts | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_parts | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_parts | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[self].Field[1] in lang:std::_::::into_parts | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_fd | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:std::_::::as_fd | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::is_leader | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::is_leader | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::timed_out | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::timed_out | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_inner_mut | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_inner_mut | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_file_desc | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_file_desc | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_raw | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_raw | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_u64 | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::as_u64 | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::into_inner | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::into_inner | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::duration | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::::duration | -| file://:0:0:0:0 | [summary param] self in lang:std::_::::as_raw_fd | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:std::_::::as_raw_fd | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::as_str | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::as_str | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::<{486}::StaticStrPayload as crate::panic::PanicPayload>::get | -| file://:0:0:0:0 | [summary param] self in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::as_mut_ptr | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Reference in lang:alloc::_::::as_mut_ptr | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:alloc::_::::as_ptr | &ref | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Reference in lang:alloc::_::::as_ptr | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::from | Some | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::from | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::index | element | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Element in lang:core::_::::index | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:core::_::::index_mut | element | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Element in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::advance_slices | element | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Element in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] read: Argument[0].Reference in lang:std::_::::advance_slices | element | file://:0:0:0:0 | [summary] read: Argument[0].Reference.Element in lang:std::_::::advance_slices | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::get_or_init | Ok | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::get_or_init | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::get_or_try_init | Ok | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::get_or_try_init | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::get_or_try_init | Some | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::get_or_try_init | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::io::default_read_buf | Ok | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:std::_::crate::io::default_read_buf | -| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:std::_::crate::io::default_read_buf | Some | file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue.Field[crate::option::Option::Some(0)] in lang:std::_::crate::io::default_read_buf | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::<&mut _ as crate::iter::traits::double_ended::DoubleEndedIteratorRefSpec>::spec_try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::<&mut _ as crate::iter::traits::iterator::IteratorRefSpec>::spec_try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::spec_try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::spec_try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::spec_try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_rfold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_rfold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Ok | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Ok(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:core::_::::try_fold | Some | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::option::Option::Some(0)] in lang:core::_::::try_fold | -| file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue in lang:std::_::crate::io::append_to_string | Err | file://:0:0:0:0 | [summary] read: Argument[1].ReturnValue.Field[crate::result::Result::Err(0)] in lang:std::_::crate::io::append_to_string | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::index | element | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Element in lang:alloc::_::::index | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:alloc::_::::index_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Element in lang:alloc::_::::index_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::index | element | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Element in lang:core::_::::index | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::index_mut | element | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Element in lang:core::_::::index_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::into_inner | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Field[crate::option::Option::Some(0)] in lang:core::_::::into_inner | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::rfold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Field[0] in lang:core::_::::rfold | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:core::_::::fold | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Field[0] in lang:core::_::::fold | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:proc_macro::_::::next | element | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Element in lang:proc_macro::_::::next | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[0] in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Field[0].Reference in lang:std::_::<{491}::RewrapBox as crate::panic::PanicPayload>::get | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::copied | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Reference in lang:core::_::::copied | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::map | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Field[0] in lang:core::_::::map | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | Err | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Field[crate::result::Result::Err(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | tuple.0 | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Field[0] in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)] in lang:core::_::::unzip | tuple.1 | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::option::Option::Some(0)].Field[1] in lang:core::_::::unzip | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)] in lang:core::_::::unwrap_or_else | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Err(0)].Reference in lang:core::_::::unwrap_or_else | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::copied | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)].Reference in lang:core::_::::copied | -| file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)] in lang:core::_::::transpose | Some | file://:0:0:0:0 | [summary] read: Argument[self].Field[crate::result::Result::Ok(0)].Field[crate::option::Option::Some(0)] in lang:core::_::::transpose | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::<&&str as crate::string::SpecToString>::spec_to_string | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::<&&str as crate::string::SpecToString>::spec_to_string | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::deref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::deref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::deref_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::deref_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:alloc::_::::as_ref | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:alloc::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&_ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&mut _ as crate::borrow::Borrow>::borrow | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | &ref | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Reference in lang:core::_::<&mut _ as crate::borrow::BorrowMut>::borrow_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::convert::Into>::into | element | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Element in lang:core::_::<_ as crate::convert::Into>::into | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | function return | file://:0:0:0:0 | [summary] read: Argument[self].Reference.ReturnValue in lang:core::_::<_ as crate::str::pattern::MultiCharEq>::matches | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::get_or_insert | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert_default | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::get_or_insert_default | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::get_or_insert_with | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::get_or_insert_with | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::insert | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::insert | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::take_if | Some | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::option::Option::Some(0)] in lang:core::_::::take_if | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_deref | Err | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_deref_mut | Err | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Err(0)] in lang:core::_::::as_deref_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | Err | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Err(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_mut | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_mut | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | Err | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Err(0)] in lang:core::_::::as_ref | -| file://:0:0:0:0 | [summary] read: Argument[self].Reference in lang:core::_::::as_ref | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Reference.Field[crate::result::Result::Ok(0)] in lang:core::_::::as_ref | -| main.rs:36:9:36:15 | Some(...) | Some | main.rs:36:14:36:14 | _ | -| main.rs:90:11:90:11 | i | &ref | main.rs:90:10:90:11 | * ... | -| main.rs:98:10:98:10 | a | tuple.0 | main.rs:98:10:98:12 | a.0 | -| main.rs:99:10:99:10 | a | tuple.1 | main.rs:99:10:99:12 | a.1 | -| main.rs:104:9:104:20 | TuplePat | tuple.0 | main.rs:104:10:104:11 | a0 | -| main.rs:104:9:104:20 | TuplePat | tuple.1 | main.rs:104:14:104:15 | a1 | -| main.rs:104:9:104:20 | TuplePat | tuple.2 | main.rs:104:18:104:19 | a2 | -| main.rs:112:10:112:10 | a | tuple.0 | main.rs:112:10:112:12 | a.0 | -| main.rs:113:10:113:10 | a | tuple.1 | main.rs:113:10:113:12 | a.1 | -| main.rs:114:5:114:5 | a | tuple.0 | main.rs:114:5:114:7 | a.0 | -| main.rs:115:5:115:5 | a | tuple.1 | main.rs:115:5:115:7 | a.1 | -| main.rs:116:10:116:10 | a | tuple.0 | main.rs:116:10:116:12 | a.0 | -| main.rs:117:10:117:10 | a | tuple.1 | main.rs:117:10:117:12 | a.1 | -| main.rs:123:10:123:10 | b | tuple.0 | main.rs:123:10:123:12 | b.0 | -| main.rs:123:10:123:12 | b.0 | tuple.0 | main.rs:123:10:123:15 | ... .0 | -| main.rs:124:10:124:10 | b | tuple.0 | main.rs:124:10:124:12 | b.0 | -| main.rs:124:10:124:12 | b.0 | tuple.1 | main.rs:124:10:124:15 | ... .1 | -| main.rs:125:10:125:10 | b | tuple.1 | main.rs:125:10:125:12 | b.1 | -| main.rs:138:10:138:10 | p | Point.x | main.rs:138:10:138:12 | p.x | -| main.rs:139:10:139:10 | p | Point.y | main.rs:139:10:139:12 | p.y | -| main.rs:144:10:144:10 | p | Point.y | main.rs:144:10:144:12 | p.y | -| main.rs:145:5:145:5 | p | Point.y | main.rs:145:5:145:7 | p.y | -| main.rs:146:10:146:10 | p | Point.y | main.rs:146:10:146:12 | p.y | -| main.rs:154:9:154:28 | Point {...} | Point.x | main.rs:154:20:154:20 | a | -| main.rs:154:9:154:28 | Point {...} | Point.y | main.rs:154:26:154:26 | b | -| main.rs:172:10:172:10 | p | Point3D.plane | main.rs:172:10:172:16 | p.plane | -| main.rs:172:10:172:16 | p.plane | Point.x | main.rs:172:10:172:18 | ... .x | -| main.rs:173:10:173:10 | p | Point3D.plane | main.rs:173:10:173:16 | p.plane | -| main.rs:173:10:173:16 | p.plane | Point.y | main.rs:173:10:173:18 | ... .y | -| main.rs:174:10:174:10 | p | Point3D.z | main.rs:174:10:174:12 | p.z | -| main.rs:184:9:187:9 | Point3D {...} | Point3D.plane | main.rs:185:20:185:33 | Point {...} | -| main.rs:184:9:187:9 | Point3D {...} | Point3D.z | main.rs:186:13:186:13 | z | -| main.rs:185:20:185:33 | Point {...} | Point.x | main.rs:185:28:185:28 | x | -| main.rs:185:20:185:33 | Point {...} | Point.y | main.rs:185:31:185:31 | y | -| main.rs:199:10:199:10 | s | MyTupleStruct(0) | main.rs:199:10:199:12 | s.0 | -| main.rs:199:10:199:10 | s | tuple.0 | main.rs:199:10:199:12 | s.0 | -| main.rs:200:10:200:10 | s | MyTupleStruct(1) | main.rs:200:10:200:12 | s.1 | -| main.rs:200:10:200:10 | s | tuple.1 | main.rs:200:10:200:12 | s.1 | -| main.rs:203:9:203:27 | MyTupleStruct(...) | MyTupleStruct(0) | main.rs:203:23:203:23 | x | -| main.rs:203:9:203:27 | MyTupleStruct(...) | MyTupleStruct(1) | main.rs:203:26:203:26 | y | -| main.rs:217:9:217:23 | ...::Some(...) | Some | main.rs:217:22:217:22 | n | -| main.rs:221:9:221:23 | ...::Some(...) | Some | main.rs:221:22:221:22 | n | -| main.rs:230:9:230:15 | Some(...) | Some | main.rs:230:14:230:14 | n | -| main.rs:234:9:234:15 | Some(...) | Some | main.rs:234:14:234:14 | n | -| main.rs:241:10:241:11 | s1 | &ref | main.rs:241:10:241:11 | receiver for s1 | -| main.rs:246:10:246:11 | s1 | &ref | main.rs:246:10:246:11 | receiver for s1 | -| main.rs:249:10:249:11 | s2 | &ref | main.rs:249:10:249:11 | receiver for s2 | -| main.rs:254:10:254:11 | s1 | &ref | main.rs:254:10:254:11 | receiver for s1 | -| main.rs:257:10:257:11 | s2 | &ref | main.rs:257:10:257:11 | receiver for s2 | -| main.rs:263:14:263:15 | s1 | Ok | main.rs:263:14:263:16 | TryExpr | -| main.rs:263:14:263:15 | s1 | Some | main.rs:263:14:263:16 | TryExpr | -| main.rs:265:10:265:11 | s2 | Ok | main.rs:265:10:265:12 | TryExpr | -| main.rs:265:10:265:11 | s2 | Some | main.rs:265:10:265:12 | TryExpr | -| main.rs:271:29:271:30 | r1 | &ref | main.rs:271:29:271:30 | receiver for r1 | -| main.rs:272:29:272:30 | r1 | &ref | main.rs:272:29:272:30 | receiver for r1 | -| main.rs:273:10:273:12 | o1a | &ref | main.rs:273:10:273:12 | receiver for o1a | -| main.rs:274:10:274:12 | o1b | &ref | main.rs:274:10:274:12 | receiver for o1b | -| main.rs:277:29:277:30 | r2 | &ref | main.rs:277:29:277:30 | receiver for r2 | -| main.rs:278:29:278:30 | r2 | &ref | main.rs:278:29:278:30 | receiver for r2 | -| main.rs:279:10:279:12 | o2a | &ref | main.rs:279:10:279:12 | receiver for o2a | -| main.rs:280:10:280:12 | o2b | &ref | main.rs:280:10:280:12 | receiver for o2b | -| main.rs:287:14:287:15 | s1 | Ok | main.rs:287:14:287:16 | TryExpr | -| main.rs:287:14:287:15 | s1 | Some | main.rs:287:14:287:16 | TryExpr | -| main.rs:288:14:288:15 | s2 | Ok | main.rs:288:14:288:16 | TryExpr | -| main.rs:288:14:288:15 | s2 | Some | main.rs:288:14:288:16 | TryExpr | -| main.rs:291:14:291:15 | s3 | Ok | main.rs:291:14:291:16 | TryExpr | -| main.rs:291:14:291:15 | s3 | Some | main.rs:291:14:291:16 | TryExpr | -| main.rs:298:10:298:11 | s1 | &ref | main.rs:298:10:298:11 | receiver for s1 | -| main.rs:299:10:299:11 | s1 | &ref | main.rs:299:10:299:11 | receiver for s1 | -| main.rs:302:10:302:11 | s2 | &ref | main.rs:302:10:302:11 | receiver for s2 | -| main.rs:303:10:303:11 | s2 | &ref | main.rs:303:10:303:11 | receiver for s2 | -| main.rs:315:9:315:25 | ...::A(...) | A | main.rs:315:24:315:24 | n | -| main.rs:316:9:316:25 | ...::B(...) | B | main.rs:316:24:316:24 | n | -| main.rs:319:9:319:25 | ...::A(...) | A | main.rs:319:24:319:24 | n | -| main.rs:319:29:319:45 | ...::B(...) | B | main.rs:319:44:319:44 | n | -| main.rs:322:9:322:25 | ...::A(...) | A | main.rs:322:24:322:24 | n | -| main.rs:323:9:323:25 | ...::B(...) | B | main.rs:323:24:323:24 | n | -| main.rs:333:9:333:12 | A(...) | A | main.rs:333:11:333:11 | n | -| main.rs:334:9:334:12 | B(...) | B | main.rs:334:11:334:11 | n | -| main.rs:337:9:337:12 | A(...) | A | main.rs:337:11:337:11 | n | -| main.rs:337:16:337:19 | B(...) | B | main.rs:337:18:337:18 | n | -| main.rs:340:9:340:12 | A(...) | A | main.rs:340:11:340:11 | n | -| main.rs:341:9:341:12 | B(...) | B | main.rs:341:11:341:11 | n | -| main.rs:356:9:356:38 | ...::C {...} | C | main.rs:356:36:356:36 | n | -| main.rs:357:9:357:38 | ...::D {...} | D | main.rs:357:36:357:36 | n | -| main.rs:360:9:360:38 | ...::C {...} | C | main.rs:360:36:360:36 | n | -| main.rs:360:42:360:71 | ...::D {...} | D | main.rs:360:69:360:69 | n | -| main.rs:363:9:363:38 | ...::C {...} | C | main.rs:363:36:363:36 | n | -| main.rs:364:9:364:38 | ...::D {...} | D | main.rs:364:36:364:36 | n | -| main.rs:376:9:376:24 | C {...} | C | main.rs:376:22:376:22 | n | -| main.rs:377:9:377:24 | D {...} | D | main.rs:377:22:377:22 | n | -| main.rs:380:9:380:24 | C {...} | C | main.rs:380:22:380:22 | n | -| main.rs:380:28:380:43 | D {...} | D | main.rs:380:41:380:41 | n | -| main.rs:383:9:383:24 | C {...} | C | main.rs:383:22:383:22 | n | -| main.rs:384:9:384:24 | D {...} | D | main.rs:384:22:384:22 | n | -| main.rs:393:14:393:17 | arr1 | element | main.rs:393:14:393:20 | arr1[2] | -| main.rs:397:14:397:17 | arr2 | element | main.rs:397:14:397:20 | arr2[4] | -| main.rs:401:14:401:17 | arr3 | element | main.rs:401:14:401:20 | arr3[2] | -| main.rs:407:15:407:18 | arr1 | element | main.rs:407:9:407:10 | n1 | -| main.rs:412:15:412:18 | arr2 | element | main.rs:412:9:412:10 | n2 | -| main.rs:420:9:420:17 | SlicePat | element | main.rs:420:10:420:10 | a | -| main.rs:420:9:420:17 | SlicePat | element | main.rs:420:13:420:13 | b | -| main.rs:420:9:420:17 | SlicePat | element | main.rs:420:16:420:16 | c | -| main.rs:430:10:430:16 | mut_arr | element | main.rs:430:10:430:19 | mut_arr[1] | -| main.rs:432:5:432:11 | mut_arr | element | main.rs:432:5:432:14 | mut_arr[1] | -| main.rs:433:13:433:19 | mut_arr | element | main.rs:433:13:433:22 | mut_arr[1] | -| main.rs:435:10:435:16 | mut_arr | element | main.rs:435:10:435:19 | mut_arr[0] | -| main.rs:442:9:442:20 | TuplePat | tuple.0 | main.rs:442:10:442:13 | cond | -| main.rs:442:9:442:20 | TuplePat | tuple.1 | main.rs:442:16:442:19 | name | -| main.rs:442:25:442:29 | names | element | main.rs:442:9:442:20 | TuplePat | -| main.rs:444:21:444:24 | name | &ref | main.rs:444:21:444:24 | receiver for name | -| main.rs:444:41:444:67 | [post] \|...\| ... | captured default_name | main.rs:444:41:444:67 | [post] default_name | -| main.rs:444:44:444:55 | default_name | &ref | main.rs:444:44:444:55 | receiver for default_name | -| main.rs:444:44:444:55 | this | captured default_name | main.rs:444:44:444:55 | default_name | -| main.rs:445:18:445:18 | n | &ref | main.rs:445:18:445:18 | receiver for n | -| main.rs:468:13:468:13 | a | &ref | main.rs:468:13:468:13 | receiver for a | -| main.rs:469:13:469:13 | b | &ref | main.rs:469:13:469:13 | receiver for b | -| main.rs:470:19:470:19 | b | &ref | main.rs:470:19:470:19 | receiver for b | -| main.rs:481:10:481:11 | vs | element | main.rs:481:10:481:14 | vs[0] | -| main.rs:482:11:482:12 | vs | &ref | main.rs:482:11:482:12 | receiver for vs | -| main.rs:482:11:482:35 | ... .unwrap(...) | &ref | main.rs:482:10:482:35 | * ... | -| main.rs:483:11:483:12 | vs | &ref | main.rs:483:11:483:12 | receiver for vs | -| main.rs:483:11:483:35 | ... .unwrap(...) | &ref | main.rs:483:10:483:35 | * ... | -| main.rs:485:14:485:15 | vs | element | main.rs:485:9:485:9 | v | -| main.rs:488:9:488:10 | &... | &ref | main.rs:488:10:488:10 | v | -| main.rs:488:15:488:16 | vs | &ref | main.rs:488:15:488:16 | receiver for vs | -| main.rs:488:15:488:23 | vs.iter(...) | element | main.rs:488:9:488:10 | &... | -| main.rs:492:27:492:28 | vs | &ref | main.rs:492:27:492:28 | receiver for vs | -| main.rs:493:9:493:10 | &... | &ref | main.rs:493:10:493:10 | v | -| main.rs:493:15:493:17 | vs2 | element | main.rs:493:9:493:10 | &... | -| main.rs:497:5:497:6 | vs | &ref | main.rs:497:5:497:6 | receiver for vs | -| main.rs:497:29:497:29 | x | &ref | main.rs:497:28:497:29 | * ... | -| main.rs:498:5:498:6 | vs | &ref | main.rs:498:5:498:6 | receiver for vs | -| main.rs:498:34:498:34 | x | &ref | main.rs:498:33:498:34 | * ... | -| main.rs:500:14:500:15 | vs | &ref | main.rs:500:14:500:15 | receiver for vs | -| main.rs:500:14:500:27 | vs.into_iter(...) | element | main.rs:500:9:500:9 | v | -| main.rs:506:10:506:15 | vs_mut | element | main.rs:506:10:506:18 | vs_mut[0] | -| main.rs:507:11:507:16 | vs_mut | &ref | main.rs:507:11:507:16 | receiver for vs_mut | -| main.rs:507:11:507:39 | ... .unwrap(...) | &ref | main.rs:507:10:507:39 | * ... | -| main.rs:508:11:508:16 | vs_mut | &ref | main.rs:508:11:508:16 | receiver for vs_mut | -| main.rs:508:11:508:39 | ... .unwrap(...) | &ref | main.rs:508:10:508:39 | * ... | -| main.rs:510:9:510:14 | &mut ... | &ref | main.rs:510:14:510:14 | v | -| main.rs:510:19:510:24 | vs_mut | &ref | main.rs:510:19:510:24 | receiver for vs_mut | -| main.rs:510:19:510:35 | vs_mut.iter_mut(...) | element | main.rs:510:9:510:14 | &mut ... | -| main.rs:524:11:524:15 | c_ref | &ref | main.rs:524:10:524:15 | * ... | -======= | main.rs:524:11:524:15 | [post] receiver for c_ref | main.rs:524:11:524:15 | [post] c_ref | | main.rs:524:11:524:15 | c_ref | main.rs:524:11:524:15 | receiver for c_ref | | main.rs:528:9:528:9 | [SSA] a | main.rs:530:10:530:10 | a | @@ -3324,4 +1091,3 @@ storeStep | main.rs:519:18:519:18 | c | file://:0:0:0:0 | &ref | main.rs:519:17:519:18 | &c | | main.rs:522:15:522:15 | b | file://:0:0:0:0 | &ref | main.rs:522:14:522:15 | &b | | main.rs:545:27:545:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:545:22:545:28 | Some(...) | ->>>>>>> main diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 86c2812d1620..b74dbb80d969 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -1,228 +1,35 @@ #select -| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | -| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | -| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | -| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:47:30:47:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:47:30:47:47 | ...::new | a key | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | -| test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:67:23:67:33 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:67:23:67:33 | ...::new | a key | -| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | -| test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:81:23:81:61 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:81:23:81:61 | ...::new | a key | -| test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:85:23:85:61 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:85:23:85:61 | ...::new | an initialization vector | -| test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:126:19:126:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:126:19:126:32 | ...::new | a key | -| test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:127:21:127:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:127:21:127:27 | encrypt | a nonce | -| test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:132:19:132:32 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:132:19:132:32 | ...::new | a key | -| test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:133:21:133:27 | encrypt | This hard-coded value is used as $@. | test_cipher.rs:133:21:133:27 | encrypt | a nonce | edges -| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | -| test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | -| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | -| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | -| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | -| test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | -| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | -| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | -| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | -| test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | -| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | -| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | -| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | -| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | -| test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | -| test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | -| test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | -| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | -| test_cipher.rs:45:9:45:14 | const9 | test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | provenance | MaD:10 | -| test_cipher.rs:45:27:45:50 | [...] | test_cipher.rs:45:9:45:14 | const9 | provenance | | -| test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | provenance | | -| test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | provenance | | -| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | test_cipher.rs:47:30:47:47 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | -| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:9 | -| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | -| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:40 | const2 [&ref, element] | provenance | | -| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:12 | -| test_cipher.rs:66:18:66:26 | &... [&ref, element] | test_cipher.rs:66:9:66:14 | const2 [&ref, element] | provenance | | -| test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | test_cipher.rs:66:18:66:26 | &... [&ref, element] | provenance | | -| test_cipher.rs:66:20:66:22 | 0u8 | test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | test_cipher.rs:67:35:67:47 | const2.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | test_cipher.rs:67:23:67:33 | ...::new | provenance | MaD:2 Sink:MaD:2 | -| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | -| test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | -| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | -| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:8 Sink:MaD:8 Sink:MaD:8 | -| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:68 | const6 [&ref, element] | provenance | | -| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:12 | -| test_cipher.rs:80:18:80:26 | &... [&ref, element] | test_cipher.rs:80:9:80:14 | const6 [&ref, element] | provenance | | -| test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | test_cipher.rs:80:18:80:26 | &... [&ref, element] | provenance | | -| test_cipher.rs:80:20:80:22 | 0u8 | test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | test_cipher.rs:81:63:81:75 | const6.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | test_cipher.rs:81:23:81:61 | ...::new | provenance | MaD:7 Sink:MaD:7 | -| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:80 | const7 [&ref, element] | provenance | | -| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:12 | -| test_cipher.rs:84:18:84:27 | &... [&ref, element] | test_cipher.rs:84:9:84:14 | const7 [&ref, element] | provenance | | -| test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | test_cipher.rs:84:18:84:27 | &... [&ref, element] | provenance | | -| test_cipher.rs:84:20:84:22 | 0u8 | test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | test_cipher.rs:85:75:85:87 | const7.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | test_cipher.rs:85:23:85:61 | ...::new | provenance | MaD:6 Sink:MaD:6 | -| test_cipher.rs:124:9:124:12 | key2 [element] | test_cipher.rs:126:35:126:45 | key2.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:124:25:124:30 | [0; 32] [element] | test_cipher.rs:124:9:124:12 | key2 [element] | provenance | | -| test_cipher.rs:124:26:124:26 | 0 | test_cipher.rs:124:25:124:30 | [0; 32] [element] | provenance | | -| test_cipher.rs:125:9:125:14 | nonce2 [element] | test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:125:18:125:23 | [0; 12] [element] | test_cipher.rs:125:9:125:14 | nonce2 [element] | provenance | | -| test_cipher.rs:125:19:125:19 | 0 | test_cipher.rs:125:18:125:23 | [0; 12] [element] | provenance | | -| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:19:126:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_cipher.rs:126:35:126:45 | key2.into(...) [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | -| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:21:127:27 | encrypt | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | -| test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | -| test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | provenance | | -| test_cipher.rs:129:32:129:41 | &... [&ref, element] | test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | provenance | | -| test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | test_cipher.rs:129:32:129:41 | &... [&ref, element] | provenance | | -| test_cipher.rs:129:34:129:37 | 0xff | test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | provenance | | -| test_cipher.rs:130:9:130:12 | key3 [&ref, element] | test_cipher.rs:132:35:132:38 | key3 [&ref, element] | provenance | | -| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | test_cipher.rs:130:9:130:12 | key3 [&ref, element] | provenance | | -| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | -| test_cipher.rs:131:9:131:14 | nonce3 [element] | test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | provenance | MaD:11 | -| test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | test_cipher.rs:131:9:131:14 | nonce3 [element] | provenance | | -| test_cipher.rs:131:28:131:31 | 0xff | test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | provenance | | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | test_cipher.rs:132:19:132:32 | ...::new | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_cipher.rs:132:35:132:38 | key3 [&ref, element] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | provenance | | -| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:21:133:27 | encrypt | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | -| test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | -models -| 1 | Sink: repo:https://github.com/RustCrypto/AEADs:aes-gcm; ::new; credentials-key; Argument[0] | -| 2 | Sink: repo:https://github.com/RustCrypto/block-ciphers:aes; ::new; credentials-key; Argument[0] | -| 3 | Sink: repo:https://github.com/RustCrypto/traits:aead; <_ as crate::Aead>::encrypt; credentials-nonce; Argument[0] | -| 4 | Sink: repo:https://github.com/RustCrypto/traits:cipher; ::new; credentials-iv; Argument[1] | -| 5 | Sink: repo:https://github.com/RustCrypto/traits:cipher; ::new; credentials-key; Argument[0] | -| 6 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; <_ as crate::KeyIvInit>::new; credentials-iv; Argument[1] | -| 7 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; <_ as crate::KeyIvInit>::new; credentials-key; Argument[0] | -| 8 | Sink: repo:https://github.com/RustCrypto/traits:crypto-common; crate::KeyInit::new_from_slice; credentials-key; Argument[0] | -| 9 | Source: lang:core; crate::mem::zeroed; constant-source; ReturnValue.Element | -| 10 | Summary: lang:core; <[_]>::align_to; Argument[self].Element; ReturnValue.Field[0,1,2].Reference.Element; taint | -| 11 | Summary: lang:core; <_ as crate::convert::Into>::into; Argument[self].Element; ReturnValue.Element; taint | -| 12 | Summary: lang:core; <_ as crate::convert::Into>::into; Argument[self].Reference.Element; ReturnValue.Element; taint | -| 13 | Summary: repo:https://github.com/fizyk20/generic-array.git:generic-array; ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | nodes -| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | -| test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | -| test_cipher.rs:18:30:18:32 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | -| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | -| test_cipher.rs:25:28:25:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | -| test_cipher.rs:25:30:25:32 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | -| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | -| test_cipher.rs:29:28:29:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | -| test_cipher.rs:29:30:29:32 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | -| test_cipher.rs:37:9:37:14 | const7 | semmle.label | const7 | -| test_cipher.rs:37:27:37:74 | [...] | semmle.label | [...] | -| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | semmle.label | &const7 [&ref] | -| test_cipher.rs:38:74:38:79 | const7 | semmle.label | const7 | -| test_cipher.rs:41:9:41:14 | const8 [&ref] | semmle.label | const8 [&ref] | -| test_cipher.rs:41:28:41:76 | &... [&ref] | semmle.label | &... [&ref] | -| test_cipher.rs:41:29:41:76 | [...] | semmle.label | [...] | -| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | -| test_cipher.rs:45:9:45:14 | const9 | semmle.label | const9 | -| test_cipher.rs:45:27:45:50 | [...] | semmle.label | [...] | -| test_cipher.rs:46:9:46:19 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | -| test_cipher.rs:46:32:46:54 | const9.align_to(...) [tuple.1, &ref, element] | semmle.label | const9.align_to(...) [tuple.1, &ref, element] | -| test_cipher.rs:46:32:46:56 | ... .1 [&ref, element] | semmle.label | ... .1 [&ref, element] | -| test_cipher.rs:47:30:47:47 | ...::new | semmle.label | ...::new | -| test_cipher.rs:47:49:47:84 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:47:73:47:83 | const9_conv [&ref, element] | semmle.label | const9_conv [&ref, element] | -| test_cipher.rs:50:9:50:15 | const10 [element] | semmle.label | const10 [element] | -| test_cipher.rs:50:37:50:52 | ...::zeroed | semmle.label | ...::zeroed | -| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | semmle.label | ...::zeroed(...) [element] | -| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | -| test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | -| test_cipher.rs:66:9:66:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | -| test_cipher.rs:66:18:66:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:66:19:66:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | -| test_cipher.rs:66:20:66:22 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:67:23:67:33 | ...::new | semmle.label | ...::new | -| test_cipher.rs:67:35:67:40 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | -| test_cipher.rs:67:35:67:47 | const2.into(...) [element] | semmle.label | const2.into(...) [element] | -| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | -| test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | -| test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | -| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | -| test_cipher.rs:80:9:80:14 | const6 [&ref, element] | semmle.label | const6 [&ref, element] | -| test_cipher.rs:80:18:80:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:80:19:80:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | -| test_cipher.rs:80:20:80:22 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:81:23:81:61 | ...::new | semmle.label | ...::new | -| test_cipher.rs:81:63:81:68 | const6 [&ref, element] | semmle.label | const6 [&ref, element] | -| test_cipher.rs:81:63:81:75 | const6.into(...) [element] | semmle.label | const6.into(...) [element] | -| test_cipher.rs:84:9:84:14 | const7 [&ref, element] | semmle.label | const7 [&ref, element] | -| test_cipher.rs:84:18:84:27 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:84:19:84:27 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | -| test_cipher.rs:84:20:84:22 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:85:23:85:61 | ...::new | semmle.label | ...::new | -| test_cipher.rs:85:75:85:80 | const7 [&ref, element] | semmle.label | const7 [&ref, element] | -| test_cipher.rs:85:75:85:87 | const7.into(...) [element] | semmle.label | const7.into(...) [element] | -| test_cipher.rs:124:9:124:12 | key2 [element] | semmle.label | key2 [element] | -| test_cipher.rs:124:25:124:30 | [0; 32] [element] | semmle.label | [0; 32] [element] | -| test_cipher.rs:124:26:124:26 | 0 | semmle.label | 0 | -| test_cipher.rs:125:9:125:14 | nonce2 [element] | semmle.label | nonce2 [element] | -| test_cipher.rs:125:18:125:23 | [0; 12] [element] | semmle.label | [0; 12] [element] | -| test_cipher.rs:125:19:125:19 | 0 | semmle.label | 0 | -| test_cipher.rs:126:19:126:32 | ...::new | semmle.label | ...::new | -| test_cipher.rs:126:34:126:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:126:35:126:45 | key2.into(...) [element] | semmle.label | key2.into(...) [element] | -| test_cipher.rs:127:21:127:27 | encrypt | semmle.label | encrypt | -| test_cipher.rs:127:29:127:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:127:30:127:42 | nonce2.into(...) [element] | semmle.label | nonce2.into(...) [element] | -| test_cipher.rs:129:9:129:18 | key3_array [&ref, element] | semmle.label | key3_array [&ref, element] | -| test_cipher.rs:129:32:129:41 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:129:33:129:41 | [0xff; 32] [element] | semmle.label | [0xff; 32] [element] | -| test_cipher.rs:129:34:129:37 | 0xff | semmle.label | 0xff | -| test_cipher.rs:130:9:130:12 | key3 [&ref, element] | semmle.label | key3 [&ref, element] | -| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | -| test_cipher.rs:130:45:130:54 | key3_array [&ref, element] | semmle.label | key3_array [&ref, element] | -| test_cipher.rs:131:9:131:14 | nonce3 [element] | semmle.label | nonce3 [element] | -| test_cipher.rs:131:27:131:35 | [0xff; 12] [element] | semmle.label | [0xff; 12] [element] | -| test_cipher.rs:131:28:131:31 | 0xff | semmle.label | 0xff | -| test_cipher.rs:132:19:132:32 | ...::new | semmle.label | ...::new | -| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref, element] | semmle.label | &key3 [&ref, &ref, element] | -| test_cipher.rs:132:35:132:38 | key3 [&ref, element] | semmle.label | key3 [&ref, element] | -| test_cipher.rs:133:21:133:27 | encrypt | semmle.label | encrypt | -| test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | -| test_cipher.rs:133:30:133:42 | nonce3.into(...) [element] | semmle.label | nonce3.into(...) [element] | subpaths +testFailures +| test_cipher.rs:18:39:18:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:19:83:19:91 | //... | Missing result: Sink | +| test_cipher.rs:25:39:25:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:26:104:26:112 | //... | Missing result: Sink | +| test_cipher.rs:29:39:29:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:30:105:30:113 | //... | Missing result: Sink | +| test_cipher.rs:37:77:37:123 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:38:84:38:92 | //... | Missing result: Sink | +| test_cipher.rs:41:79:41:125 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:42:83:42:91 | //... | Missing result: Sink | +| test_cipher.rs:45:53:45:99 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:47:88:47:96 | //... | Missing result: Sink | +| test_cipher.rs:50:59:50:105 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:51:86:51:94 | //... | Missing result: Sink | +| test_cipher.rs:66:29:66:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:67:51:67:59 | //... | Missing result: Sink | +| test_cipher.rs:73:29:73:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:74:64:74:72 | //... | Missing result: Sink | +| test_cipher.rs:80:29:80:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:81:90:81:98 | //... | Missing result: Sink | +| test_cipher.rs:84:30:84:76 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:85:91:85:99 | //... | Missing result: Sink | +| test_cipher.rs:124:33:124:79 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:125:26:125:72 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:126:49:126:57 | //... | Missing result: Sink | +| test_cipher.rs:127:78:127:86 | //... | Missing result: Sink | +| test_cipher.rs:129:44:129:90 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:131:38:131:84 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | +| test_cipher.rs:132:42:132:50 | //... | Missing result: Sink | +| test_cipher.rs:133:78:133:86 | //... | Missing result: Sink | From fc8a662f0dcd5bc95bcc99bd4cfafe40bb5d532a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:39:38 +0100 Subject: [PATCH 29/35] Rust: Update the models. --- .../rust/frameworks/genericarray.model.yml | 10 +- .../rustcrypto/rustcrypto.model.yml | 67 ++++----- .../frameworks/stdlib/lang-core.model.yml | 21 ++- .../HardcodedCryptographicValue.expected | 132 ++++++++++++++++-- 4 files changed, 156 insertions(+), 74 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml index ec88db8d5dab..76e2569a67aa 100644 --- a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml @@ -1,9 +1,9 @@ extensions: - addsTo: pack: codeql/rust-all - extensible: summaryModelDeprecated + extensible: summaryModel data: - - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] - - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::from_mut_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] - - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::try_from_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] - - ["repo:https://github.com/fizyk20/generic-array.git:generic-array", "::try_from_mut_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] + - ["::from_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::from_mut_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::try_from_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] + - ["::try_from_mut_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index cab98f0687a8..7ceae820001c 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -1,45 +1,3 @@ -extensions: - - addsTo: - pack: codeql/rust-all - extensible: sinkModelDeprecated - data: - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:cipher", "::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/block-ciphers:aes", "::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "crate::KeyInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:crypto-common", "<_ as crate::KeyIvInit>::new_from_slices", "Argument[1]", "credentials-iv", "manual"] - - ["repo:https://github.com/RustCrypto/AEADs:aes-gcm", "::new", "Argument[0]", "credentials-key", "manual"] - - ["repo:https://github.com/RustCrypto/traits:aead", "<_ as crate::Aead>::encrypt", "Argument[0]", "credentials-nonce", "manual"] extensions: - addsTo: pack: codeql/rust-all @@ -50,3 +8,28 @@ extensions: - ["<_ as digest::digest::Digest>::chain_update", "Argument[0]", "hasher-input", "manual"] - ["<_ as digest::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] - ["md5::compute", "Argument[0]", "hasher-input", "manual"] + - ["<_ as crypto_common::KeyInit>::new", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyInit>::new", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as aead::Aead>::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index e3d9e419dd4c..8b9adcdf521e 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -1,21 +1,14 @@ extensions: - - addsTo: - pack: codeql/rust-all - extensible: sourceModelDeprecated - data: - - ["lang:core", "crate::mem::zeroed", "ReturnValue.Element", "constant-source", "manual"] - - addsTo: - pack: codeql/rust-all - extensible: summaryModelDeprecated - data: - # Conversions - - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - - ["lang:core", "<_ as crate::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] - - ["lang:core", "<[_]>::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel data: + # Conversions + - ["::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] @@ -72,6 +65,8 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: + # Mem + - ["core::mem::zeroed", "ReturnValue.Element", "constant-source", "manual"] # Ptr - ["core::ptr::drop_in_place", "Argument[0]", "pointer-invalidate", "manual"] - ["core::ptr::dangling", "ReturnValue", "pointer-invalidate", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index b74dbb80d969..cac8a23381eb 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -1,26 +1,130 @@ #select +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | edges +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | +| test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:6 | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +models +| 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | +| 2 | Sink: ::new; Argument[0]; credentials-key | +| 3 | Sink: ::new; Argument[1]; credentials-iv | +| 4 | Sink: ::new; Argument[0]; credentials-key | +| 5 | Sink: ::new; Argument[1]; credentials-iv | +| 6 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | +| 7 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | nodes +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:18:30:18:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:25:30:25:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:29:30:29:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:37:9:37:14 | const7 | semmle.label | const7 | +| test_cipher.rs:37:27:37:74 | [...] | semmle.label | [...] | +| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | semmle.label | &const7 [&ref] | +| test_cipher.rs:38:74:38:79 | const7 | semmle.label | const7 | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:41:28:41:76 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:41:29:41:76 | [...] | semmle.label | [...] | +| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:50:9:50:15 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:50:37:50:52 | ...::zeroed | semmle.label | ...::zeroed | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | semmle.label | ...::zeroed(...) [element] | +| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | +| test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | subpaths testFailures -| test_cipher.rs:18:39:18:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:19:83:19:91 | //... | Missing result: Sink | -| test_cipher.rs:25:39:25:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:26:104:26:112 | //... | Missing result: Sink | -| test_cipher.rs:29:39:29:85 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:30:105:30:113 | //... | Missing result: Sink | -| test_cipher.rs:37:77:37:123 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:38:84:38:92 | //... | Missing result: Sink | -| test_cipher.rs:41:79:41:125 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:42:83:42:91 | //... | Missing result: Sink | | test_cipher.rs:45:53:45:99 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | | test_cipher.rs:47:88:47:96 | //... | Missing result: Sink | -| test_cipher.rs:50:59:50:105 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:51:86:51:94 | //... | Missing result: Sink | | test_cipher.rs:66:29:66:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | | test_cipher.rs:67:51:67:59 | //... | Missing result: Sink | -| test_cipher.rs:73:29:73:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:74:64:74:72 | //... | Missing result: Sink | | test_cipher.rs:80:29:80:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | | test_cipher.rs:81:90:81:98 | //... | Missing result: Sink | | test_cipher.rs:84:30:84:76 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | From 796cb193fcf8f36176b7c277b9a048ff4cc56b73 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 21 Jul 2025 13:50:57 +0100 Subject: [PATCH 30/35] Rust: Accept test regressions with new format MaD. --- .../HardcodedCryptographicValue.expected | 17 ---------- .../security/CWE-798/test_cipher.rs | 32 +++++++++---------- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index cac8a23381eb..2155fef0d407 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -120,20 +120,3 @@ nodes | test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | subpaths -testFailures -| test_cipher.rs:45:53:45:99 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:47:88:47:96 | //... | Missing result: Sink | -| test_cipher.rs:66:29:66:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:67:51:67:59 | //... | Missing result: Sink | -| test_cipher.rs:80:29:80:75 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:81:90:81:98 | //... | Missing result: Sink | -| test_cipher.rs:84:30:84:76 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:85:91:85:99 | //... | Missing result: Sink | -| test_cipher.rs:124:33:124:79 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:125:26:125:72 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:126:49:126:57 | //... | Missing result: Sink | -| test_cipher.rs:127:78:127:86 | //... | Missing result: Sink | -| test_cipher.rs:129:44:129:90 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:131:38:131:84 | //... | Missing result: Alert[rust/hard-coded-cryptographic-value] | -| test_cipher.rs:132:42:132:50 | //... | Missing result: Sink | -| test_cipher.rs:133:78:133:86 | //... | Missing result: Sink | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 79dfbabbd989..3aa0ffc9febc 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -42,9 +42,9 @@ fn test_stream_cipher_rabbit( let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink rabbit_cipher8.apply_keystream(&mut data); - let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] - let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ Sink + let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ MISSING: Sink rabbit_cipher9.apply_keystream(&mut data); let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hard-coded-cryptographic-value] @@ -63,8 +63,8 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] - let aes_cipher2 = Aes256::new(const2.into()); // $ Sink + let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher2 = Aes256::new(const2.into()); // $ MISSING: Sink aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); @@ -77,12 +77,12 @@ fn test_block_cipher_aes( let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const6 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] - let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ Sink + let const6 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ MISSING: Sink _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const7 = &[0u8; 16]; // $ Alert[rust/hard-coded-cryptographic-value] - let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ Sink + let const7 = &[0u8; 16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ MISSING: Sink _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); // various string conversions @@ -121,16 +121,16 @@ fn test_aes_gcm( let cipher1 = Aes256Gcm::new(&key1); let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); - let key2: [u8;32] = [0;32]; // $ Alert[rust/hard-coded-cryptographic-value] - let nonce2 = [0;12]; // $ Alert[rust/hard-coded-cryptographic-value] - let cipher2 = Aes256Gcm::new(&key2.into()); // $ Sink - let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ Sink + let key2: [u8;32] = [0;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let nonce2 = [0;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let cipher2 = Aes256Gcm::new(&key2.into()); // $ MISSING: Sink + let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink - let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let key3_array: &[u8;32] = &[0xff;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] let key3 = Key::::from_slice(key3_array); - let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hard-coded-cryptographic-value] - let cipher3 = Aes256Gcm::new(&key3); // $ Sink - let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink + let nonce3: [u8;12] = [0xff;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let cipher3 = Aes256Gcm::new(&key3); // $ MISSING: Sink + let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink // with barrier From ec3ad855040800c320dbb75cd03ce92283f2c62e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:49:19 +0100 Subject: [PATCH 31/35] Rust: Add another test case for barriers (that still functions). --- .../HardcodedCryptographicValueExtensions.qll | 3 ++- .../CWE-798/HardcodedCryptographicValue.expected | 12 ++++++++++++ .../test/query-tests/security/CWE-798/test_cipher.rs | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index f92af99375f1..5a5d7263055d 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -103,7 +103,8 @@ module HardcodedCryptographicValue { ce.getFunction().(PathExpr).getResolvedCrateOrigin() = "repo:https://github.com/rust-random/getrandom:getrandom" and ce.getFunction().(PathExpr).getResolvedPath() = ["crate::fill", "crate::getrandom"] and - this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) + this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) and + none() ) } } diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 2155fef0d407..1c2f17706b87 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -12,6 +12,7 @@ | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | +| test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:146:13:146:34 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:146:13:146:34 | ...::new_from_slice | a key | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | @@ -58,6 +59,11 @@ edges | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_cipher.rs:144:9:144:16 | mut key5 [element] | test_cipher.rs:146:37:146:40 | key5 [element] | provenance | | +| test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | test_cipher.rs:144:9:144:16 | mut key5 [element] | provenance | | +| test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | test_cipher.rs:146:13:146:34 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_cipher.rs:146:37:146:40 | key5 [element] | test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | provenance | | models | 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | | 2 | Sink: ::new; Argument[0]; credentials-key | @@ -119,4 +125,10 @@ nodes | test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | | test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:144:9:144:16 | mut key5 [element] | semmle.label | mut key5 [element] | +| test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:144:21:144:23 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:146:13:146:34 | ...::new_from_slice | semmle.label | ...::new_from_slice | +| test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | semmle.label | &key5 [&ref, element] | +| test_cipher.rs:146:37:146:40 | key5 [element] | semmle.label | key5 [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 3aa0ffc9febc..9ada150125eb 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -140,4 +140,8 @@ fn test_aes_gcm( _ = getrandom2::getrandom(&mut nonce4).unwrap(); let cipher4 = Aes256Gcm::new(&key4.into()); let _ = cipher4.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); + + let mut key5 = [0u8;32]; // $ SPURIOUS: Alert[rust/hard-coded-cryptographic-value] + _ = getrandom::fill(&mut key5).unwrap(); + let _ = Aes256::new_from_slice(&key5).unwrap(); // $ Sink } From d53dada67fbed53e41bc5499f5826ec3452b9b6b Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:52:47 +0100 Subject: [PATCH 32/35] Rust: Update barrier logic to use getCanonicalPath. --- .../HardcodedCryptographicValueExtensions.qll | 10 ++++------ .../CWE-798/HardcodedCryptographicValue.expected | 12 ------------ .../test/query-tests/security/CWE-798/test_cipher.rs | 4 ++-- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 5a5d7263055d..785a7f815bcd 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -99,12 +99,10 @@ module HardcodedCryptographicValue { */ private class GetRandomBarrier extends Barrier { GetRandomBarrier() { - exists(CallExpr ce | - ce.getFunction().(PathExpr).getResolvedCrateOrigin() = - "repo:https://github.com/rust-random/getrandom:getrandom" and - ce.getFunction().(PathExpr).getResolvedPath() = ["crate::fill", "crate::getrandom"] and - this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) and - none() + exists(CallExprBase ce | + ce.getStaticTarget().(Addressable).getCanonicalPath() = + ["getrandom::fill", "getrandom::getrandom"] and + this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) ) } } diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 1c2f17706b87..2155fef0d407 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -12,7 +12,6 @@ | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | -| test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:146:13:146:34 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:146:13:146:34 | ...::new_from_slice | a key | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | @@ -59,11 +58,6 @@ edges | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_cipher.rs:144:9:144:16 | mut key5 [element] | test_cipher.rs:146:37:146:40 | key5 [element] | provenance | | -| test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | test_cipher.rs:144:9:144:16 | mut key5 [element] | provenance | | -| test_cipher.rs:144:21:144:23 | 0u8 | test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | provenance | | -| test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | test_cipher.rs:146:13:146:34 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_cipher.rs:146:37:146:40 | key5 [element] | test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | provenance | | models | 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | | 2 | Sink: ::new; Argument[0]; credentials-key | @@ -125,10 +119,4 @@ nodes | test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | | test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | -| test_cipher.rs:144:9:144:16 | mut key5 [element] | semmle.label | mut key5 [element] | -| test_cipher.rs:144:20:144:27 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | -| test_cipher.rs:144:21:144:23 | 0u8 | semmle.label | 0u8 | -| test_cipher.rs:146:13:146:34 | ...::new_from_slice | semmle.label | ...::new_from_slice | -| test_cipher.rs:146:36:146:40 | &key5 [&ref, element] | semmle.label | &key5 [&ref, element] | -| test_cipher.rs:146:37:146:40 | key5 [element] | semmle.label | key5 [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 9ada150125eb..7278f786b100 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -141,7 +141,7 @@ fn test_aes_gcm( let cipher4 = Aes256Gcm::new(&key4.into()); let _ = cipher4.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); - let mut key5 = [0u8;32]; // $ SPURIOUS: Alert[rust/hard-coded-cryptographic-value] + let mut key5 = [0u8;32]; _ = getrandom::fill(&mut key5).unwrap(); - let _ = Aes256::new_from_slice(&key5).unwrap(); // $ Sink + let _ = Aes256::new_from_slice(&key5).unwrap(); } From 43ac82f6a33fd3a11e8478b6942b5f63ed96651d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 21 Jul 2025 21:01:01 +0100 Subject: [PATCH 33/35] Rust: Update consistency check .expected files. --- .../CWE-798/CONSISTENCY/ExtractionConsistency.expected | 0 .../CONSISTENCY/PathResolutionConsistency.expected | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected diff --git a/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..b0ca63000651 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,10 @@ +multipleCallTargets +| test_cipher.rs:15:30:15:77 | ...::new(...) | +| test_cipher.rs:19:30:19:80 | ...::new(...) | +| test_cipher.rs:22:30:22:98 | ...::new(...) | +| test_cipher.rs:26:30:26:101 | ...::new(...) | +| test_cipher.rs:30:30:30:102 | ...::new(...) | +| test_cipher.rs:38:30:38:81 | ...::new(...) | +| test_cipher.rs:42:30:42:80 | ...::new(...) | +| test_cipher.rs:47:30:47:85 | ...::new(...) | +| test_cipher.rs:51:31:51:83 | ...::new(...) | From 1945fb8258f5678c2fb87c3409b040ff952ba327 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 21 Jul 2025 21:09:42 +0100 Subject: [PATCH 34/35] Rust: Accept changes to query suites. --- .../query-suite/rust-code-scanning.qls.expected | 1 + .../query-suite/rust-security-and-quality.qls.expected | 1 + .../query-suite/rust-security-extended.qls.expected | 1 + 3 files changed, 3 insertions(+) diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index b3683f02d927..f2dc65b84006 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -15,6 +15,7 @@ ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 650bf3169412..14f1f44127cd 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -16,6 +16,7 @@ ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index b5df88f96eca..50ed9b311eb7 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -15,6 +15,7 @@ ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql From f7d822b19c7f5225877c9c5978170f2dc083ea8e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:43:22 +0100 Subject: [PATCH 35/35] Rust: Remove empty file. --- .../security/CWE-798/CONSISTENCY/ExtractionConsistency.expected | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected diff --git a/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index e69de29bb2d1..000000000000