From 3b40a5875a170e835c74560781217b5a272874dd Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 20 May 2025 15:21:32 +0100 Subject: [PATCH 1/4] Rust: Add test cases (generated by LLM). --- .../security/CWE-312/test_logging.rs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs index 970a9caf0ee5..529d3ed9a034 100644 --- a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs +++ b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs @@ -2,6 +2,7 @@ use log::{debug, error, info, trace, warn, log, Level}; use std::io::Write as _; use std::fmt::Write as _; +use log_err::{LogErrOption, LogErrResult}; // --- tests --- @@ -146,6 +147,32 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { warn!("message = {}", s2); // (this implementation does not output the password field) warn!("message = {:?}", s2); // $ MISSING: Alert[rust/cleartext-logging]=s2 warn!("message = {:#?}", s2); // $ MISSING: Alert[rust/cleartext-logging]=s2 + + // test log_expect with sensitive data + let password2 = "123456".to_string(); // Create new password for this test + let sensitive_opt: Option = Some(password2.clone()); + + // log_expect tests with LogErrOption trait + let _ = sensitive_opt.log_expect("Option is None"); // $ Alert[rust/cleartext-logging] + + // log_expect tests with LogErrResult trait + let sensitive_result: Result = Ok(password2.clone()); + let _ = sensitive_result.log_expect("Result failed"); // $ Alert[rust/cleartext-logging] + + // log_unwrap tests with LogErrOption trait + let sensitive_opt2: Option = Some(password2.clone()); + let _ = sensitive_opt2.log_unwrap(); // $ Alert[rust/cleartext-logging] + + // log_unwrap tests with LogErrResult trait + let sensitive_result2: Result = Ok(password2.clone()); + let _ = sensitive_result2.log_unwrap(); // $ Alert[rust/cleartext-logging] + + // Negative cases that should fail and log + let none_opt: Option = None; + let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ Alert[rust/cleartext-logging] + + let err_result: Result = Err(password2); + let _ = err_result.log_unwrap(); // $ Alert[rust/cleartext-logging] } fn test_std(password: String, i: i32, opt_i: Option) { From 355e440fdfc25e4364252b6aadd889ff15fb5bc1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 20 May 2025 15:23:06 +0100 Subject: [PATCH 2/4] Rust: Make the new test cases work. --- .../CWE-312/CleartextLogging.expected | 830 +++++++++--------- .../query-tests/security/CWE-312/options.yml | 1 + .../security/CWE-312/test_logging.rs | 12 +- 3 files changed, 422 insertions(+), 421 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 61218e9c9085..b81d85d90274 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -1,220 +1,220 @@ #select -| test_logging.rs:42:5:42:36 | ...::log | test_logging.rs:42:28:42:35 | password | test_logging.rs:42:5:42:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:42:28:42:35 | password | password | | test_logging.rs:43:5:43:36 | ...::log | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:5:43:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:43:28:43:35 | password | password | -| test_logging.rs:44:5:44:35 | ...::log | test_logging.rs:44:27:44:34 | password | test_logging.rs:44:5:44:35 | ...::log | This operation writes $@ to a log file. | test_logging.rs:44:27:44:34 | password | password | -| test_logging.rs:45:5:45:36 | ...::log | test_logging.rs:45:28:45:35 | password | test_logging.rs:45:5:45:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:45:28:45:35 | password | password | -| test_logging.rs:46:5:46:35 | ...::log | test_logging.rs:46:27:46:34 | password | test_logging.rs:46:5:46:35 | ...::log | This operation writes $@ to a log file. | test_logging.rs:46:27:46:34 | password | password | -| test_logging.rs:47:5:47:48 | ...::log | test_logging.rs:47:40:47:47 | password | test_logging.rs:47:5:47:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:47:40:47:47 | password | password | -| test_logging.rs:52:5:52:36 | ...::log | test_logging.rs:52:28:52:35 | password | test_logging.rs:52:5:52:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:52:28:52:35 | password | password | -| test_logging.rs:54:5:54:49 | ...::log | test_logging.rs:54:41:54:48 | password | test_logging.rs:54:5:54:49 | ...::log | This operation writes $@ to a log file. | test_logging.rs:54:41:54:48 | password | password | -| test_logging.rs:56:5:56:47 | ...::log | test_logging.rs:56:39:56:46 | password | test_logging.rs:56:5:56:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:56:39:56:46 | password | password | -| test_logging.rs:57:5:57:34 | ...::log | test_logging.rs:57:24:57:31 | password | test_logging.rs:57:5:57:34 | ...::log | This operation writes $@ to a log file. | test_logging.rs:57:24:57:31 | password | password | -| test_logging.rs:58:5:58:36 | ...::log | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:5:58:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:58:24:58:31 | password | password | -| test_logging.rs:60:5:60:54 | ...::log | test_logging.rs:60:46:60:53 | password | test_logging.rs:60:5:60:54 | ...::log | This operation writes $@ to a log file. | test_logging.rs:60:46:60:53 | password | password | -| test_logging.rs:61:5:61:55 | ...::log | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:5:61:55 | ...::log | This operation writes $@ to a log file. | test_logging.rs:61:21:61:28 | password | password | -| test_logging.rs:65:5:65:48 | ...::log | test_logging.rs:65:40:65:47 | password | test_logging.rs:65:5:65:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:65:40:65:47 | password | password | -| test_logging.rs:67:5:67:66 | ...::log | test_logging.rs:67:58:67:65 | password | test_logging.rs:67:5:67:66 | ...::log | This operation writes $@ to a log file. | test_logging.rs:67:58:67:65 | password | password | -| test_logging.rs:68:5:68:67 | ...::log | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:5:68:67 | ...::log | This operation writes $@ to a log file. | test_logging.rs:68:19:68:26 | password | password | -| test_logging.rs:72:5:72:47 | ...::log | test_logging.rs:72:39:72:46 | password | test_logging.rs:72:5:72:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:72:39:72:46 | password | password | -| test_logging.rs:74:5:74:65 | ...::log | test_logging.rs:74:57:74:64 | password | test_logging.rs:74:5:74:65 | ...::log | This operation writes $@ to a log file. | test_logging.rs:74:57:74:64 | password | password | -| test_logging.rs:75:5:75:51 | ...::log | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:5:75:51 | ...::log | This operation writes $@ to a log file. | test_logging.rs:75:21:75:28 | password | password | -| test_logging.rs:76:5:76:47 | ...::log | test_logging.rs:76:39:76:46 | password | test_logging.rs:76:5:76:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:76:39:76:46 | password | password | -| test_logging.rs:82:5:82:44 | ...::log | test_logging.rs:82:36:82:43 | password | test_logging.rs:82:5:82:44 | ...::log | This operation writes $@ to a log file. | test_logging.rs:82:36:82:43 | password | password | -| test_logging.rs:84:5:84:62 | ...::log | test_logging.rs:84:54:84:61 | password | test_logging.rs:84:5:84:62 | ...::log | This operation writes $@ to a log file. | test_logging.rs:84:54:84:61 | password | password | -| test_logging.rs:85:5:85:48 | ...::log | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:5:85:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:85:21:85:28 | password | password | -| test_logging.rs:86:5:86:44 | ...::log | test_logging.rs:86:36:86:43 | password | test_logging.rs:86:5:86:44 | ...::log | This operation writes $@ to a log file. | test_logging.rs:86:36:86:43 | password | password | -| test_logging.rs:94:5:94:29 | ...::log | test_logging.rs:93:15:93:22 | password | test_logging.rs:94:5:94:29 | ...::log | This operation writes $@ to a log file. | test_logging.rs:93:15:93:22 | password | password | -| test_logging.rs:97:5:97:19 | ...::log | test_logging.rs:96:42:96:49 | password | test_logging.rs:97:5:97:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:96:42:96:49 | password | password | -| test_logging.rs:100:5:100:19 | ...::log | test_logging.rs:99:38:99:45 | password | test_logging.rs:100:5:100:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:99:38:99:45 | password | password | -| test_logging.rs:118:5:118:42 | ...::log | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:5:118:42 | ...::log | This operation writes $@ to a log file. | test_logging.rs:118:28:118:41 | get_password(...) | get_password(...) | -| test_logging.rs:131:5:131:32 | ...::log | test_logging.rs:129:25:129:32 | password | test_logging.rs:131:5:131:32 | ...::log | This operation writes $@ to a log file. | test_logging.rs:129:25:129:32 | password | password | -| test_logging.rs:152:5:152:38 | ...::_print | test_logging.rs:152:30:152:37 | password | test_logging.rs:152:5:152:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:152:30:152:37 | password | password | -| test_logging.rs:153:5:153:38 | ...::_print | test_logging.rs:153:30:153:37 | password | test_logging.rs:153:5:153:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:153:30:153:37 | password | password | -| test_logging.rs:154:5:154:39 | ...::_eprint | test_logging.rs:154:31:154:38 | password | test_logging.rs:154:5:154:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:154:31:154:38 | password | password | -| test_logging.rs:155:5:155:39 | ...::_eprint | test_logging.rs:155:31:155:38 | password | test_logging.rs:155:5:155:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:155:31:155:38 | password | password | -| test_logging.rs:158:16:158:47 | ...::panic_fmt | test_logging.rs:158:39:158:46 | password | test_logging.rs:158:16:158:47 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:158:39:158:46 | password | password | -| test_logging.rs:159:16:159:46 | ...::panic_fmt | test_logging.rs:159:38:159:45 | password | test_logging.rs:159:16:159:46 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:159:38:159:45 | password | password | -| test_logging.rs:160:16:160:55 | ...::panic_fmt | test_logging.rs:160:47:160:54 | password | test_logging.rs:160:16:160:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:160:47:160:54 | password | password | -| test_logging.rs:161:16:161:53 | ...::panic_fmt | test_logging.rs:161:45:161:52 | password | test_logging.rs:161:16:161:53 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:161:45:161:52 | password | password | -| test_logging.rs:162:16:162:55 | ...::panic_fmt | test_logging.rs:162:47:162:54 | password | test_logging.rs:162:16:162:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:162:47:162:54 | password | password | -| test_logging.rs:163:16:163:57 | ...::assert_failed | test_logging.rs:163:49:163:56 | password | test_logging.rs:163:16:163:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:163:49:163:56 | password | password | -| test_logging.rs:164:16:164:57 | ...::assert_failed | test_logging.rs:164:49:164:56 | password | test_logging.rs:164:16:164:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:164:49:164:56 | password | password | -| test_logging.rs:165:16:165:61 | ...::panic_fmt | test_logging.rs:165:53:165:60 | password | test_logging.rs:165:16:165:61 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:165:53:165:60 | password | password | -| test_logging.rs:166:16:166:63 | ...::assert_failed | test_logging.rs:166:55:166:62 | password | test_logging.rs:166:16:166:63 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:166:55:166:62 | password | password | -| test_logging.rs:167:17:167:64 | ...::assert_failed | test_logging.rs:167:56:167:63 | password | test_logging.rs:167:17:167:64 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:167:56:167:63 | password | password | -| test_logging.rs:168:27:168:32 | expect | test_logging.rs:168:58:168:65 | password | test_logging.rs:168:27:168:32 | expect | This operation writes $@ to a log file. | test_logging.rs:168:58:168:65 | password | password | -| test_logging.rs:174:30:174:34 | write | test_logging.rs:174:62:174:69 | password | test_logging.rs:174:30:174:34 | write | This operation writes $@ to a log file. | test_logging.rs:174:62:174:69 | password | password | -| test_logging.rs:175:30:175:38 | write_all | test_logging.rs:175:66:175:73 | password | test_logging.rs:175:30:175:38 | write_all | This operation writes $@ to a log file. | test_logging.rs:175:66:175:73 | password | password | -| test_logging.rs:178:9:178:13 | write | test_logging.rs:178:41:178:48 | password | test_logging.rs:178:9:178:13 | write | This operation writes $@ to a log file. | test_logging.rs:178:41:178:48 | password | password | -| test_logging.rs:181:9:181:13 | write | test_logging.rs:181:41:181:48 | password | test_logging.rs:181:9:181:13 | write | This operation writes $@ to a log file. | test_logging.rs:181:41:181:48 | password | password | +| test_logging.rs:44:5:44:36 | ...::log | test_logging.rs:44:28:44:35 | password | test_logging.rs:44:5:44:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:44:28:44:35 | password | password | +| test_logging.rs:45:5:45:35 | ...::log | test_logging.rs:45:27:45:34 | password | test_logging.rs:45:5:45:35 | ...::log | This operation writes $@ to a log file. | test_logging.rs:45:27:45:34 | password | password | +| test_logging.rs:46:5:46:36 | ...::log | test_logging.rs:46:28:46:35 | password | test_logging.rs:46:5:46:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:46:28:46:35 | password | password | +| test_logging.rs:47:5:47:35 | ...::log | test_logging.rs:47:27:47:34 | password | test_logging.rs:47:5:47:35 | ...::log | This operation writes $@ to a log file. | test_logging.rs:47:27:47:34 | password | password | +| test_logging.rs:48:5:48:48 | ...::log | test_logging.rs:48:40:48:47 | password | test_logging.rs:48:5:48:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:48:40:48:47 | password | password | +| test_logging.rs:53:5:53:36 | ...::log | test_logging.rs:53:28:53:35 | password | test_logging.rs:53:5:53:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:53:28:53:35 | password | password | +| test_logging.rs:55:5:55:49 | ...::log | test_logging.rs:55:41:55:48 | password | test_logging.rs:55:5:55:49 | ...::log | This operation writes $@ to a log file. | test_logging.rs:55:41:55:48 | password | password | +| test_logging.rs:57:5:57:47 | ...::log | test_logging.rs:57:39:57:46 | password | test_logging.rs:57:5:57:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:57:39:57:46 | password | password | +| test_logging.rs:58:5:58:34 | ...::log | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:5:58:34 | ...::log | This operation writes $@ to a log file. | test_logging.rs:58:24:58:31 | password | password | +| test_logging.rs:59:5:59:36 | ...::log | test_logging.rs:59:24:59:31 | password | test_logging.rs:59:5:59:36 | ...::log | This operation writes $@ to a log file. | test_logging.rs:59:24:59:31 | password | password | +| test_logging.rs:61:5:61:54 | ...::log | test_logging.rs:61:46:61:53 | password | test_logging.rs:61:5:61:54 | ...::log | This operation writes $@ to a log file. | test_logging.rs:61:46:61:53 | password | password | +| test_logging.rs:62:5:62:55 | ...::log | test_logging.rs:62:21:62:28 | password | test_logging.rs:62:5:62:55 | ...::log | This operation writes $@ to a log file. | test_logging.rs:62:21:62:28 | password | password | +| test_logging.rs:66:5:66:48 | ...::log | test_logging.rs:66:40:66:47 | password | test_logging.rs:66:5:66:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:66:40:66:47 | password | password | +| test_logging.rs:68:5:68:66 | ...::log | test_logging.rs:68:58:68:65 | password | test_logging.rs:68:5:68:66 | ...::log | This operation writes $@ to a log file. | test_logging.rs:68:58:68:65 | password | password | +| test_logging.rs:69:5:69:67 | ...::log | test_logging.rs:69:19:69:26 | password | test_logging.rs:69:5:69:67 | ...::log | This operation writes $@ to a log file. | test_logging.rs:69:19:69:26 | password | password | +| test_logging.rs:73:5:73:47 | ...::log | test_logging.rs:73:39:73:46 | password | test_logging.rs:73:5:73:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:73:39:73:46 | password | password | +| test_logging.rs:75:5:75:65 | ...::log | test_logging.rs:75:57:75:64 | password | test_logging.rs:75:5:75:65 | ...::log | This operation writes $@ to a log file. | test_logging.rs:75:57:75:64 | password | password | +| test_logging.rs:76:5:76:51 | ...::log | test_logging.rs:76:21:76:28 | password | test_logging.rs:76:5:76:51 | ...::log | This operation writes $@ to a log file. | test_logging.rs:76:21:76:28 | password | password | +| test_logging.rs:77:5:77:47 | ...::log | test_logging.rs:77:39:77:46 | password | test_logging.rs:77:5:77:47 | ...::log | This operation writes $@ to a log file. | test_logging.rs:77:39:77:46 | password | password | +| test_logging.rs:83:5:83:44 | ...::log | test_logging.rs:83:36:83:43 | password | test_logging.rs:83:5:83:44 | ...::log | This operation writes $@ to a log file. | test_logging.rs:83:36:83:43 | password | password | +| test_logging.rs:85:5:85:62 | ...::log | test_logging.rs:85:54:85:61 | password | test_logging.rs:85:5:85:62 | ...::log | This operation writes $@ to a log file. | test_logging.rs:85:54:85:61 | password | password | +| test_logging.rs:86:5:86:48 | ...::log | test_logging.rs:86:21:86:28 | password | test_logging.rs:86:5:86:48 | ...::log | This operation writes $@ to a log file. | test_logging.rs:86:21:86:28 | password | password | +| test_logging.rs:87:5:87:44 | ...::log | test_logging.rs:87:36:87:43 | password | test_logging.rs:87:5:87:44 | ...::log | This operation writes $@ to a log file. | test_logging.rs:87:36:87:43 | password | password | +| test_logging.rs:95:5:95:29 | ...::log | test_logging.rs:94:15:94:22 | password | test_logging.rs:95:5:95:29 | ...::log | This operation writes $@ to a log file. | test_logging.rs:94:15:94:22 | password | password | +| test_logging.rs:98:5:98:19 | ...::log | test_logging.rs:97:42:97:49 | password | test_logging.rs:98:5:98:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:97:42:97:49 | password | password | +| test_logging.rs:101:5:101:19 | ...::log | test_logging.rs:100:38:100:45 | password | test_logging.rs:101:5:101:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:100:38:100:45 | password | password | +| test_logging.rs:119:5:119:42 | ...::log | test_logging.rs:119:28:119:41 | get_password(...) | test_logging.rs:119:5:119:42 | ...::log | This operation writes $@ to a log file. | test_logging.rs:119:28:119:41 | get_password(...) | get_password(...) | +| test_logging.rs:132:5:132:32 | ...::log | test_logging.rs:130:25:130:32 | password | test_logging.rs:132:5:132:32 | ...::log | This operation writes $@ to a log file. | test_logging.rs:130:25:130:32 | password | password | +| test_logging.rs:179:5:179:38 | ...::_print | test_logging.rs:179:30:179:37 | password | test_logging.rs:179:5:179:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:179:30:179:37 | password | password | +| test_logging.rs:180:5:180:38 | ...::_print | test_logging.rs:180:30:180:37 | password | test_logging.rs:180:5:180:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:180:30:180:37 | password | password | +| test_logging.rs:181:5:181:39 | ...::_eprint | test_logging.rs:181:31:181:38 | password | test_logging.rs:181:5:181:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:181:31:181:38 | password | password | +| test_logging.rs:182:5:182:39 | ...::_eprint | test_logging.rs:182:31:182:38 | password | test_logging.rs:182:5:182:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:182:31:182:38 | password | password | +| test_logging.rs:185:16:185:47 | ...::panic_fmt | test_logging.rs:185:39:185:46 | password | test_logging.rs:185:16:185:47 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:185:39:185:46 | password | password | +| test_logging.rs:186:16:186:46 | ...::panic_fmt | test_logging.rs:186:38:186:45 | password | test_logging.rs:186:16:186:46 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:186:38:186:45 | password | password | +| test_logging.rs:187:16:187:55 | ...::panic_fmt | test_logging.rs:187:47:187:54 | password | test_logging.rs:187:16:187:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:187:47:187:54 | password | password | +| test_logging.rs:188:16:188:53 | ...::panic_fmt | test_logging.rs:188:45:188:52 | password | test_logging.rs:188:16:188:53 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:188:45:188:52 | password | password | +| test_logging.rs:189:16:189:55 | ...::panic_fmt | test_logging.rs:189:47:189:54 | password | test_logging.rs:189:16:189:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:189:47:189:54 | password | password | +| test_logging.rs:190:16:190:57 | ...::assert_failed | test_logging.rs:190:49:190:56 | password | test_logging.rs:190:16:190:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:190:49:190:56 | password | password | +| test_logging.rs:191:16:191:57 | ...::assert_failed | test_logging.rs:191:49:191:56 | password | test_logging.rs:191:16:191:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:191:49:191:56 | password | password | +| test_logging.rs:192:16:192:61 | ...::panic_fmt | test_logging.rs:192:53:192:60 | password | test_logging.rs:192:16:192:61 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:192:53:192:60 | password | password | +| test_logging.rs:193:16:193:63 | ...::assert_failed | test_logging.rs:193:55:193:62 | password | test_logging.rs:193:16:193:63 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:193:55:193:62 | password | password | +| test_logging.rs:194:17:194:64 | ...::assert_failed | test_logging.rs:194:56:194:63 | password | test_logging.rs:194:17:194:64 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:194:56:194:63 | password | password | +| test_logging.rs:195:27:195:32 | expect | test_logging.rs:195:58:195:65 | password | test_logging.rs:195:27:195:32 | expect | This operation writes $@ to a log file. | test_logging.rs:195:58:195:65 | password | password | +| test_logging.rs:201:30:201:34 | write | test_logging.rs:201:62:201:69 | password | test_logging.rs:201:30:201:34 | write | This operation writes $@ to a log file. | test_logging.rs:201:62:201:69 | password | password | +| test_logging.rs:202:30:202:38 | write_all | test_logging.rs:202:66:202:73 | password | test_logging.rs:202:30:202:38 | write_all | This operation writes $@ to a log file. | test_logging.rs:202:66:202:73 | password | password | +| test_logging.rs:205:9:205:13 | write | test_logging.rs:205:41:205:48 | password | test_logging.rs:205:9:205:13 | write | This operation writes $@ to a log file. | test_logging.rs:205:41:205:48 | password | password | +| test_logging.rs:208:9:208:13 | write | test_logging.rs:208:41:208:48 | password | test_logging.rs:208:9:208:13 | write | This operation writes $@ to a log file. | test_logging.rs:208:41:208:48 | password | password | edges -| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | provenance | | | test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | -| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | provenance | | -| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | provenance | | -| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | provenance | | -| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | provenance | | -| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | provenance | | -| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:49 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | provenance | | -| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | provenance | | -| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:34 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | provenance | | -| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | provenance | | -| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:54 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | provenance | | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:61:20:61:28 | &password | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | provenance | | -| test_logging.rs:61:20:61:28 | &password [&ref] | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | provenance | | -| test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | provenance | | -| test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | provenance | | -| test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password | provenance | Config | -| test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password [&ref] | provenance | | -| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | provenance | | -| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:66 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | provenance | | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:68:18:68:26 | &password | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | provenance | | -| test_logging.rs:68:18:68:26 | &password [&ref] | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | provenance | | -| test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | provenance | | -| test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | provenance | | -| test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password | provenance | Config | -| test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password [&ref] | provenance | | -| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | provenance | | -| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:65 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | provenance | | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:75:20:75:28 | &password | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | provenance | | -| test_logging.rs:75:20:75:28 | &password [&ref] | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | provenance | | -| test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | provenance | | -| test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | provenance | | -| test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password | provenance | Config | -| test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password [&ref] | provenance | | -| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | provenance | | -| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | provenance | | -| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:62 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | provenance | | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:85:20:85:28 | &password | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | provenance | | -| test_logging.rs:85:20:85:28 | &password [&ref] | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | provenance | | -| test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | provenance | | -| test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | provenance | | -| test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password | provenance | Config | -| test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password [&ref] | provenance | | -| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | provenance | | -| test_logging.rs:93:9:93:10 | m1 | test_logging.rs:94:11:94:28 | MacroExpr | provenance | | -| test_logging.rs:93:14:93:22 | &password | test_logging.rs:93:9:93:10 | m1 | provenance | | -| test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | -| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:29 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | | -| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:9:96:10 | m2 | provenance | | -| test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | -| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | | -| test_logging.rs:99:14:99:46 | res | test_logging.rs:99:22:99:45 | { ... } | provenance | | -| test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:14:99:46 | res | provenance | | -| test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | -| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:42 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | | -| test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | -| test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | test_logging.rs:129:9:129:10 | t1 [tuple.1] | provenance | | -| test_logging.rs:129:25:129:32 | password | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | provenance | | -| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:32 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:131:28:131:29 | t1 [tuple.1] | test_logging.rs:131:28:131:31 | t1.1 | provenance | | -| test_logging.rs:131:28:131:31 | t1.1 | test_logging.rs:131:12:131:31 | MacroExpr | provenance | | -| test_logging.rs:152:12:152:37 | MacroExpr | test_logging.rs:152:5:152:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | -| test_logging.rs:152:30:152:37 | password | test_logging.rs:152:12:152:37 | MacroExpr | provenance | | -| test_logging.rs:153:14:153:37 | MacroExpr | test_logging.rs:153:5:153:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | -| test_logging.rs:153:30:153:37 | password | test_logging.rs:153:14:153:37 | MacroExpr | provenance | | -| test_logging.rs:154:13:154:38 | MacroExpr | test_logging.rs:154:5:154:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | -| test_logging.rs:154:31:154:38 | password | test_logging.rs:154:13:154:38 | MacroExpr | provenance | | -| test_logging.rs:155:15:155:38 | MacroExpr | test_logging.rs:155:5:155:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | -| test_logging.rs:155:31:155:38 | password | test_logging.rs:155:15:155:38 | MacroExpr | provenance | | -| test_logging.rs:158:23:158:46 | MacroExpr | test_logging.rs:158:16:158:47 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:158:39:158:46 | password | test_logging.rs:158:23:158:46 | MacroExpr | provenance | | -| test_logging.rs:159:22:159:45 | MacroExpr | test_logging.rs:159:16:159:46 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:159:38:159:45 | password | test_logging.rs:159:22:159:45 | MacroExpr | provenance | | -| test_logging.rs:160:31:160:54 | MacroExpr | test_logging.rs:160:16:160:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:160:47:160:54 | password | test_logging.rs:160:31:160:54 | MacroExpr | provenance | | -| test_logging.rs:161:29:161:52 | MacroExpr | test_logging.rs:161:16:161:53 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:161:45:161:52 | password | test_logging.rs:161:29:161:52 | MacroExpr | provenance | | -| test_logging.rs:162:31:162:54 | MacroExpr | test_logging.rs:162:16:162:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:162:47:162:54 | password | test_logging.rs:162:31:162:54 | MacroExpr | provenance | | -| test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | test_logging.rs:163:16:163:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:163:33:163:56 | MacroExpr | test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:163:49:163:56 | password | test_logging.rs:163:33:163:56 | MacroExpr | provenance | | -| test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | test_logging.rs:164:16:164:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:164:33:164:56 | MacroExpr | test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:164:49:164:56 | password | test_logging.rs:164:33:164:56 | MacroExpr | provenance | | -| test_logging.rs:165:37:165:60 | MacroExpr | test_logging.rs:165:16:165:61 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:165:53:165:60 | password | test_logging.rs:165:37:165:60 | MacroExpr | provenance | | -| test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | test_logging.rs:166:16:166:63 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:166:39:166:62 | MacroExpr | test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:166:55:166:62 | password | test_logging.rs:166:39:166:62 | MacroExpr | provenance | | -| test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | test_logging.rs:167:17:167:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:167:40:167:63 | MacroExpr | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:167:56:167:63 | password | test_logging.rs:167:40:167:63 | MacroExpr | provenance | | -| test_logging.rs:168:34:168:66 | res | test_logging.rs:168:42:168:65 | { ... } | provenance | | -| test_logging.rs:168:34:168:75 | ... .as_str() | test_logging.rs:168:27:168:32 | expect | provenance | MaD:1 Sink:MaD:1 | -| test_logging.rs:168:42:168:65 | ...::format(...) | test_logging.rs:168:34:168:66 | res | provenance | | -| test_logging.rs:168:42:168:65 | ...::must_use(...) | test_logging.rs:168:34:168:75 | ... .as_str() | provenance | MaD:12 | -| test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:168:58:168:65 | password | test_logging.rs:168:42:168:65 | MacroExpr | provenance | | -| test_logging.rs:174:36:174:70 | res | test_logging.rs:174:44:174:69 | { ... } | provenance | | -| test_logging.rs:174:36:174:81 | ... .as_bytes() | test_logging.rs:174:30:174:34 | write | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:174:44:174:69 | ...::format(...) | test_logging.rs:174:36:174:70 | res | provenance | | -| test_logging.rs:174:44:174:69 | ...::must_use(...) | test_logging.rs:174:36:174:81 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:174:62:174:69 | password | test_logging.rs:174:44:174:69 | MacroExpr | provenance | | -| test_logging.rs:175:40:175:74 | res | test_logging.rs:175:48:175:73 | { ... } | provenance | | -| test_logging.rs:175:40:175:85 | ... .as_bytes() | test_logging.rs:175:30:175:38 | write_all | provenance | MaD:6 Sink:MaD:6 | -| test_logging.rs:175:48:175:73 | ...::format(...) | test_logging.rs:175:40:175:74 | res | provenance | | -| test_logging.rs:175:48:175:73 | ...::must_use(...) | test_logging.rs:175:40:175:85 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:175:66:175:73 | password | test_logging.rs:175:48:175:73 | MacroExpr | provenance | | -| test_logging.rs:178:15:178:49 | res | test_logging.rs:178:23:178:48 | { ... } | provenance | | -| test_logging.rs:178:15:178:60 | ... .as_bytes() | test_logging.rs:178:9:178:13 | write | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:178:23:178:48 | ...::format(...) | test_logging.rs:178:15:178:49 | res | provenance | | -| test_logging.rs:178:23:178:48 | ...::must_use(...) | test_logging.rs:178:15:178:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:178:41:178:48 | password | test_logging.rs:178:23:178:48 | MacroExpr | provenance | | -| test_logging.rs:181:15:181:49 | res | test_logging.rs:181:23:181:48 | { ... } | provenance | | -| test_logging.rs:181:15:181:60 | ... .as_bytes() | test_logging.rs:181:9:181:13 | write | provenance | MaD:4 Sink:MaD:4 | -| test_logging.rs:181:23:181:48 | ...::format(...) | test_logging.rs:181:15:181:49 | res | provenance | | -| test_logging.rs:181:23:181:48 | ...::must_use(...) | test_logging.rs:181:15:181:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:181:41:181:48 | password | test_logging.rs:181:23:181:48 | MacroExpr | provenance | | +| test_logging.rs:44:12:44:35 | MacroExpr | test_logging.rs:44:5:44:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:44:28:44:35 | password | test_logging.rs:44:12:44:35 | MacroExpr | provenance | | +| test_logging.rs:45:11:45:34 | MacroExpr | test_logging.rs:45:5:45:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:45:27:45:34 | password | test_logging.rs:45:11:45:34 | MacroExpr | provenance | | +| test_logging.rs:46:12:46:35 | MacroExpr | test_logging.rs:46:5:46:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:46:28:46:35 | password | test_logging.rs:46:12:46:35 | MacroExpr | provenance | | +| test_logging.rs:47:11:47:34 | MacroExpr | test_logging.rs:47:5:47:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:47:27:47:34 | password | test_logging.rs:47:11:47:34 | MacroExpr | provenance | | +| test_logging.rs:48:24:48:47 | MacroExpr | test_logging.rs:48:5:48:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:48:40:48:47 | password | test_logging.rs:48:24:48:47 | MacroExpr | provenance | | +| test_logging.rs:53:12:53:35 | MacroExpr | test_logging.rs:53:5:53:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:53:28:53:35 | password | test_logging.rs:53:12:53:35 | MacroExpr | provenance | | +| test_logging.rs:55:12:55:48 | MacroExpr | test_logging.rs:55:5:55:49 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:55:41:55:48 | password | test_logging.rs:55:12:55:48 | MacroExpr | provenance | | +| test_logging.rs:57:12:57:46 | MacroExpr | test_logging.rs:57:5:57:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:57:39:57:46 | password | test_logging.rs:57:12:57:46 | MacroExpr | provenance | | +| test_logging.rs:58:12:58:33 | MacroExpr | test_logging.rs:58:5:58:34 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:33 | MacroExpr | provenance | | +| test_logging.rs:59:12:59:35 | MacroExpr | test_logging.rs:59:5:59:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:59:24:59:31 | password | test_logging.rs:59:12:59:35 | MacroExpr | provenance | | +| test_logging.rs:61:30:61:53 | MacroExpr | test_logging.rs:61:5:61:54 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:61:46:61:53 | password | test_logging.rs:61:30:61:53 | MacroExpr | provenance | | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:62:20:62:28 | &password | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0] | provenance | | +| test_logging.rs:62:20:62:28 | &password [&ref] | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0, &ref] | provenance | | +| test_logging.rs:62:20:62:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | provenance | | +| test_logging.rs:62:20:62:28 | TupleExpr [tuple.0] | test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | provenance | | +| test_logging.rs:62:21:62:28 | password | test_logging.rs:62:20:62:28 | &password | provenance | Config | +| test_logging.rs:62:21:62:28 | password | test_logging.rs:62:20:62:28 | &password [&ref] | provenance | | +| test_logging.rs:66:24:66:47 | MacroExpr | test_logging.rs:66:5:66:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:66:40:66:47 | password | test_logging.rs:66:24:66:47 | MacroExpr | provenance | | +| test_logging.rs:68:42:68:65 | MacroExpr | test_logging.rs:68:5:68:66 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:68:58:68:65 | password | test_logging.rs:68:42:68:65 | MacroExpr | provenance | | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:69:18:69:26 | &password | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0] | provenance | | +| test_logging.rs:69:18:69:26 | &password [&ref] | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0, &ref] | provenance | | +| test_logging.rs:69:18:69:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | provenance | | +| test_logging.rs:69:18:69:26 | TupleExpr [tuple.0] | test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | provenance | | +| test_logging.rs:69:19:69:26 | password | test_logging.rs:69:18:69:26 | &password | provenance | Config | +| test_logging.rs:69:19:69:26 | password | test_logging.rs:69:18:69:26 | &password [&ref] | provenance | | +| test_logging.rs:73:23:73:46 | MacroExpr | test_logging.rs:73:5:73:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:73:39:73:46 | password | test_logging.rs:73:23:73:46 | MacroExpr | provenance | | +| test_logging.rs:75:41:75:64 | MacroExpr | test_logging.rs:75:5:75:65 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:75:57:75:64 | password | test_logging.rs:75:41:75:64 | MacroExpr | provenance | | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:76:20:76:28 | &password | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0] | provenance | | +| test_logging.rs:76:20:76:28 | &password [&ref] | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0, &ref] | provenance | | +| test_logging.rs:76:20:76:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | provenance | | +| test_logging.rs:76:20:76:28 | TupleExpr [tuple.0] | test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | provenance | | +| test_logging.rs:76:21:76:28 | password | test_logging.rs:76:20:76:28 | &password | provenance | Config | +| test_logging.rs:76:21:76:28 | password | test_logging.rs:76:20:76:28 | &password [&ref] | provenance | | +| test_logging.rs:77:23:77:46 | MacroExpr | test_logging.rs:77:5:77:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:77:39:77:46 | password | test_logging.rs:77:23:77:46 | MacroExpr | provenance | | +| test_logging.rs:83:20:83:43 | MacroExpr | test_logging.rs:83:5:83:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:83:36:83:43 | password | test_logging.rs:83:20:83:43 | MacroExpr | provenance | | +| test_logging.rs:85:38:85:61 | MacroExpr | test_logging.rs:85:5:85:62 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:85:54:85:61 | password | test_logging.rs:85:38:85:61 | MacroExpr | provenance | | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:86:20:86:28 | &password | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0] | provenance | | +| test_logging.rs:86:20:86:28 | &password [&ref] | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0, &ref] | provenance | | +| test_logging.rs:86:20:86:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | provenance | | +| test_logging.rs:86:20:86:28 | TupleExpr [tuple.0] | test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | provenance | | +| test_logging.rs:86:21:86:28 | password | test_logging.rs:86:20:86:28 | &password | provenance | Config | +| test_logging.rs:86:21:86:28 | password | test_logging.rs:86:20:86:28 | &password [&ref] | provenance | | +| test_logging.rs:87:20:87:43 | MacroExpr | test_logging.rs:87:5:87:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:87:36:87:43 | password | test_logging.rs:87:20:87:43 | MacroExpr | provenance | | +| test_logging.rs:94:9:94:10 | m1 | test_logging.rs:95:11:95:28 | MacroExpr | provenance | | +| test_logging.rs:94:14:94:22 | &password | test_logging.rs:94:9:94:10 | m1 | provenance | | +| test_logging.rs:94:15:94:22 | password | test_logging.rs:94:14:94:22 | &password | provenance | Config | +| test_logging.rs:95:11:95:28 | MacroExpr | test_logging.rs:95:5:95:29 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:97:9:97:10 | m2 | test_logging.rs:98:11:98:18 | MacroExpr | provenance | | +| test_logging.rs:97:41:97:49 | &password | test_logging.rs:97:9:97:10 | m2 | provenance | | +| test_logging.rs:97:42:97:49 | password | test_logging.rs:97:41:97:49 | &password | provenance | Config | +| test_logging.rs:98:11:98:18 | MacroExpr | test_logging.rs:98:5:98:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:100:9:100:10 | m3 | test_logging.rs:101:11:101:18 | MacroExpr | provenance | | +| test_logging.rs:100:14:100:46 | res | test_logging.rs:100:22:100:45 | { ... } | provenance | | +| test_logging.rs:100:22:100:45 | ...::format(...) | test_logging.rs:100:14:100:46 | res | provenance | | +| test_logging.rs:100:22:100:45 | ...::must_use(...) | test_logging.rs:100:9:100:10 | m3 | provenance | | +| test_logging.rs:100:22:100:45 | MacroExpr | test_logging.rs:100:22:100:45 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:100:22:100:45 | { ... } | test_logging.rs:100:22:100:45 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:100:38:100:45 | password | test_logging.rs:100:22:100:45 | MacroExpr | provenance | | +| test_logging.rs:101:11:101:18 | MacroExpr | test_logging.rs:101:5:101:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:119:12:119:41 | MacroExpr | test_logging.rs:119:5:119:42 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:119:28:119:41 | get_password(...) | test_logging.rs:119:12:119:41 | MacroExpr | provenance | | +| test_logging.rs:130:9:130:10 | t1 [tuple.1] | test_logging.rs:132:28:132:29 | t1 [tuple.1] | provenance | | +| test_logging.rs:130:14:130:33 | TupleExpr [tuple.1] | test_logging.rs:130:9:130:10 | t1 [tuple.1] | provenance | | +| test_logging.rs:130:25:130:32 | password | test_logging.rs:130:14:130:33 | TupleExpr [tuple.1] | provenance | | +| test_logging.rs:132:12:132:31 | MacroExpr | test_logging.rs:132:5:132:32 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:132:28:132:29 | t1 [tuple.1] | test_logging.rs:132:28:132:31 | t1.1 | provenance | | +| test_logging.rs:132:28:132:31 | t1.1 | test_logging.rs:132:12:132:31 | MacroExpr | provenance | | +| test_logging.rs:179:12:179:37 | MacroExpr | test_logging.rs:179:5:179:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | +| test_logging.rs:179:30:179:37 | password | test_logging.rs:179:12:179:37 | MacroExpr | provenance | | +| test_logging.rs:180:14:180:37 | MacroExpr | test_logging.rs:180:5:180:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | +| test_logging.rs:180:30:180:37 | password | test_logging.rs:180:14:180:37 | MacroExpr | provenance | | +| test_logging.rs:181:13:181:38 | MacroExpr | test_logging.rs:181:5:181:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:181:31:181:38 | password | test_logging.rs:181:13:181:38 | MacroExpr | provenance | | +| test_logging.rs:182:15:182:38 | MacroExpr | test_logging.rs:182:5:182:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:182:31:182:38 | password | test_logging.rs:182:15:182:38 | MacroExpr | provenance | | +| test_logging.rs:185:23:185:46 | MacroExpr | test_logging.rs:185:16:185:47 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:185:39:185:46 | password | test_logging.rs:185:23:185:46 | MacroExpr | provenance | | +| test_logging.rs:186:22:186:45 | MacroExpr | test_logging.rs:186:16:186:46 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:186:38:186:45 | password | test_logging.rs:186:22:186:45 | MacroExpr | provenance | | +| test_logging.rs:187:31:187:54 | MacroExpr | test_logging.rs:187:16:187:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:187:47:187:54 | password | test_logging.rs:187:31:187:54 | MacroExpr | provenance | | +| test_logging.rs:188:29:188:52 | MacroExpr | test_logging.rs:188:16:188:53 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:188:45:188:52 | password | test_logging.rs:188:29:188:52 | MacroExpr | provenance | | +| test_logging.rs:189:31:189:54 | MacroExpr | test_logging.rs:189:16:189:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:189:47:189:54 | password | test_logging.rs:189:31:189:54 | MacroExpr | provenance | | +| test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | test_logging.rs:190:16:190:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:190:33:190:56 | MacroExpr | test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:190:49:190:56 | password | test_logging.rs:190:33:190:56 | MacroExpr | provenance | | +| test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | test_logging.rs:191:16:191:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:191:33:191:56 | MacroExpr | test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:191:49:191:56 | password | test_logging.rs:191:33:191:56 | MacroExpr | provenance | | +| test_logging.rs:192:37:192:60 | MacroExpr | test_logging.rs:192:16:192:61 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:192:53:192:60 | password | test_logging.rs:192:37:192:60 | MacroExpr | provenance | | +| test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | test_logging.rs:193:16:193:63 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:193:39:193:62 | MacroExpr | test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:193:55:193:62 | password | test_logging.rs:193:39:193:62 | MacroExpr | provenance | | +| test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | test_logging.rs:194:17:194:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:194:40:194:63 | MacroExpr | test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:194:56:194:63 | password | test_logging.rs:194:40:194:63 | MacroExpr | provenance | | +| test_logging.rs:195:34:195:66 | res | test_logging.rs:195:42:195:65 | { ... } | provenance | | +| test_logging.rs:195:34:195:75 | ... .as_str() | test_logging.rs:195:27:195:32 | expect | provenance | MaD:1 Sink:MaD:1 | +| test_logging.rs:195:42:195:65 | ...::format(...) | test_logging.rs:195:34:195:66 | res | provenance | | +| test_logging.rs:195:42:195:65 | ...::must_use(...) | test_logging.rs:195:34:195:75 | ... .as_str() | provenance | MaD:12 | +| test_logging.rs:195:42:195:65 | MacroExpr | test_logging.rs:195:42:195:65 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:195:42:195:65 | { ... } | test_logging.rs:195:42:195:65 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:195:58:195:65 | password | test_logging.rs:195:42:195:65 | MacroExpr | provenance | | +| test_logging.rs:201:36:201:70 | res | test_logging.rs:201:44:201:69 | { ... } | provenance | | +| test_logging.rs:201:36:201:81 | ... .as_bytes() | test_logging.rs:201:30:201:34 | write | provenance | MaD:5 Sink:MaD:5 | +| test_logging.rs:201:44:201:69 | ...::format(...) | test_logging.rs:201:36:201:70 | res | provenance | | +| test_logging.rs:201:44:201:69 | ...::must_use(...) | test_logging.rs:201:36:201:81 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:201:44:201:69 | MacroExpr | test_logging.rs:201:44:201:69 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:201:44:201:69 | { ... } | test_logging.rs:201:44:201:69 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:201:62:201:69 | password | test_logging.rs:201:44:201:69 | MacroExpr | provenance | | +| test_logging.rs:202:40:202:74 | res | test_logging.rs:202:48:202:73 | { ... } | provenance | | +| test_logging.rs:202:40:202:85 | ... .as_bytes() | test_logging.rs:202:30:202:38 | write_all | provenance | MaD:6 Sink:MaD:6 | +| test_logging.rs:202:48:202:73 | ...::format(...) | test_logging.rs:202:40:202:74 | res | provenance | | +| test_logging.rs:202:48:202:73 | ...::must_use(...) | test_logging.rs:202:40:202:85 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:202:48:202:73 | MacroExpr | test_logging.rs:202:48:202:73 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:202:48:202:73 | { ... } | test_logging.rs:202:48:202:73 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:202:66:202:73 | password | test_logging.rs:202:48:202:73 | MacroExpr | provenance | | +| test_logging.rs:205:15:205:49 | res | test_logging.rs:205:23:205:48 | { ... } | provenance | | +| test_logging.rs:205:15:205:60 | ... .as_bytes() | test_logging.rs:205:9:205:13 | write | provenance | MaD:5 Sink:MaD:5 | +| test_logging.rs:205:23:205:48 | ...::format(...) | test_logging.rs:205:15:205:49 | res | provenance | | +| test_logging.rs:205:23:205:48 | ...::must_use(...) | test_logging.rs:205:15:205:60 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:205:23:205:48 | MacroExpr | test_logging.rs:205:23:205:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:205:23:205:48 | { ... } | test_logging.rs:205:23:205:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:205:41:205:48 | password | test_logging.rs:205:23:205:48 | MacroExpr | provenance | | +| test_logging.rs:208:15:208:49 | res | test_logging.rs:208:23:208:48 | { ... } | provenance | | +| test_logging.rs:208:15:208:60 | ... .as_bytes() | test_logging.rs:208:9:208:13 | write | provenance | MaD:4 Sink:MaD:4 | +| test_logging.rs:208:23:208:48 | ...::format(...) | test_logging.rs:208:15:208:49 | res | provenance | | +| test_logging.rs:208:23:208:48 | ...::must_use(...) | test_logging.rs:208:15:208:60 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:208:23:208:48 | MacroExpr | test_logging.rs:208:23:208:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:208:23:208:48 | { ... } | test_logging.rs:208:23:208:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:208:41:208:48 | password | test_logging.rs:208:23:208:48 | MacroExpr | provenance | | models | 1 | Sink: lang:core; ::expect; log-injection; Argument[0] | | 2 | Sink: lang:core; crate::panicking::assert_failed; log-injection; Argument[3].Field[crate::option::Option::Some(0)] | @@ -231,211 +231,211 @@ models | 13 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint | | 14 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | nodes -| test_logging.rs:42:5:42:36 | ...::log | semmle.label | ...::log | -| test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:42:28:42:35 | password | semmle.label | password | | test_logging.rs:43:5:43:36 | ...::log | semmle.label | ...::log | | test_logging.rs:43:12:43:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:43:28:43:35 | password | semmle.label | password | -| test_logging.rs:44:5:44:35 | ...::log | semmle.label | ...::log | -| test_logging.rs:44:11:44:34 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:44:27:44:34 | password | semmle.label | password | -| test_logging.rs:45:5:45:36 | ...::log | semmle.label | ...::log | -| test_logging.rs:45:12:45:35 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:45:28:45:35 | password | semmle.label | password | -| test_logging.rs:46:5:46:35 | ...::log | semmle.label | ...::log | -| test_logging.rs:46:11:46:34 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:46:27:46:34 | password | semmle.label | password | -| test_logging.rs:47:5:47:48 | ...::log | semmle.label | ...::log | -| test_logging.rs:47:24:47:47 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:47:40:47:47 | password | semmle.label | password | -| test_logging.rs:52:5:52:36 | ...::log | semmle.label | ...::log | -| test_logging.rs:52:12:52:35 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:52:28:52:35 | password | semmle.label | password | -| test_logging.rs:54:5:54:49 | ...::log | semmle.label | ...::log | -| test_logging.rs:54:12:54:48 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:54:41:54:48 | password | semmle.label | password | -| test_logging.rs:56:5:56:47 | ...::log | semmle.label | ...::log | -| test_logging.rs:56:12:56:46 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:56:39:56:46 | password | semmle.label | password | -| test_logging.rs:57:5:57:34 | ...::log | semmle.label | ...::log | -| test_logging.rs:57:12:57:33 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:57:24:57:31 | password | semmle.label | password | -| test_logging.rs:58:5:58:36 | ...::log | semmle.label | ...::log | -| test_logging.rs:58:12:58:35 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:44:5:44:36 | ...::log | semmle.label | ...::log | +| test_logging.rs:44:12:44:35 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:44:28:44:35 | password | semmle.label | password | +| test_logging.rs:45:5:45:35 | ...::log | semmle.label | ...::log | +| test_logging.rs:45:11:45:34 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:45:27:45:34 | password | semmle.label | password | +| test_logging.rs:46:5:46:36 | ...::log | semmle.label | ...::log | +| test_logging.rs:46:12:46:35 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:46:28:46:35 | password | semmle.label | password | +| test_logging.rs:47:5:47:35 | ...::log | semmle.label | ...::log | +| test_logging.rs:47:11:47:34 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:47:27:47:34 | password | semmle.label | password | +| test_logging.rs:48:5:48:48 | ...::log | semmle.label | ...::log | +| test_logging.rs:48:24:48:47 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:48:40:48:47 | password | semmle.label | password | +| test_logging.rs:53:5:53:36 | ...::log | semmle.label | ...::log | +| test_logging.rs:53:12:53:35 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:53:28:53:35 | password | semmle.label | password | +| test_logging.rs:55:5:55:49 | ...::log | semmle.label | ...::log | +| test_logging.rs:55:12:55:48 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:55:41:55:48 | password | semmle.label | password | +| test_logging.rs:57:5:57:47 | ...::log | semmle.label | ...::log | +| test_logging.rs:57:12:57:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:57:39:57:46 | password | semmle.label | password | +| test_logging.rs:58:5:58:34 | ...::log | semmle.label | ...::log | +| test_logging.rs:58:12:58:33 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:58:24:58:31 | password | semmle.label | password | -| test_logging.rs:60:5:60:54 | ...::log | semmle.label | ...::log | -| test_logging.rs:60:30:60:53 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:60:46:60:53 | password | semmle.label | password | -| test_logging.rs:61:5:61:55 | ...::log | semmle.label | ...::log | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| test_logging.rs:61:20:61:28 | &password | semmle.label | &password | -| test_logging.rs:61:20:61:28 | &password [&ref] | semmle.label | &password [&ref] | -| test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | -| test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| test_logging.rs:61:21:61:28 | password | semmle.label | password | -| test_logging.rs:65:5:65:48 | ...::log | semmle.label | ...::log | -| test_logging.rs:65:24:65:47 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:65:40:65:47 | password | semmle.label | password | -| test_logging.rs:67:5:67:66 | ...::log | semmle.label | ...::log | -| test_logging.rs:67:42:67:65 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:67:58:67:65 | password | semmle.label | password | -| test_logging.rs:68:5:68:67 | ...::log | semmle.label | ...::log | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| test_logging.rs:68:18:68:26 | &password | semmle.label | &password | -| test_logging.rs:68:18:68:26 | &password [&ref] | semmle.label | &password [&ref] | -| test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | -| test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| test_logging.rs:68:19:68:26 | password | semmle.label | password | -| test_logging.rs:72:5:72:47 | ...::log | semmle.label | ...::log | -| test_logging.rs:72:23:72:46 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:72:39:72:46 | password | semmle.label | password | -| test_logging.rs:74:5:74:65 | ...::log | semmle.label | ...::log | -| test_logging.rs:74:41:74:64 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:74:57:74:64 | password | semmle.label | password | -| test_logging.rs:75:5:75:51 | ...::log | semmle.label | ...::log | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| test_logging.rs:75:20:75:28 | &password | semmle.label | &password | -| test_logging.rs:75:20:75:28 | &password [&ref] | semmle.label | &password [&ref] | -| test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | -| test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| test_logging.rs:75:21:75:28 | password | semmle.label | password | -| test_logging.rs:76:5:76:47 | ...::log | semmle.label | ...::log | -| test_logging.rs:76:23:76:46 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:76:39:76:46 | password | semmle.label | password | -| test_logging.rs:82:5:82:44 | ...::log | semmle.label | ...::log | -| test_logging.rs:82:20:82:43 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:82:36:82:43 | password | semmle.label | password | -| test_logging.rs:84:5:84:62 | ...::log | semmle.label | ...::log | -| test_logging.rs:84:38:84:61 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:84:54:84:61 | password | semmle.label | password | -| test_logging.rs:85:5:85:48 | ...::log | semmle.label | ...::log | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| test_logging.rs:85:20:85:28 | &password | semmle.label | &password | -| test_logging.rs:85:20:85:28 | &password [&ref] | semmle.label | &password [&ref] | -| test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | -| test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| test_logging.rs:85:21:85:28 | password | semmle.label | password | -| test_logging.rs:86:5:86:44 | ...::log | semmle.label | ...::log | -| test_logging.rs:86:20:86:43 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:86:36:86:43 | password | semmle.label | password | -| test_logging.rs:93:9:93:10 | m1 | semmle.label | m1 | -| test_logging.rs:93:14:93:22 | &password | semmle.label | &password | -| test_logging.rs:93:15:93:22 | password | semmle.label | password | -| test_logging.rs:94:5:94:29 | ...::log | semmle.label | ...::log | -| test_logging.rs:94:11:94:28 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:96:9:96:10 | m2 | semmle.label | m2 | -| test_logging.rs:96:41:96:49 | &password | semmle.label | &password | -| test_logging.rs:96:42:96:49 | password | semmle.label | password | -| test_logging.rs:97:5:97:19 | ...::log | semmle.label | ...::log | -| test_logging.rs:97:11:97:18 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:99:9:99:10 | m3 | semmle.label | m3 | -| test_logging.rs:99:14:99:46 | res | semmle.label | res | -| test_logging.rs:99:22:99:45 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:99:22:99:45 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:99:22:99:45 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:99:22:99:45 | { ... } | semmle.label | { ... } | -| test_logging.rs:99:38:99:45 | password | semmle.label | password | -| test_logging.rs:100:5:100:19 | ...::log | semmle.label | ...::log | -| test_logging.rs:100:11:100:18 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:118:5:118:42 | ...::log | semmle.label | ...::log | -| test_logging.rs:118:12:118:41 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:118:28:118:41 | get_password(...) | semmle.label | get_password(...) | -| test_logging.rs:129:9:129:10 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | -| test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | -| test_logging.rs:129:25:129:32 | password | semmle.label | password | -| test_logging.rs:131:5:131:32 | ...::log | semmle.label | ...::log | -| test_logging.rs:131:12:131:31 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:131:28:131:29 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | -| test_logging.rs:131:28:131:31 | t1.1 | semmle.label | t1.1 | -| test_logging.rs:152:5:152:38 | ...::_print | semmle.label | ...::_print | -| test_logging.rs:152:12:152:37 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:152:30:152:37 | password | semmle.label | password | -| test_logging.rs:153:5:153:38 | ...::_print | semmle.label | ...::_print | -| test_logging.rs:153:14:153:37 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:153:30:153:37 | password | semmle.label | password | -| test_logging.rs:154:5:154:39 | ...::_eprint | semmle.label | ...::_eprint | -| test_logging.rs:154:13:154:38 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:154:31:154:38 | password | semmle.label | password | -| test_logging.rs:155:5:155:39 | ...::_eprint | semmle.label | ...::_eprint | -| test_logging.rs:155:15:155:38 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:155:31:155:38 | password | semmle.label | password | -| test_logging.rs:158:16:158:47 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:158:23:158:46 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:158:39:158:46 | password | semmle.label | password | -| test_logging.rs:159:16:159:46 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:159:22:159:45 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:159:38:159:45 | password | semmle.label | password | -| test_logging.rs:160:16:160:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:160:31:160:54 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:160:47:160:54 | password | semmle.label | password | -| test_logging.rs:161:16:161:53 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:161:29:161:52 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:161:45:161:52 | password | semmle.label | password | -| test_logging.rs:162:16:162:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:162:31:162:54 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:162:47:162:54 | password | semmle.label | password | -| test_logging.rs:163:16:163:57 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:163:33:163:56 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:163:49:163:56 | password | semmle.label | password | -| test_logging.rs:164:16:164:57 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:164:33:164:56 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:164:49:164:56 | password | semmle.label | password | -| test_logging.rs:165:16:165:61 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:165:37:165:60 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:165:53:165:60 | password | semmle.label | password | -| test_logging.rs:166:16:166:63 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:166:39:166:62 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:166:55:166:62 | password | semmle.label | password | -| test_logging.rs:167:17:167:64 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:167:40:167:63 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:167:56:167:63 | password | semmle.label | password | -| test_logging.rs:168:27:168:32 | expect | semmle.label | expect | -| test_logging.rs:168:34:168:66 | res | semmle.label | res | -| test_logging.rs:168:34:168:75 | ... .as_str() | semmle.label | ... .as_str() | -| test_logging.rs:168:42:168:65 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:168:42:168:65 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:168:42:168:65 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:168:42:168:65 | { ... } | semmle.label | { ... } | -| test_logging.rs:168:58:168:65 | password | semmle.label | password | -| test_logging.rs:174:30:174:34 | write | semmle.label | write | -| test_logging.rs:174:36:174:70 | res | semmle.label | res | -| test_logging.rs:174:36:174:81 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:174:44:174:69 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:174:44:174:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:174:44:174:69 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:174:44:174:69 | { ... } | semmle.label | { ... } | -| test_logging.rs:174:62:174:69 | password | semmle.label | password | -| test_logging.rs:175:30:175:38 | write_all | semmle.label | write_all | -| test_logging.rs:175:40:175:74 | res | semmle.label | res | -| test_logging.rs:175:40:175:85 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:175:48:175:73 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:175:48:175:73 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:175:48:175:73 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:175:48:175:73 | { ... } | semmle.label | { ... } | -| test_logging.rs:175:66:175:73 | password | semmle.label | password | -| test_logging.rs:178:9:178:13 | write | semmle.label | write | -| test_logging.rs:178:15:178:49 | res | semmle.label | res | -| test_logging.rs:178:15:178:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:178:23:178:48 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:178:23:178:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:178:23:178:48 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:178:23:178:48 | { ... } | semmle.label | { ... } | -| test_logging.rs:178:41:178:48 | password | semmle.label | password | -| test_logging.rs:181:9:181:13 | write | semmle.label | write | -| test_logging.rs:181:15:181:49 | res | semmle.label | res | -| test_logging.rs:181:15:181:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:181:23:181:48 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:181:23:181:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:181:23:181:48 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:181:23:181:48 | { ... } | semmle.label | { ... } | -| test_logging.rs:181:41:181:48 | password | semmle.label | password | +| test_logging.rs:59:5:59:36 | ...::log | semmle.label | ...::log | +| test_logging.rs:59:12:59:35 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:59:24:59:31 | password | semmle.label | password | +| test_logging.rs:61:5:61:54 | ...::log | semmle.label | ...::log | +| test_logging.rs:61:30:61:53 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:61:46:61:53 | password | semmle.label | password | +| test_logging.rs:62:5:62:55 | ...::log | semmle.label | ...::log | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| test_logging.rs:62:20:62:28 | &password | semmle.label | &password | +| test_logging.rs:62:20:62:28 | &password [&ref] | semmle.label | &password [&ref] | +| test_logging.rs:62:20:62:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | +| test_logging.rs:62:20:62:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| test_logging.rs:62:21:62:28 | password | semmle.label | password | +| test_logging.rs:66:5:66:48 | ...::log | semmle.label | ...::log | +| test_logging.rs:66:24:66:47 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:66:40:66:47 | password | semmle.label | password | +| test_logging.rs:68:5:68:66 | ...::log | semmle.label | ...::log | +| test_logging.rs:68:42:68:65 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:68:58:68:65 | password | semmle.label | password | +| test_logging.rs:69:5:69:67 | ...::log | semmle.label | ...::log | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| test_logging.rs:69:18:69:26 | &password | semmle.label | &password | +| test_logging.rs:69:18:69:26 | &password [&ref] | semmle.label | &password [&ref] | +| test_logging.rs:69:18:69:26 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | +| test_logging.rs:69:18:69:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| test_logging.rs:69:19:69:26 | password | semmle.label | password | +| test_logging.rs:73:5:73:47 | ...::log | semmle.label | ...::log | +| test_logging.rs:73:23:73:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:73:39:73:46 | password | semmle.label | password | +| test_logging.rs:75:5:75:65 | ...::log | semmle.label | ...::log | +| test_logging.rs:75:41:75:64 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:75:57:75:64 | password | semmle.label | password | +| test_logging.rs:76:5:76:51 | ...::log | semmle.label | ...::log | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| test_logging.rs:76:20:76:28 | &password | semmle.label | &password | +| test_logging.rs:76:20:76:28 | &password [&ref] | semmle.label | &password [&ref] | +| test_logging.rs:76:20:76:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | +| test_logging.rs:76:20:76:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| test_logging.rs:76:21:76:28 | password | semmle.label | password | +| test_logging.rs:77:5:77:47 | ...::log | semmle.label | ...::log | +| test_logging.rs:77:23:77:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:77:39:77:46 | password | semmle.label | password | +| test_logging.rs:83:5:83:44 | ...::log | semmle.label | ...::log | +| test_logging.rs:83:20:83:43 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:83:36:83:43 | password | semmle.label | password | +| test_logging.rs:85:5:85:62 | ...::log | semmle.label | ...::log | +| test_logging.rs:85:38:85:61 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:85:54:85:61 | password | semmle.label | password | +| test_logging.rs:86:5:86:48 | ...::log | semmle.label | ...::log | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| test_logging.rs:86:20:86:28 | &password | semmle.label | &password | +| test_logging.rs:86:20:86:28 | &password [&ref] | semmle.label | &password [&ref] | +| test_logging.rs:86:20:86:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | +| test_logging.rs:86:20:86:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| test_logging.rs:86:21:86:28 | password | semmle.label | password | +| test_logging.rs:87:5:87:44 | ...::log | semmle.label | ...::log | +| test_logging.rs:87:20:87:43 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:87:36:87:43 | password | semmle.label | password | +| test_logging.rs:94:9:94:10 | m1 | semmle.label | m1 | +| test_logging.rs:94:14:94:22 | &password | semmle.label | &password | +| test_logging.rs:94:15:94:22 | password | semmle.label | password | +| test_logging.rs:95:5:95:29 | ...::log | semmle.label | ...::log | +| test_logging.rs:95:11:95:28 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:97:9:97:10 | m2 | semmle.label | m2 | +| test_logging.rs:97:41:97:49 | &password | semmle.label | &password | +| test_logging.rs:97:42:97:49 | password | semmle.label | password | +| test_logging.rs:98:5:98:19 | ...::log | semmle.label | ...::log | +| test_logging.rs:98:11:98:18 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:100:9:100:10 | m3 | semmle.label | m3 | +| test_logging.rs:100:14:100:46 | res | semmle.label | res | +| test_logging.rs:100:22:100:45 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:100:22:100:45 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:100:22:100:45 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:100:22:100:45 | { ... } | semmle.label | { ... } | +| test_logging.rs:100:38:100:45 | password | semmle.label | password | +| test_logging.rs:101:5:101:19 | ...::log | semmle.label | ...::log | +| test_logging.rs:101:11:101:18 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:119:5:119:42 | ...::log | semmle.label | ...::log | +| test_logging.rs:119:12:119:41 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:119:28:119:41 | get_password(...) | semmle.label | get_password(...) | +| test_logging.rs:130:9:130:10 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | +| test_logging.rs:130:14:130:33 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | +| test_logging.rs:130:25:130:32 | password | semmle.label | password | +| test_logging.rs:132:5:132:32 | ...::log | semmle.label | ...::log | +| test_logging.rs:132:12:132:31 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:132:28:132:29 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | +| test_logging.rs:132:28:132:31 | t1.1 | semmle.label | t1.1 | +| test_logging.rs:179:5:179:38 | ...::_print | semmle.label | ...::_print | +| test_logging.rs:179:12:179:37 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:179:30:179:37 | password | semmle.label | password | +| test_logging.rs:180:5:180:38 | ...::_print | semmle.label | ...::_print | +| test_logging.rs:180:14:180:37 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:180:30:180:37 | password | semmle.label | password | +| test_logging.rs:181:5:181:39 | ...::_eprint | semmle.label | ...::_eprint | +| test_logging.rs:181:13:181:38 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:181:31:181:38 | password | semmle.label | password | +| test_logging.rs:182:5:182:39 | ...::_eprint | semmle.label | ...::_eprint | +| test_logging.rs:182:15:182:38 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:182:31:182:38 | password | semmle.label | password | +| test_logging.rs:185:16:185:47 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:185:23:185:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:185:39:185:46 | password | semmle.label | password | +| test_logging.rs:186:16:186:46 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:186:22:186:45 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:186:38:186:45 | password | semmle.label | password | +| test_logging.rs:187:16:187:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:187:31:187:54 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:187:47:187:54 | password | semmle.label | password | +| test_logging.rs:188:16:188:53 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:188:29:188:52 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:188:45:188:52 | password | semmle.label | password | +| test_logging.rs:189:16:189:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:189:31:189:54 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:189:47:189:54 | password | semmle.label | password | +| test_logging.rs:190:16:190:57 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:190:33:190:56 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:190:49:190:56 | password | semmle.label | password | +| test_logging.rs:191:16:191:57 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:191:33:191:56 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:191:49:191:56 | password | semmle.label | password | +| test_logging.rs:192:16:192:61 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:192:37:192:60 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:192:53:192:60 | password | semmle.label | password | +| test_logging.rs:193:16:193:63 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:193:39:193:62 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:193:55:193:62 | password | semmle.label | password | +| test_logging.rs:194:17:194:64 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:194:40:194:63 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:194:56:194:63 | password | semmle.label | password | +| test_logging.rs:195:27:195:32 | expect | semmle.label | expect | +| test_logging.rs:195:34:195:66 | res | semmle.label | res | +| test_logging.rs:195:34:195:75 | ... .as_str() | semmle.label | ... .as_str() | +| test_logging.rs:195:42:195:65 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:195:42:195:65 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:195:42:195:65 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:195:42:195:65 | { ... } | semmle.label | { ... } | +| test_logging.rs:195:58:195:65 | password | semmle.label | password | +| test_logging.rs:201:30:201:34 | write | semmle.label | write | +| test_logging.rs:201:36:201:70 | res | semmle.label | res | +| test_logging.rs:201:36:201:81 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:201:44:201:69 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:201:44:201:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:201:44:201:69 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:201:44:201:69 | { ... } | semmle.label | { ... } | +| test_logging.rs:201:62:201:69 | password | semmle.label | password | +| test_logging.rs:202:30:202:38 | write_all | semmle.label | write_all | +| test_logging.rs:202:40:202:74 | res | semmle.label | res | +| test_logging.rs:202:40:202:85 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:202:48:202:73 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:202:48:202:73 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:202:48:202:73 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:202:48:202:73 | { ... } | semmle.label | { ... } | +| test_logging.rs:202:66:202:73 | password | semmle.label | password | +| test_logging.rs:205:9:205:13 | write | semmle.label | write | +| test_logging.rs:205:15:205:49 | res | semmle.label | res | +| test_logging.rs:205:15:205:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:205:23:205:48 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:205:23:205:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:205:23:205:48 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:205:23:205:48 | { ... } | semmle.label | { ... } | +| test_logging.rs:205:41:205:48 | password | semmle.label | password | +| test_logging.rs:208:9:208:13 | write | semmle.label | write | +| test_logging.rs:208:15:208:49 | res | semmle.label | res | +| test_logging.rs:208:15:208:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:208:23:208:48 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:208:23:208:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:208:23:208:48 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:208:23:208:48 | { ... } | semmle.label | { ... } | +| test_logging.rs:208:41:208:48 | password | semmle.label | password | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-312/options.yml b/rust/ql/test/query-tests/security/CWE-312/options.yml index 439af840b902..e2329156d6fc 100644 --- a/rust/ql/test/query-tests/security/CWE-312/options.yml +++ b/rust/ql/test/query-tests/security/CWE-312/options.yml @@ -2,3 +2,4 @@ qltest_cargo_check: true qltest_dependencies: - log = { version = "0.4.25", features = ["kv"] } - simple_logger = { version = "5.0.0" } + - log_err = { version = "1.1.1" } diff --git a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs index 529d3ed9a034..852525521000 100644 --- a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs +++ b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs @@ -153,26 +153,26 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { let sensitive_opt: Option = Some(password2.clone()); // log_expect tests with LogErrOption trait - let _ = sensitive_opt.log_expect("Option is None"); // $ Alert[rust/cleartext-logging] + let _ = sensitive_opt.log_expect("Option is None"); // $ MISSING: Alert[rust/cleartext-logging] // log_expect tests with LogErrResult trait let sensitive_result: Result = Ok(password2.clone()); - let _ = sensitive_result.log_expect("Result failed"); // $ Alert[rust/cleartext-logging] + let _ = sensitive_result.log_expect("Result failed"); // $ MISSING: Alert[rust/cleartext-logging] // log_unwrap tests with LogErrOption trait let sensitive_opt2: Option = Some(password2.clone()); - let _ = sensitive_opt2.log_unwrap(); // $ Alert[rust/cleartext-logging] + let _ = sensitive_opt2.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] // log_unwrap tests with LogErrResult trait let sensitive_result2: Result = Ok(password2.clone()); - let _ = sensitive_result2.log_unwrap(); // $ Alert[rust/cleartext-logging] + let _ = sensitive_result2.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] // Negative cases that should fail and log let none_opt: Option = None; - let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ Alert[rust/cleartext-logging] + let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ MISSING: Alert[rust/cleartext-logging] let err_result: Result = Err(password2); - let _ = err_result.log_unwrap(); // $ Alert[rust/cleartext-logging] + let _ = err_result.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] } fn test_std(password: String, i: i32, opt_i: Option) { From e5af4597879a46e2a61f8bacffbe6a5f41842b54 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 20 May 2025 16:54:38 +0100 Subject: [PATCH 3/4] Rust: Correct what we're testing here. --- .../CWE-312/CleartextLogging.expected | 344 +++++++++--------- .../security/CWE-312/test_logging.rs | 34 +- 2 files changed, 193 insertions(+), 185 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index b81d85d90274..4d76ae3b5a52 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -28,25 +28,25 @@ | test_logging.rs:101:5:101:19 | ...::log | test_logging.rs:100:38:100:45 | password | test_logging.rs:101:5:101:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:100:38:100:45 | password | password | | test_logging.rs:119:5:119:42 | ...::log | test_logging.rs:119:28:119:41 | get_password(...) | test_logging.rs:119:5:119:42 | ...::log | This operation writes $@ to a log file. | test_logging.rs:119:28:119:41 | get_password(...) | get_password(...) | | test_logging.rs:132:5:132:32 | ...::log | test_logging.rs:130:25:130:32 | password | test_logging.rs:132:5:132:32 | ...::log | This operation writes $@ to a log file. | test_logging.rs:130:25:130:32 | password | password | -| test_logging.rs:179:5:179:38 | ...::_print | test_logging.rs:179:30:179:37 | password | test_logging.rs:179:5:179:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:179:30:179:37 | password | password | -| test_logging.rs:180:5:180:38 | ...::_print | test_logging.rs:180:30:180:37 | password | test_logging.rs:180:5:180:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:180:30:180:37 | password | password | -| test_logging.rs:181:5:181:39 | ...::_eprint | test_logging.rs:181:31:181:38 | password | test_logging.rs:181:5:181:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:181:31:181:38 | password | password | -| test_logging.rs:182:5:182:39 | ...::_eprint | test_logging.rs:182:31:182:38 | password | test_logging.rs:182:5:182:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:182:31:182:38 | password | password | -| test_logging.rs:185:16:185:47 | ...::panic_fmt | test_logging.rs:185:39:185:46 | password | test_logging.rs:185:16:185:47 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:185:39:185:46 | password | password | -| test_logging.rs:186:16:186:46 | ...::panic_fmt | test_logging.rs:186:38:186:45 | password | test_logging.rs:186:16:186:46 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:186:38:186:45 | password | password | -| test_logging.rs:187:16:187:55 | ...::panic_fmt | test_logging.rs:187:47:187:54 | password | test_logging.rs:187:16:187:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:187:47:187:54 | password | password | -| test_logging.rs:188:16:188:53 | ...::panic_fmt | test_logging.rs:188:45:188:52 | password | test_logging.rs:188:16:188:53 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:188:45:188:52 | password | password | -| test_logging.rs:189:16:189:55 | ...::panic_fmt | test_logging.rs:189:47:189:54 | password | test_logging.rs:189:16:189:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:189:47:189:54 | password | password | -| test_logging.rs:190:16:190:57 | ...::assert_failed | test_logging.rs:190:49:190:56 | password | test_logging.rs:190:16:190:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:190:49:190:56 | password | password | -| test_logging.rs:191:16:191:57 | ...::assert_failed | test_logging.rs:191:49:191:56 | password | test_logging.rs:191:16:191:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:191:49:191:56 | password | password | -| test_logging.rs:192:16:192:61 | ...::panic_fmt | test_logging.rs:192:53:192:60 | password | test_logging.rs:192:16:192:61 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:192:53:192:60 | password | password | -| test_logging.rs:193:16:193:63 | ...::assert_failed | test_logging.rs:193:55:193:62 | password | test_logging.rs:193:16:193:63 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:193:55:193:62 | password | password | -| test_logging.rs:194:17:194:64 | ...::assert_failed | test_logging.rs:194:56:194:63 | password | test_logging.rs:194:17:194:64 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:194:56:194:63 | password | password | -| test_logging.rs:195:27:195:32 | expect | test_logging.rs:195:58:195:65 | password | test_logging.rs:195:27:195:32 | expect | This operation writes $@ to a log file. | test_logging.rs:195:58:195:65 | password | password | -| test_logging.rs:201:30:201:34 | write | test_logging.rs:201:62:201:69 | password | test_logging.rs:201:30:201:34 | write | This operation writes $@ to a log file. | test_logging.rs:201:62:201:69 | password | password | -| test_logging.rs:202:30:202:38 | write_all | test_logging.rs:202:66:202:73 | password | test_logging.rs:202:30:202:38 | write_all | This operation writes $@ to a log file. | test_logging.rs:202:66:202:73 | password | password | -| test_logging.rs:205:9:205:13 | write | test_logging.rs:205:41:205:48 | password | test_logging.rs:205:9:205:13 | write | This operation writes $@ to a log file. | test_logging.rs:205:41:205:48 | password | password | -| test_logging.rs:208:9:208:13 | write | test_logging.rs:208:41:208:48 | password | test_logging.rs:208:9:208:13 | write | This operation writes $@ to a log file. | test_logging.rs:208:41:208:48 | password | password | +| test_logging.rs:187:5:187:38 | ...::_print | test_logging.rs:187:30:187:37 | password | test_logging.rs:187:5:187:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:187:30:187:37 | password | password | +| test_logging.rs:188:5:188:38 | ...::_print | test_logging.rs:188:30:188:37 | password | test_logging.rs:188:5:188:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:188:30:188:37 | password | password | +| test_logging.rs:189:5:189:39 | ...::_eprint | test_logging.rs:189:31:189:38 | password | test_logging.rs:189:5:189:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:189:31:189:38 | password | password | +| test_logging.rs:190:5:190:39 | ...::_eprint | test_logging.rs:190:31:190:38 | password | test_logging.rs:190:5:190:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:190:31:190:38 | password | password | +| test_logging.rs:193:16:193:47 | ...::panic_fmt | test_logging.rs:193:39:193:46 | password | test_logging.rs:193:16:193:47 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:193:39:193:46 | password | password | +| test_logging.rs:194:16:194:46 | ...::panic_fmt | test_logging.rs:194:38:194:45 | password | test_logging.rs:194:16:194:46 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:194:38:194:45 | password | password | +| test_logging.rs:195:16:195:55 | ...::panic_fmt | test_logging.rs:195:47:195:54 | password | test_logging.rs:195:16:195:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:195:47:195:54 | password | password | +| test_logging.rs:196:16:196:53 | ...::panic_fmt | test_logging.rs:196:45:196:52 | password | test_logging.rs:196:16:196:53 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:196:45:196:52 | password | password | +| test_logging.rs:197:16:197:55 | ...::panic_fmt | test_logging.rs:197:47:197:54 | password | test_logging.rs:197:16:197:55 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:197:47:197:54 | password | password | +| test_logging.rs:198:16:198:57 | ...::assert_failed | test_logging.rs:198:49:198:56 | password | test_logging.rs:198:16:198:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:198:49:198:56 | password | password | +| test_logging.rs:199:16:199:57 | ...::assert_failed | test_logging.rs:199:49:199:56 | password | test_logging.rs:199:16:199:57 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:199:49:199:56 | password | password | +| test_logging.rs:200:16:200:61 | ...::panic_fmt | test_logging.rs:200:53:200:60 | password | test_logging.rs:200:16:200:61 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:200:53:200:60 | password | password | +| test_logging.rs:201:16:201:63 | ...::assert_failed | test_logging.rs:201:55:201:62 | password | test_logging.rs:201:16:201:63 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:201:55:201:62 | password | password | +| test_logging.rs:202:17:202:64 | ...::assert_failed | test_logging.rs:202:56:202:63 | password | test_logging.rs:202:17:202:64 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:202:56:202:63 | password | password | +| test_logging.rs:203:27:203:32 | expect | test_logging.rs:203:58:203:65 | password | test_logging.rs:203:27:203:32 | expect | This operation writes $@ to a log file. | test_logging.rs:203:58:203:65 | password | password | +| test_logging.rs:209:30:209:34 | write | test_logging.rs:209:62:209:69 | password | test_logging.rs:209:30:209:34 | write | This operation writes $@ to a log file. | test_logging.rs:209:62:209:69 | password | password | +| test_logging.rs:210:30:210:38 | write_all | test_logging.rs:210:66:210:73 | password | test_logging.rs:210:30:210:38 | write_all | This operation writes $@ to a log file. | test_logging.rs:210:66:210:73 | password | password | +| test_logging.rs:213:9:213:13 | write | test_logging.rs:213:41:213:48 | password | test_logging.rs:213:9:213:13 | write | This operation writes $@ to a log file. | test_logging.rs:213:41:213:48 | password | password | +| test_logging.rs:216:9:216:13 | write | test_logging.rs:216:41:216:48 | password | test_logging.rs:216:9:216:13 | write | This operation writes $@ to a log file. | test_logging.rs:216:41:216:48 | password | password | edges | test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | @@ -148,73 +148,73 @@ edges | test_logging.rs:132:12:132:31 | MacroExpr | test_logging.rs:132:5:132:32 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:132:28:132:29 | t1 [tuple.1] | test_logging.rs:132:28:132:31 | t1.1 | provenance | | | test_logging.rs:132:28:132:31 | t1.1 | test_logging.rs:132:12:132:31 | MacroExpr | provenance | | -| test_logging.rs:179:12:179:37 | MacroExpr | test_logging.rs:179:5:179:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | -| test_logging.rs:179:30:179:37 | password | test_logging.rs:179:12:179:37 | MacroExpr | provenance | | -| test_logging.rs:180:14:180:37 | MacroExpr | test_logging.rs:180:5:180:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | -| test_logging.rs:180:30:180:37 | password | test_logging.rs:180:14:180:37 | MacroExpr | provenance | | -| test_logging.rs:181:13:181:38 | MacroExpr | test_logging.rs:181:5:181:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | -| test_logging.rs:181:31:181:38 | password | test_logging.rs:181:13:181:38 | MacroExpr | provenance | | -| test_logging.rs:182:15:182:38 | MacroExpr | test_logging.rs:182:5:182:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | -| test_logging.rs:182:31:182:38 | password | test_logging.rs:182:15:182:38 | MacroExpr | provenance | | -| test_logging.rs:185:23:185:46 | MacroExpr | test_logging.rs:185:16:185:47 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:185:39:185:46 | password | test_logging.rs:185:23:185:46 | MacroExpr | provenance | | -| test_logging.rs:186:22:186:45 | MacroExpr | test_logging.rs:186:16:186:46 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:186:38:186:45 | password | test_logging.rs:186:22:186:45 | MacroExpr | provenance | | -| test_logging.rs:187:31:187:54 | MacroExpr | test_logging.rs:187:16:187:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:187:47:187:54 | password | test_logging.rs:187:31:187:54 | MacroExpr | provenance | | -| test_logging.rs:188:29:188:52 | MacroExpr | test_logging.rs:188:16:188:53 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:188:45:188:52 | password | test_logging.rs:188:29:188:52 | MacroExpr | provenance | | -| test_logging.rs:189:31:189:54 | MacroExpr | test_logging.rs:189:16:189:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:189:47:189:54 | password | test_logging.rs:189:31:189:54 | MacroExpr | provenance | | -| test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | test_logging.rs:190:16:190:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:190:33:190:56 | MacroExpr | test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:190:49:190:56 | password | test_logging.rs:190:33:190:56 | MacroExpr | provenance | | -| test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | test_logging.rs:191:16:191:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:191:33:191:56 | MacroExpr | test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:191:49:191:56 | password | test_logging.rs:191:33:191:56 | MacroExpr | provenance | | -| test_logging.rs:192:37:192:60 | MacroExpr | test_logging.rs:192:16:192:61 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:192:53:192:60 | password | test_logging.rs:192:37:192:60 | MacroExpr | provenance | | -| test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | test_logging.rs:193:16:193:63 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:193:39:193:62 | MacroExpr | test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:193:55:193:62 | password | test_logging.rs:193:39:193:62 | MacroExpr | provenance | | -| test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | test_logging.rs:194:17:194:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:194:40:194:63 | MacroExpr | test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | provenance | | -| test_logging.rs:194:56:194:63 | password | test_logging.rs:194:40:194:63 | MacroExpr | provenance | | -| test_logging.rs:195:34:195:66 | res | test_logging.rs:195:42:195:65 | { ... } | provenance | | -| test_logging.rs:195:34:195:75 | ... .as_str() | test_logging.rs:195:27:195:32 | expect | provenance | MaD:1 Sink:MaD:1 | -| test_logging.rs:195:42:195:65 | ...::format(...) | test_logging.rs:195:34:195:66 | res | provenance | | -| test_logging.rs:195:42:195:65 | ...::must_use(...) | test_logging.rs:195:34:195:75 | ... .as_str() | provenance | MaD:12 | -| test_logging.rs:195:42:195:65 | MacroExpr | test_logging.rs:195:42:195:65 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:195:42:195:65 | { ... } | test_logging.rs:195:42:195:65 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:195:58:195:65 | password | test_logging.rs:195:42:195:65 | MacroExpr | provenance | | -| test_logging.rs:201:36:201:70 | res | test_logging.rs:201:44:201:69 | { ... } | provenance | | -| test_logging.rs:201:36:201:81 | ... .as_bytes() | test_logging.rs:201:30:201:34 | write | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:201:44:201:69 | ...::format(...) | test_logging.rs:201:36:201:70 | res | provenance | | -| test_logging.rs:201:44:201:69 | ...::must_use(...) | test_logging.rs:201:36:201:81 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:201:44:201:69 | MacroExpr | test_logging.rs:201:44:201:69 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:201:44:201:69 | { ... } | test_logging.rs:201:44:201:69 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:201:62:201:69 | password | test_logging.rs:201:44:201:69 | MacroExpr | provenance | | -| test_logging.rs:202:40:202:74 | res | test_logging.rs:202:48:202:73 | { ... } | provenance | | -| test_logging.rs:202:40:202:85 | ... .as_bytes() | test_logging.rs:202:30:202:38 | write_all | provenance | MaD:6 Sink:MaD:6 | -| test_logging.rs:202:48:202:73 | ...::format(...) | test_logging.rs:202:40:202:74 | res | provenance | | -| test_logging.rs:202:48:202:73 | ...::must_use(...) | test_logging.rs:202:40:202:85 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:202:48:202:73 | MacroExpr | test_logging.rs:202:48:202:73 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:202:48:202:73 | { ... } | test_logging.rs:202:48:202:73 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:202:66:202:73 | password | test_logging.rs:202:48:202:73 | MacroExpr | provenance | | -| test_logging.rs:205:15:205:49 | res | test_logging.rs:205:23:205:48 | { ... } | provenance | | -| test_logging.rs:205:15:205:60 | ... .as_bytes() | test_logging.rs:205:9:205:13 | write | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:205:23:205:48 | ...::format(...) | test_logging.rs:205:15:205:49 | res | provenance | | -| test_logging.rs:205:23:205:48 | ...::must_use(...) | test_logging.rs:205:15:205:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:205:23:205:48 | MacroExpr | test_logging.rs:205:23:205:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:205:23:205:48 | { ... } | test_logging.rs:205:23:205:48 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:205:41:205:48 | password | test_logging.rs:205:23:205:48 | MacroExpr | provenance | | -| test_logging.rs:208:15:208:49 | res | test_logging.rs:208:23:208:48 | { ... } | provenance | | -| test_logging.rs:208:15:208:60 | ... .as_bytes() | test_logging.rs:208:9:208:13 | write | provenance | MaD:4 Sink:MaD:4 | -| test_logging.rs:208:23:208:48 | ...::format(...) | test_logging.rs:208:15:208:49 | res | provenance | | -| test_logging.rs:208:23:208:48 | ...::must_use(...) | test_logging.rs:208:15:208:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:208:23:208:48 | MacroExpr | test_logging.rs:208:23:208:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:208:23:208:48 | { ... } | test_logging.rs:208:23:208:48 | ...::must_use(...) | provenance | MaD:14 | -| test_logging.rs:208:41:208:48 | password | test_logging.rs:208:23:208:48 | MacroExpr | provenance | | +| test_logging.rs:187:12:187:37 | MacroExpr | test_logging.rs:187:5:187:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | +| test_logging.rs:187:30:187:37 | password | test_logging.rs:187:12:187:37 | MacroExpr | provenance | | +| test_logging.rs:188:14:188:37 | MacroExpr | test_logging.rs:188:5:188:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | +| test_logging.rs:188:30:188:37 | password | test_logging.rs:188:14:188:37 | MacroExpr | provenance | | +| test_logging.rs:189:13:189:38 | MacroExpr | test_logging.rs:189:5:189:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:189:31:189:38 | password | test_logging.rs:189:13:189:38 | MacroExpr | provenance | | +| test_logging.rs:190:15:190:38 | MacroExpr | test_logging.rs:190:5:190:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:190:31:190:38 | password | test_logging.rs:190:15:190:38 | MacroExpr | provenance | | +| test_logging.rs:193:23:193:46 | MacroExpr | test_logging.rs:193:16:193:47 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:193:39:193:46 | password | test_logging.rs:193:23:193:46 | MacroExpr | provenance | | +| test_logging.rs:194:22:194:45 | MacroExpr | test_logging.rs:194:16:194:46 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:194:38:194:45 | password | test_logging.rs:194:22:194:45 | MacroExpr | provenance | | +| test_logging.rs:195:31:195:54 | MacroExpr | test_logging.rs:195:16:195:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:195:47:195:54 | password | test_logging.rs:195:31:195:54 | MacroExpr | provenance | | +| test_logging.rs:196:29:196:52 | MacroExpr | test_logging.rs:196:16:196:53 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:196:45:196:52 | password | test_logging.rs:196:29:196:52 | MacroExpr | provenance | | +| test_logging.rs:197:31:197:54 | MacroExpr | test_logging.rs:197:16:197:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:197:47:197:54 | password | test_logging.rs:197:31:197:54 | MacroExpr | provenance | | +| test_logging.rs:198:33:198:56 | ...::Some(...) [Some] | test_logging.rs:198:16:198:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:198:33:198:56 | MacroExpr | test_logging.rs:198:33:198:56 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:198:49:198:56 | password | test_logging.rs:198:33:198:56 | MacroExpr | provenance | | +| test_logging.rs:199:33:199:56 | ...::Some(...) [Some] | test_logging.rs:199:16:199:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:199:33:199:56 | MacroExpr | test_logging.rs:199:33:199:56 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:199:49:199:56 | password | test_logging.rs:199:33:199:56 | MacroExpr | provenance | | +| test_logging.rs:200:37:200:60 | MacroExpr | test_logging.rs:200:16:200:61 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:200:53:200:60 | password | test_logging.rs:200:37:200:60 | MacroExpr | provenance | | +| test_logging.rs:201:39:201:62 | ...::Some(...) [Some] | test_logging.rs:201:16:201:63 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:201:39:201:62 | MacroExpr | test_logging.rs:201:39:201:62 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:201:55:201:62 | password | test_logging.rs:201:39:201:62 | MacroExpr | provenance | | +| test_logging.rs:202:40:202:63 | ...::Some(...) [Some] | test_logging.rs:202:17:202:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:202:40:202:63 | MacroExpr | test_logging.rs:202:40:202:63 | ...::Some(...) [Some] | provenance | | +| test_logging.rs:202:56:202:63 | password | test_logging.rs:202:40:202:63 | MacroExpr | provenance | | +| test_logging.rs:203:34:203:66 | res | test_logging.rs:203:42:203:65 | { ... } | provenance | | +| test_logging.rs:203:34:203:75 | ... .as_str() | test_logging.rs:203:27:203:32 | expect | provenance | MaD:1 Sink:MaD:1 | +| test_logging.rs:203:42:203:65 | ...::format(...) | test_logging.rs:203:34:203:66 | res | provenance | | +| test_logging.rs:203:42:203:65 | ...::must_use(...) | test_logging.rs:203:34:203:75 | ... .as_str() | provenance | MaD:12 | +| test_logging.rs:203:42:203:65 | MacroExpr | test_logging.rs:203:42:203:65 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:203:42:203:65 | { ... } | test_logging.rs:203:42:203:65 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:203:58:203:65 | password | test_logging.rs:203:42:203:65 | MacroExpr | provenance | | +| test_logging.rs:209:36:209:70 | res | test_logging.rs:209:44:209:69 | { ... } | provenance | | +| test_logging.rs:209:36:209:81 | ... .as_bytes() | test_logging.rs:209:30:209:34 | write | provenance | MaD:5 Sink:MaD:5 | +| test_logging.rs:209:44:209:69 | ...::format(...) | test_logging.rs:209:36:209:70 | res | provenance | | +| test_logging.rs:209:44:209:69 | ...::must_use(...) | test_logging.rs:209:36:209:81 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:209:44:209:69 | MacroExpr | test_logging.rs:209:44:209:69 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:209:44:209:69 | { ... } | test_logging.rs:209:44:209:69 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:209:62:209:69 | password | test_logging.rs:209:44:209:69 | MacroExpr | provenance | | +| test_logging.rs:210:40:210:74 | res | test_logging.rs:210:48:210:73 | { ... } | provenance | | +| test_logging.rs:210:40:210:85 | ... .as_bytes() | test_logging.rs:210:30:210:38 | write_all | provenance | MaD:6 Sink:MaD:6 | +| test_logging.rs:210:48:210:73 | ...::format(...) | test_logging.rs:210:40:210:74 | res | provenance | | +| test_logging.rs:210:48:210:73 | ...::must_use(...) | test_logging.rs:210:40:210:85 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:210:48:210:73 | MacroExpr | test_logging.rs:210:48:210:73 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:210:48:210:73 | { ... } | test_logging.rs:210:48:210:73 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:210:66:210:73 | password | test_logging.rs:210:48:210:73 | MacroExpr | provenance | | +| test_logging.rs:213:15:213:49 | res | test_logging.rs:213:23:213:48 | { ... } | provenance | | +| test_logging.rs:213:15:213:60 | ... .as_bytes() | test_logging.rs:213:9:213:13 | write | provenance | MaD:5 Sink:MaD:5 | +| test_logging.rs:213:23:213:48 | ...::format(...) | test_logging.rs:213:15:213:49 | res | provenance | | +| test_logging.rs:213:23:213:48 | ...::must_use(...) | test_logging.rs:213:15:213:60 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:213:23:213:48 | MacroExpr | test_logging.rs:213:23:213:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:213:23:213:48 | { ... } | test_logging.rs:213:23:213:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:213:41:213:48 | password | test_logging.rs:213:23:213:48 | MacroExpr | provenance | | +| test_logging.rs:216:15:216:49 | res | test_logging.rs:216:23:216:48 | { ... } | provenance | | +| test_logging.rs:216:15:216:60 | ... .as_bytes() | test_logging.rs:216:9:216:13 | write | provenance | MaD:4 Sink:MaD:4 | +| test_logging.rs:216:23:216:48 | ...::format(...) | test_logging.rs:216:15:216:49 | res | provenance | | +| test_logging.rs:216:23:216:48 | ...::must_use(...) | test_logging.rs:216:15:216:60 | ... .as_bytes() | provenance | MaD:11 | +| test_logging.rs:216:23:216:48 | MacroExpr | test_logging.rs:216:23:216:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:216:23:216:48 | { ... } | test_logging.rs:216:23:216:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:216:41:216:48 | password | test_logging.rs:216:23:216:48 | MacroExpr | provenance | | models | 1 | Sink: lang:core; ::expect; log-injection; Argument[0] | | 2 | Sink: lang:core; crate::panicking::assert_failed; log-injection; Argument[3].Field[crate::option::Option::Some(0)] | @@ -352,90 +352,90 @@ nodes | test_logging.rs:132:12:132:31 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:132:28:132:29 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | | test_logging.rs:132:28:132:31 | t1.1 | semmle.label | t1.1 | -| test_logging.rs:179:5:179:38 | ...::_print | semmle.label | ...::_print | -| test_logging.rs:179:12:179:37 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:179:30:179:37 | password | semmle.label | password | -| test_logging.rs:180:5:180:38 | ...::_print | semmle.label | ...::_print | -| test_logging.rs:180:14:180:37 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:180:30:180:37 | password | semmle.label | password | -| test_logging.rs:181:5:181:39 | ...::_eprint | semmle.label | ...::_eprint | -| test_logging.rs:181:13:181:38 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:181:31:181:38 | password | semmle.label | password | -| test_logging.rs:182:5:182:39 | ...::_eprint | semmle.label | ...::_eprint | -| test_logging.rs:182:15:182:38 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:182:31:182:38 | password | semmle.label | password | -| test_logging.rs:185:16:185:47 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:185:23:185:46 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:185:39:185:46 | password | semmle.label | password | -| test_logging.rs:186:16:186:46 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:186:22:186:45 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:186:38:186:45 | password | semmle.label | password | -| test_logging.rs:187:16:187:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:187:31:187:54 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:187:47:187:54 | password | semmle.label | password | -| test_logging.rs:188:16:188:53 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:188:29:188:52 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:188:45:188:52 | password | semmle.label | password | -| test_logging.rs:189:16:189:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:189:31:189:54 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:189:47:189:54 | password | semmle.label | password | -| test_logging.rs:190:16:190:57 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:190:33:190:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:190:33:190:56 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:190:49:190:56 | password | semmle.label | password | -| test_logging.rs:191:16:191:57 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:191:33:191:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:191:33:191:56 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:191:49:191:56 | password | semmle.label | password | -| test_logging.rs:192:16:192:61 | ...::panic_fmt | semmle.label | ...::panic_fmt | -| test_logging.rs:192:37:192:60 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:192:53:192:60 | password | semmle.label | password | -| test_logging.rs:193:16:193:63 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:193:39:193:62 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:193:39:193:62 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:193:55:193:62 | password | semmle.label | password | -| test_logging.rs:194:17:194:64 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:194:40:194:63 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| test_logging.rs:194:40:194:63 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:194:56:194:63 | password | semmle.label | password | -| test_logging.rs:195:27:195:32 | expect | semmle.label | expect | -| test_logging.rs:195:34:195:66 | res | semmle.label | res | -| test_logging.rs:195:34:195:75 | ... .as_str() | semmle.label | ... .as_str() | -| test_logging.rs:195:42:195:65 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:195:42:195:65 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:195:42:195:65 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:195:42:195:65 | { ... } | semmle.label | { ... } | -| test_logging.rs:195:58:195:65 | password | semmle.label | password | -| test_logging.rs:201:30:201:34 | write | semmle.label | write | -| test_logging.rs:201:36:201:70 | res | semmle.label | res | -| test_logging.rs:201:36:201:81 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:201:44:201:69 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:201:44:201:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:201:44:201:69 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:201:44:201:69 | { ... } | semmle.label | { ... } | -| test_logging.rs:201:62:201:69 | password | semmle.label | password | -| test_logging.rs:202:30:202:38 | write_all | semmle.label | write_all | -| test_logging.rs:202:40:202:74 | res | semmle.label | res | -| test_logging.rs:202:40:202:85 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:202:48:202:73 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:202:48:202:73 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:202:48:202:73 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:202:48:202:73 | { ... } | semmle.label | { ... } | -| test_logging.rs:202:66:202:73 | password | semmle.label | password | -| test_logging.rs:205:9:205:13 | write | semmle.label | write | -| test_logging.rs:205:15:205:49 | res | semmle.label | res | -| test_logging.rs:205:15:205:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:205:23:205:48 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:205:23:205:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:205:23:205:48 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:205:23:205:48 | { ... } | semmle.label | { ... } | -| test_logging.rs:205:41:205:48 | password | semmle.label | password | -| test_logging.rs:208:9:208:13 | write | semmle.label | write | -| test_logging.rs:208:15:208:49 | res | semmle.label | res | -| test_logging.rs:208:15:208:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | -| test_logging.rs:208:23:208:48 | ...::format(...) | semmle.label | ...::format(...) | -| test_logging.rs:208:23:208:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| test_logging.rs:208:23:208:48 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:208:23:208:48 | { ... } | semmle.label | { ... } | -| test_logging.rs:208:41:208:48 | password | semmle.label | password | +| test_logging.rs:187:5:187:38 | ...::_print | semmle.label | ...::_print | +| test_logging.rs:187:12:187:37 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:187:30:187:37 | password | semmle.label | password | +| test_logging.rs:188:5:188:38 | ...::_print | semmle.label | ...::_print | +| test_logging.rs:188:14:188:37 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:188:30:188:37 | password | semmle.label | password | +| test_logging.rs:189:5:189:39 | ...::_eprint | semmle.label | ...::_eprint | +| test_logging.rs:189:13:189:38 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:189:31:189:38 | password | semmle.label | password | +| test_logging.rs:190:5:190:39 | ...::_eprint | semmle.label | ...::_eprint | +| test_logging.rs:190:15:190:38 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:190:31:190:38 | password | semmle.label | password | +| test_logging.rs:193:16:193:47 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:193:23:193:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:193:39:193:46 | password | semmle.label | password | +| test_logging.rs:194:16:194:46 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:194:22:194:45 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:194:38:194:45 | password | semmle.label | password | +| test_logging.rs:195:16:195:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:195:31:195:54 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:195:47:195:54 | password | semmle.label | password | +| test_logging.rs:196:16:196:53 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:196:29:196:52 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:196:45:196:52 | password | semmle.label | password | +| test_logging.rs:197:16:197:55 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:197:31:197:54 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:197:47:197:54 | password | semmle.label | password | +| test_logging.rs:198:16:198:57 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:198:33:198:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:198:33:198:56 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:198:49:198:56 | password | semmle.label | password | +| test_logging.rs:199:16:199:57 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:199:33:199:56 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:199:33:199:56 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:199:49:199:56 | password | semmle.label | password | +| test_logging.rs:200:16:200:61 | ...::panic_fmt | semmle.label | ...::panic_fmt | +| test_logging.rs:200:37:200:60 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:200:53:200:60 | password | semmle.label | password | +| test_logging.rs:201:16:201:63 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:201:39:201:62 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:201:39:201:62 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:201:55:201:62 | password | semmle.label | password | +| test_logging.rs:202:17:202:64 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:202:40:202:63 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| test_logging.rs:202:40:202:63 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:202:56:202:63 | password | semmle.label | password | +| test_logging.rs:203:27:203:32 | expect | semmle.label | expect | +| test_logging.rs:203:34:203:66 | res | semmle.label | res | +| test_logging.rs:203:34:203:75 | ... .as_str() | semmle.label | ... .as_str() | +| test_logging.rs:203:42:203:65 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:203:42:203:65 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:203:42:203:65 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:203:42:203:65 | { ... } | semmle.label | { ... } | +| test_logging.rs:203:58:203:65 | password | semmle.label | password | +| test_logging.rs:209:30:209:34 | write | semmle.label | write | +| test_logging.rs:209:36:209:70 | res | semmle.label | res | +| test_logging.rs:209:36:209:81 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:209:44:209:69 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:209:44:209:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:209:44:209:69 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:209:44:209:69 | { ... } | semmle.label | { ... } | +| test_logging.rs:209:62:209:69 | password | semmle.label | password | +| test_logging.rs:210:30:210:38 | write_all | semmle.label | write_all | +| test_logging.rs:210:40:210:74 | res | semmle.label | res | +| test_logging.rs:210:40:210:85 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:210:48:210:73 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:210:48:210:73 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:210:48:210:73 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:210:48:210:73 | { ... } | semmle.label | { ... } | +| test_logging.rs:210:66:210:73 | password | semmle.label | password | +| test_logging.rs:213:9:213:13 | write | semmle.label | write | +| test_logging.rs:213:15:213:49 | res | semmle.label | res | +| test_logging.rs:213:15:213:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:213:23:213:48 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:213:23:213:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:213:23:213:48 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:213:23:213:48 | { ... } | semmle.label | { ... } | +| test_logging.rs:213:41:213:48 | password | semmle.label | password | +| test_logging.rs:216:9:216:13 | write | semmle.label | write | +| test_logging.rs:216:15:216:49 | res | semmle.label | res | +| test_logging.rs:216:15:216:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | +| test_logging.rs:216:23:216:48 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:216:23:216:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:216:23:216:48 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:216:23:216:48 | { ... } | semmle.label | { ... } | +| test_logging.rs:216:41:216:48 | password | semmle.label | password | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs index 852525521000..6202bcaa2f4b 100644 --- a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs +++ b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs @@ -148,31 +148,39 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { warn!("message = {:?}", s2); // $ MISSING: Alert[rust/cleartext-logging]=s2 warn!("message = {:#?}", s2); // $ MISSING: Alert[rust/cleartext-logging]=s2 - // test log_expect with sensitive data let password2 = "123456".to_string(); // Create new password for this test - let sensitive_opt: Option = Some(password2.clone()); - // log_expect tests with LogErrOption trait - let _ = sensitive_opt.log_expect("Option is None"); // $ MISSING: Alert[rust/cleartext-logging] + // test `log_expect` with sensitive `Option.Some` (which is not output by `log_expect`) + let sensitive_opt: Option = Some(password2.clone()); + let _ = sensitive_opt.log_expect("Option is None"); - // log_expect tests with LogErrResult trait + // test `log_expect` with sensitive `Result.Ok` (which is not output by `log_expect`) let sensitive_result: Result = Ok(password2.clone()); - let _ = sensitive_result.log_expect("Result failed"); // $ MISSING: Alert[rust/cleartext-logging] + let _ = sensitive_result.log_expect("Result failed"); - // log_unwrap tests with LogErrOption trait + // test `log_unwrap` with sensitive `Option.Some` (which is not output by `log_unwrap`) let sensitive_opt2: Option = Some(password2.clone()); - let _ = sensitive_opt2.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] + let _ = sensitive_opt2.log_unwrap(); - // log_unwrap tests with LogErrResult trait + // test `log_unwrap` with sensitive `Result.Ok` (which is not output by `log_unwrap`) let sensitive_result2: Result = Ok(password2.clone()); - let _ = sensitive_result2.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] + let _ = sensitive_result2.log_unwrap(); - // Negative cases that should fail and log + // test `log_expect` on `Option` with sensitive message let none_opt: Option = None; let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ MISSING: Alert[rust/cleartext-logging] - let err_result: Result = Err(password2); - let _ = err_result.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] + // test `log_expect` on `Result` with sensitive message + let err_result: Result = Err(""); + let _ = err_result.log_expect(&format!("Failed with password: {}", password2)); // $ MISSING: Alert[rust/cleartext-logging] + + // test `log_expect` with sensitive `Result.Err` + let err_result2: Result = Err(password2.clone()); + let _ = err_result2.log_expect(""); // $ MISSING: Alert[rust/cleartext-logging] + + // test `log_unwrap` with sensitive `Result.Err` + let err_result3: Result = Err(password2); + let _ = err_result3.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] } fn test_std(password: String, i: i32, opt_i: Option) { From e96e39c3d37552c6b178c404a1e30e3210632257 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 20 May 2025 15:51:25 +0100 Subject: [PATCH 4/4] Rust: Model log_err. --- .../lib/codeql/rust/frameworks/log.model.yml | 4 + .../CWE-312/CleartextLogging.expected | 175 ++++++++++++------ .../security/CWE-312/test_logging.rs | 8 +- 3 files changed, 123 insertions(+), 64 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/log.model.yml b/rust/ql/lib/codeql/rust/frameworks/log.model.yml index d6ac223742f8..15f45c400934 100644 --- a/rust/ql/lib/codeql/rust/frameworks/log.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/log.model.yml @@ -17,3 +17,7 @@ extensions: - ["lang:core", "crate::panicking::panic_fmt", "Argument[0]", "log-injection", "manual"] - ["lang:core", "crate::panicking::assert_failed", "Argument[3].Field[crate::option::Option::Some(0)]", "log-injection", "manual"] - ["lang:core", "::expect", "Argument[0]", "log-injection", "manual"] + - ["repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err", "::log_expect", "Argument[0]", "log-injection", "manual"] + - ["repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err", "::log_unwrap", "Argument[self].Field[crate::result::Result::Err(0)]", "log-injection", "manual"] + - ["repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err", "::log_expect", "Argument[0]", "log-injection", "manual"] + - ["repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err", "::log_expect", "Argument[self].Field[crate::result::Result::Err(0)]", "log-injection", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 4d76ae3b5a52..c21ce5b8aefa 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -28,6 +28,9 @@ | test_logging.rs:101:5:101:19 | ...::log | test_logging.rs:100:38:100:45 | password | test_logging.rs:101:5:101:19 | ...::log | This operation writes $@ to a log file. | test_logging.rs:100:38:100:45 | password | password | | test_logging.rs:119:5:119:42 | ...::log | test_logging.rs:119:28:119:41 | get_password(...) | test_logging.rs:119:5:119:42 | ...::log | This operation writes $@ to a log file. | test_logging.rs:119:28:119:41 | get_password(...) | get_password(...) | | test_logging.rs:132:5:132:32 | ...::log | test_logging.rs:130:25:130:32 | password | test_logging.rs:132:5:132:32 | ...::log | This operation writes $@ to a log file. | test_logging.rs:130:25:130:32 | password | password | +| test_logging.rs:171:22:171:31 | log_expect | test_logging.rs:171:70:171:78 | password2 | test_logging.rs:171:22:171:31 | log_expect | This operation writes $@ to a log file. | test_logging.rs:171:70:171:78 | password2 | password2 | +| test_logging.rs:175:24:175:33 | log_expect | test_logging.rs:175:72:175:80 | password2 | test_logging.rs:175:24:175:33 | log_expect | This operation writes $@ to a log file. | test_logging.rs:175:72:175:80 | password2 | password2 | +| test_logging.rs:183:25:183:34 | log_unwrap | test_logging.rs:182:51:182:59 | password2 | test_logging.rs:183:25:183:34 | log_unwrap | This operation writes $@ to a log file. | test_logging.rs:182:51:182:59 | password2 | password2 | | test_logging.rs:187:5:187:38 | ...::_print | test_logging.rs:187:30:187:37 | password | test_logging.rs:187:5:187:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:187:30:187:37 | password | password | | test_logging.rs:188:5:188:38 | ...::_print | test_logging.rs:188:30:188:37 | password | test_logging.rs:188:5:188:38 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:188:30:188:37 | password | password | | test_logging.rs:189:5:189:39 | ...::_eprint | test_logging.rs:189:31:189:38 | password | test_logging.rs:189:5:189:39 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:189:31:189:38 | password | password | @@ -48,106 +51,130 @@ | test_logging.rs:213:9:213:13 | write | test_logging.rs:213:41:213:48 | password | test_logging.rs:213:9:213:13 | write | This operation writes $@ to a log file. | test_logging.rs:213:41:213:48 | password | password | | test_logging.rs:216:9:216:13 | write | test_logging.rs:216:41:216:48 | password | test_logging.rs:216:9:216:13 | write | This operation writes $@ to a log file. | test_logging.rs:216:41:216:48 | password | password | edges -| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | -| test_logging.rs:44:12:44:35 | MacroExpr | test_logging.rs:44:5:44:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:44:12:44:35 | MacroExpr | test_logging.rs:44:5:44:36 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:44:28:44:35 | password | test_logging.rs:44:12:44:35 | MacroExpr | provenance | | -| test_logging.rs:45:11:45:34 | MacroExpr | test_logging.rs:45:5:45:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:45:11:45:34 | MacroExpr | test_logging.rs:45:5:45:35 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:45:27:45:34 | password | test_logging.rs:45:11:45:34 | MacroExpr | provenance | | -| test_logging.rs:46:12:46:35 | MacroExpr | test_logging.rs:46:5:46:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:46:12:46:35 | MacroExpr | test_logging.rs:46:5:46:36 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:46:28:46:35 | password | test_logging.rs:46:12:46:35 | MacroExpr | provenance | | -| test_logging.rs:47:11:47:34 | MacroExpr | test_logging.rs:47:5:47:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:47:11:47:34 | MacroExpr | test_logging.rs:47:5:47:35 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:47:27:47:34 | password | test_logging.rs:47:11:47:34 | MacroExpr | provenance | | -| test_logging.rs:48:24:48:47 | MacroExpr | test_logging.rs:48:5:48:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:48:24:48:47 | MacroExpr | test_logging.rs:48:5:48:48 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:48:40:48:47 | password | test_logging.rs:48:24:48:47 | MacroExpr | provenance | | -| test_logging.rs:53:12:53:35 | MacroExpr | test_logging.rs:53:5:53:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:53:12:53:35 | MacroExpr | test_logging.rs:53:5:53:36 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:53:28:53:35 | password | test_logging.rs:53:12:53:35 | MacroExpr | provenance | | -| test_logging.rs:55:12:55:48 | MacroExpr | test_logging.rs:55:5:55:49 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:55:12:55:48 | MacroExpr | test_logging.rs:55:5:55:49 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:55:41:55:48 | password | test_logging.rs:55:12:55:48 | MacroExpr | provenance | | -| test_logging.rs:57:12:57:46 | MacroExpr | test_logging.rs:57:5:57:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:57:12:57:46 | MacroExpr | test_logging.rs:57:5:57:47 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:57:39:57:46 | password | test_logging.rs:57:12:57:46 | MacroExpr | provenance | | -| test_logging.rs:58:12:58:33 | MacroExpr | test_logging.rs:58:5:58:34 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:58:12:58:33 | MacroExpr | test_logging.rs:58:5:58:34 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:33 | MacroExpr | provenance | | -| test_logging.rs:59:12:59:35 | MacroExpr | test_logging.rs:59:5:59:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:59:12:59:35 | MacroExpr | test_logging.rs:59:5:59:36 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:59:24:59:31 | password | test_logging.rs:59:12:59:35 | MacroExpr | provenance | | -| test_logging.rs:61:30:61:53 | MacroExpr | test_logging.rs:61:5:61:54 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:61:30:61:53 | MacroExpr | test_logging.rs:61:5:61:54 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:61:46:61:53 | password | test_logging.rs:61:30:61:53 | MacroExpr | provenance | | -| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | test_logging.rs:62:5:62:55 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | | test_logging.rs:62:20:62:28 | &password | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:62:20:62:28 | &password [&ref] | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:62:20:62:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:62:20:62:28 | TupleExpr [tuple.0] | test_logging.rs:62:20:62:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:62:21:62:28 | password | test_logging.rs:62:20:62:28 | &password | provenance | Config | | test_logging.rs:62:21:62:28 | password | test_logging.rs:62:20:62:28 | &password [&ref] | provenance | | -| test_logging.rs:66:24:66:47 | MacroExpr | test_logging.rs:66:5:66:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:66:24:66:47 | MacroExpr | test_logging.rs:66:5:66:48 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:66:40:66:47 | password | test_logging.rs:66:24:66:47 | MacroExpr | provenance | | -| test_logging.rs:68:42:68:65 | MacroExpr | test_logging.rs:68:5:68:66 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:68:42:68:65 | MacroExpr | test_logging.rs:68:5:68:66 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:68:58:68:65 | password | test_logging.rs:68:42:68:65 | MacroExpr | provenance | | -| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | test_logging.rs:69:5:69:67 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | | test_logging.rs:69:18:69:26 | &password | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:69:18:69:26 | &password [&ref] | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:69:18:69:26 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:69:18:69:26 | TupleExpr [tuple.0] | test_logging.rs:69:18:69:26 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:69:19:69:26 | password | test_logging.rs:69:18:69:26 | &password | provenance | Config | | test_logging.rs:69:19:69:26 | password | test_logging.rs:69:18:69:26 | &password [&ref] | provenance | | -| test_logging.rs:73:23:73:46 | MacroExpr | test_logging.rs:73:5:73:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:73:23:73:46 | MacroExpr | test_logging.rs:73:5:73:47 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:73:39:73:46 | password | test_logging.rs:73:23:73:46 | MacroExpr | provenance | | -| test_logging.rs:75:41:75:64 | MacroExpr | test_logging.rs:75:5:75:65 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:75:41:75:64 | MacroExpr | test_logging.rs:75:5:75:65 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:75:57:75:64 | password | test_logging.rs:75:41:75:64 | MacroExpr | provenance | | -| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | test_logging.rs:76:5:76:51 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | | test_logging.rs:76:20:76:28 | &password | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:76:20:76:28 | &password [&ref] | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:76:20:76:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:76:20:76:28 | TupleExpr [tuple.0] | test_logging.rs:76:20:76:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:76:21:76:28 | password | test_logging.rs:76:20:76:28 | &password | provenance | Config | | test_logging.rs:76:21:76:28 | password | test_logging.rs:76:20:76:28 | &password [&ref] | provenance | | -| test_logging.rs:77:23:77:46 | MacroExpr | test_logging.rs:77:5:77:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:77:23:77:46 | MacroExpr | test_logging.rs:77:5:77:47 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:77:39:77:46 | password | test_logging.rs:77:23:77:46 | MacroExpr | provenance | | -| test_logging.rs:83:20:83:43 | MacroExpr | test_logging.rs:83:5:83:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:83:20:83:43 | MacroExpr | test_logging.rs:83:5:83:44 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:83:36:83:43 | password | test_logging.rs:83:20:83:43 | MacroExpr | provenance | | -| test_logging.rs:85:38:85:61 | MacroExpr | test_logging.rs:85:5:85:62 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:85:38:85:61 | MacroExpr | test_logging.rs:85:5:85:62 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:85:54:85:61 | password | test_logging.rs:85:38:85:61 | MacroExpr | provenance | | -| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | -| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | test_logging.rs:86:5:86:48 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | | test_logging.rs:86:20:86:28 | &password | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:86:20:86:28 | &password [&ref] | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:86:20:86:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:86:20:86:28 | TupleExpr [tuple.0] | test_logging.rs:86:20:86:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:86:21:86:28 | password | test_logging.rs:86:20:86:28 | &password | provenance | Config | | test_logging.rs:86:21:86:28 | password | test_logging.rs:86:20:86:28 | &password [&ref] | provenance | | -| test_logging.rs:87:20:87:43 | MacroExpr | test_logging.rs:87:5:87:44 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:87:20:87:43 | MacroExpr | test_logging.rs:87:5:87:44 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:87:36:87:43 | password | test_logging.rs:87:20:87:43 | MacroExpr | provenance | | | test_logging.rs:94:9:94:10 | m1 | test_logging.rs:95:11:95:28 | MacroExpr | provenance | | | test_logging.rs:94:14:94:22 | &password | test_logging.rs:94:9:94:10 | m1 | provenance | | | test_logging.rs:94:15:94:22 | password | test_logging.rs:94:14:94:22 | &password | provenance | Config | -| test_logging.rs:95:11:95:28 | MacroExpr | test_logging.rs:95:5:95:29 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:95:11:95:28 | MacroExpr | test_logging.rs:95:5:95:29 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:97:9:97:10 | m2 | test_logging.rs:98:11:98:18 | MacroExpr | provenance | | | test_logging.rs:97:41:97:49 | &password | test_logging.rs:97:9:97:10 | m2 | provenance | | | test_logging.rs:97:42:97:49 | password | test_logging.rs:97:41:97:49 | &password | provenance | Config | -| test_logging.rs:98:11:98:18 | MacroExpr | test_logging.rs:98:5:98:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:98:11:98:18 | MacroExpr | test_logging.rs:98:5:98:19 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:100:9:100:10 | m3 | test_logging.rs:101:11:101:18 | MacroExpr | provenance | | | test_logging.rs:100:14:100:46 | res | test_logging.rs:100:22:100:45 | { ... } | provenance | | | test_logging.rs:100:22:100:45 | ...::format(...) | test_logging.rs:100:14:100:46 | res | provenance | | | test_logging.rs:100:22:100:45 | ...::must_use(...) | test_logging.rs:100:9:100:10 | m3 | provenance | | -| test_logging.rs:100:22:100:45 | MacroExpr | test_logging.rs:100:22:100:45 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:100:22:100:45 | { ... } | test_logging.rs:100:22:100:45 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:100:22:100:45 | MacroExpr | test_logging.rs:100:22:100:45 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:100:22:100:45 | { ... } | test_logging.rs:100:22:100:45 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:100:38:100:45 | password | test_logging.rs:100:22:100:45 | MacroExpr | provenance | | -| test_logging.rs:101:11:101:18 | MacroExpr | test_logging.rs:101:5:101:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:119:12:119:41 | MacroExpr | test_logging.rs:119:5:119:42 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:101:11:101:18 | MacroExpr | test_logging.rs:101:5:101:19 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:119:12:119:41 | MacroExpr | test_logging.rs:119:5:119:42 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:119:28:119:41 | get_password(...) | test_logging.rs:119:12:119:41 | MacroExpr | provenance | | | test_logging.rs:130:9:130:10 | t1 [tuple.1] | test_logging.rs:132:28:132:29 | t1 [tuple.1] | provenance | | | test_logging.rs:130:14:130:33 | TupleExpr [tuple.1] | test_logging.rs:130:9:130:10 | t1 [tuple.1] | provenance | | | test_logging.rs:130:25:130:32 | password | test_logging.rs:130:14:130:33 | TupleExpr [tuple.1] | provenance | | -| test_logging.rs:132:12:132:31 | MacroExpr | test_logging.rs:132:5:132:32 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:132:12:132:31 | MacroExpr | test_logging.rs:132:5:132:32 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:132:28:132:29 | t1 [tuple.1] | test_logging.rs:132:28:132:31 | t1.1 | provenance | | | test_logging.rs:132:28:132:31 | t1.1 | test_logging.rs:132:12:132:31 | MacroExpr | provenance | | +| test_logging.rs:171:33:171:79 | &... | test_logging.rs:171:22:171:31 | log_expect | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:171:33:171:79 | &... [&ref] | test_logging.rs:171:22:171:31 | log_expect | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:171:34:171:79 | MacroExpr | test_logging.rs:171:33:171:79 | &... | provenance | Config | +| test_logging.rs:171:34:171:79 | MacroExpr | test_logging.rs:171:33:171:79 | &... [&ref] | provenance | | +| test_logging.rs:171:34:171:79 | res | test_logging.rs:171:42:171:78 | { ... } | provenance | | +| test_logging.rs:171:42:171:78 | ...::format(...) | test_logging.rs:171:34:171:79 | res | provenance | | +| test_logging.rs:171:42:171:78 | ...::must_use(...) | test_logging.rs:171:34:171:79 | MacroExpr | provenance | | +| test_logging.rs:171:42:171:78 | MacroExpr | test_logging.rs:171:42:171:78 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:171:42:171:78 | { ... } | test_logging.rs:171:42:171:78 | ...::must_use(...) | provenance | MaD:17 | +| test_logging.rs:171:70:171:78 | password2 | test_logging.rs:171:42:171:78 | MacroExpr | provenance | | +| test_logging.rs:175:35:175:81 | &... | test_logging.rs:175:24:175:33 | log_expect | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:175:35:175:81 | &... [&ref] | test_logging.rs:175:24:175:33 | log_expect | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:175:36:175:81 | MacroExpr | test_logging.rs:175:35:175:81 | &... | provenance | Config | +| test_logging.rs:175:36:175:81 | MacroExpr | test_logging.rs:175:35:175:81 | &... [&ref] | provenance | | +| test_logging.rs:175:36:175:81 | res | test_logging.rs:175:44:175:80 | { ... } | provenance | | +| test_logging.rs:175:44:175:80 | ...::format(...) | test_logging.rs:175:36:175:81 | res | provenance | | +| test_logging.rs:175:44:175:80 | ...::must_use(...) | test_logging.rs:175:36:175:81 | MacroExpr | provenance | | +| test_logging.rs:175:44:175:80 | MacroExpr | test_logging.rs:175:44:175:80 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:175:44:175:80 | { ... } | test_logging.rs:175:44:175:80 | ...::must_use(...) | provenance | MaD:17 | +| test_logging.rs:175:72:175:80 | password2 | test_logging.rs:175:44:175:80 | MacroExpr | provenance | | +| test_logging.rs:182:9:182:19 | err_result3 [Err] | test_logging.rs:183:13:183:23 | err_result3 [Err] | provenance | | +| test_logging.rs:182:47:182:60 | Err(...) [Err] | test_logging.rs:182:9:182:19 | err_result3 [Err] | provenance | | +| test_logging.rs:182:51:182:59 | password2 | test_logging.rs:182:47:182:60 | Err(...) [Err] | provenance | | +| test_logging.rs:183:13:183:23 | err_result3 [Err] | test_logging.rs:183:25:183:34 | log_unwrap | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:187:12:187:37 | MacroExpr | test_logging.rs:187:5:187:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:187:30:187:37 | password | test_logging.rs:187:12:187:37 | MacroExpr | provenance | | | test_logging.rs:188:14:188:37 | MacroExpr | test_logging.rs:188:5:188:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | @@ -183,37 +210,37 @@ edges | test_logging.rs:203:34:203:66 | res | test_logging.rs:203:42:203:65 | { ... } | provenance | | | test_logging.rs:203:34:203:75 | ... .as_str() | test_logging.rs:203:27:203:32 | expect | provenance | MaD:1 Sink:MaD:1 | | test_logging.rs:203:42:203:65 | ...::format(...) | test_logging.rs:203:34:203:66 | res | provenance | | -| test_logging.rs:203:42:203:65 | ...::must_use(...) | test_logging.rs:203:34:203:75 | ... .as_str() | provenance | MaD:12 | -| test_logging.rs:203:42:203:65 | MacroExpr | test_logging.rs:203:42:203:65 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:203:42:203:65 | { ... } | test_logging.rs:203:42:203:65 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:203:42:203:65 | ...::must_use(...) | test_logging.rs:203:34:203:75 | ... .as_str() | provenance | MaD:15 | +| test_logging.rs:203:42:203:65 | MacroExpr | test_logging.rs:203:42:203:65 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:203:42:203:65 | { ... } | test_logging.rs:203:42:203:65 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:203:58:203:65 | password | test_logging.rs:203:42:203:65 | MacroExpr | provenance | | | test_logging.rs:209:36:209:70 | res | test_logging.rs:209:44:209:69 | { ... } | provenance | | | test_logging.rs:209:36:209:81 | ... .as_bytes() | test_logging.rs:209:30:209:34 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:209:44:209:69 | ...::format(...) | test_logging.rs:209:36:209:70 | res | provenance | | -| test_logging.rs:209:44:209:69 | ...::must_use(...) | test_logging.rs:209:36:209:81 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:209:44:209:69 | MacroExpr | test_logging.rs:209:44:209:69 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:209:44:209:69 | { ... } | test_logging.rs:209:44:209:69 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:209:44:209:69 | ...::must_use(...) | test_logging.rs:209:36:209:81 | ... .as_bytes() | provenance | MaD:14 | +| test_logging.rs:209:44:209:69 | MacroExpr | test_logging.rs:209:44:209:69 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:209:44:209:69 | { ... } | test_logging.rs:209:44:209:69 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:209:62:209:69 | password | test_logging.rs:209:44:209:69 | MacroExpr | provenance | | | test_logging.rs:210:40:210:74 | res | test_logging.rs:210:48:210:73 | { ... } | provenance | | | test_logging.rs:210:40:210:85 | ... .as_bytes() | test_logging.rs:210:30:210:38 | write_all | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:210:48:210:73 | ...::format(...) | test_logging.rs:210:40:210:74 | res | provenance | | -| test_logging.rs:210:48:210:73 | ...::must_use(...) | test_logging.rs:210:40:210:85 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:210:48:210:73 | MacroExpr | test_logging.rs:210:48:210:73 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:210:48:210:73 | { ... } | test_logging.rs:210:48:210:73 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:210:48:210:73 | ...::must_use(...) | test_logging.rs:210:40:210:85 | ... .as_bytes() | provenance | MaD:14 | +| test_logging.rs:210:48:210:73 | MacroExpr | test_logging.rs:210:48:210:73 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:210:48:210:73 | { ... } | test_logging.rs:210:48:210:73 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:210:66:210:73 | password | test_logging.rs:210:48:210:73 | MacroExpr | provenance | | | test_logging.rs:213:15:213:49 | res | test_logging.rs:213:23:213:48 | { ... } | provenance | | | test_logging.rs:213:15:213:60 | ... .as_bytes() | test_logging.rs:213:9:213:13 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:213:23:213:48 | ...::format(...) | test_logging.rs:213:15:213:49 | res | provenance | | -| test_logging.rs:213:23:213:48 | ...::must_use(...) | test_logging.rs:213:15:213:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:213:23:213:48 | MacroExpr | test_logging.rs:213:23:213:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:213:23:213:48 | { ... } | test_logging.rs:213:23:213:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:213:23:213:48 | ...::must_use(...) | test_logging.rs:213:15:213:60 | ... .as_bytes() | provenance | MaD:14 | +| test_logging.rs:213:23:213:48 | MacroExpr | test_logging.rs:213:23:213:48 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:213:23:213:48 | { ... } | test_logging.rs:213:23:213:48 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:213:41:213:48 | password | test_logging.rs:213:23:213:48 | MacroExpr | provenance | | | test_logging.rs:216:15:216:49 | res | test_logging.rs:216:23:216:48 | { ... } | provenance | | | test_logging.rs:216:15:216:60 | ... .as_bytes() | test_logging.rs:216:9:216:13 | write | provenance | MaD:4 Sink:MaD:4 | | test_logging.rs:216:23:216:48 | ...::format(...) | test_logging.rs:216:15:216:49 | res | provenance | | -| test_logging.rs:216:23:216:48 | ...::must_use(...) | test_logging.rs:216:15:216:60 | ... .as_bytes() | provenance | MaD:11 | -| test_logging.rs:216:23:216:48 | MacroExpr | test_logging.rs:216:23:216:48 | ...::format(...) | provenance | MaD:13 | -| test_logging.rs:216:23:216:48 | { ... } | test_logging.rs:216:23:216:48 | ...::must_use(...) | provenance | MaD:14 | +| test_logging.rs:216:23:216:48 | ...::must_use(...) | test_logging.rs:216:15:216:60 | ... .as_bytes() | provenance | MaD:14 | +| test_logging.rs:216:23:216:48 | MacroExpr | test_logging.rs:216:23:216:48 | ...::format(...) | provenance | MaD:16 | +| test_logging.rs:216:23:216:48 | { ... } | test_logging.rs:216:23:216:48 | ...::must_use(...) | provenance | MaD:17 | | test_logging.rs:216:41:216:48 | password | test_logging.rs:216:23:216:48 | MacroExpr | provenance | | models | 1 | Sink: lang:core; ::expect; log-injection; Argument[0] | @@ -224,12 +251,15 @@ models | 6 | Sink: lang:std; ::write_all; log-injection; Argument[0] | | 7 | Sink: lang:std; crate::io::stdio::_eprint; log-injection; Argument[0] | | 8 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | -| 9 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[1] | -| 10 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[3] | -| 11 | Summary: lang:alloc; ::as_bytes; Argument[self]; ReturnValue; value | -| 12 | Summary: lang:alloc; ::as_str; Argument[self]; ReturnValue; value | -| 13 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint | -| 14 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | +| 9 | Sink: repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err; ::log_expect; log-injection; Argument[0] | +| 10 | Sink: repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err; ::log_expect; log-injection; Argument[0] | +| 11 | Sink: repo:https://github.com/DesmondWillowbrook/rs-log_err:log_err; ::log_unwrap; log-injection; Argument[self].Field[crate::result::Result::Err(0)] | +| 12 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[1] | +| 13 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[3] | +| 14 | Summary: lang:alloc; ::as_bytes; Argument[self]; ReturnValue; value | +| 15 | Summary: lang:alloc; ::as_str; Argument[self]; ReturnValue; value | +| 16 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint | +| 17 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:43:5:43:36 | ...::log | semmle.label | ...::log | | test_logging.rs:43:12:43:35 | MacroExpr | semmle.label | MacroExpr | @@ -352,6 +382,31 @@ nodes | test_logging.rs:132:12:132:31 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:132:28:132:29 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | | test_logging.rs:132:28:132:31 | t1.1 | semmle.label | t1.1 | +| test_logging.rs:171:22:171:31 | log_expect | semmle.label | log_expect | +| test_logging.rs:171:33:171:79 | &... | semmle.label | &... | +| test_logging.rs:171:33:171:79 | &... [&ref] | semmle.label | &... [&ref] | +| test_logging.rs:171:34:171:79 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:171:34:171:79 | res | semmle.label | res | +| test_logging.rs:171:42:171:78 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:171:42:171:78 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:171:42:171:78 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:171:42:171:78 | { ... } | semmle.label | { ... } | +| test_logging.rs:171:70:171:78 | password2 | semmle.label | password2 | +| test_logging.rs:175:24:175:33 | log_expect | semmle.label | log_expect | +| test_logging.rs:175:35:175:81 | &... | semmle.label | &... | +| test_logging.rs:175:35:175:81 | &... [&ref] | semmle.label | &... [&ref] | +| test_logging.rs:175:36:175:81 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:175:36:175:81 | res | semmle.label | res | +| test_logging.rs:175:44:175:80 | ...::format(...) | semmle.label | ...::format(...) | +| test_logging.rs:175:44:175:80 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| test_logging.rs:175:44:175:80 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:175:44:175:80 | { ... } | semmle.label | { ... } | +| test_logging.rs:175:72:175:80 | password2 | semmle.label | password2 | +| test_logging.rs:182:9:182:19 | err_result3 [Err] | semmle.label | err_result3 [Err] | +| test_logging.rs:182:47:182:60 | Err(...) [Err] | semmle.label | Err(...) [Err] | +| test_logging.rs:182:51:182:59 | password2 | semmle.label | password2 | +| test_logging.rs:183:13:183:23 | err_result3 [Err] | semmle.label | err_result3 [Err] | +| test_logging.rs:183:25:183:34 | log_unwrap | semmle.label | log_unwrap | | test_logging.rs:187:5:187:38 | ...::_print | semmle.label | ...::_print | | test_logging.rs:187:12:187:37 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:187:30:187:37 | password | semmle.label | password | diff --git a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs index 6202bcaa2f4b..d22453cbb3a4 100644 --- a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs +++ b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs @@ -168,19 +168,19 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { // test `log_expect` on `Option` with sensitive message let none_opt: Option = None; - let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ MISSING: Alert[rust/cleartext-logging] + let _ = none_opt.log_expect(&format!("Failed with password: {}", password2)); // $ Alert[rust/cleartext-logging] // test `log_expect` on `Result` with sensitive message let err_result: Result = Err(""); - let _ = err_result.log_expect(&format!("Failed with password: {}", password2)); // $ MISSING: Alert[rust/cleartext-logging] + let _ = err_result.log_expect(&format!("Failed with password: {}", password2)); // $ Alert[rust/cleartext-logging] // test `log_expect` with sensitive `Result.Err` let err_result2: Result = Err(password2.clone()); let _ = err_result2.log_expect(""); // $ MISSING: Alert[rust/cleartext-logging] // test `log_unwrap` with sensitive `Result.Err` - let err_result3: Result = Err(password2); - let _ = err_result3.log_unwrap(); // $ MISSING: Alert[rust/cleartext-logging] + let err_result3: Result = Err(password2); // $ Source=err_result3 + let _ = err_result3.log_unwrap(); // $ Alert[rust/cleartext-logging]=err_result3 } fn test_std(password: String, i: i32, opt_i: Option) {