From ed3f3b59c8aa84edee1dd3868a19edde1f642b8b Mon Sep 17 00:00:00 2001 From: Herman Venter Date: Fri, 28 Jul 2023 23:04:17 -0700 Subject: [PATCH] Update MIRAI to work with latest nightly (#1228) * nightly-2023-05-16 * nightly-2023-05-23 * nightly-2023-05-30 * nightly-2023-06-06 * nightly-2023-06-13 * nightly-2023-06-20 * nightly-2023-06-27 * nightly-2023-07-04 * nightly-2023-07-11 * nightly-2023-07-18 * nightly-2023-07-28 --- Cargo.lock | 325 ++++++++------------ Cargo.toml | 1 + binaries/summary_store.tar | Bin 3215360 -> 2991104 bytes checker/Cargo.toml | 2 +- checker/src/block_visitor.rs | 252 ++++++++------- checker/src/body_visitor.rs | 90 +++--- checker/src/call_visitor.rs | 81 ++--- checker/src/callbacks.rs | 4 +- checker/src/constant_domain.rs | 7 +- checker/src/crate_visitor.rs | 5 +- checker/src/expression.rs | 2 +- checker/src/fixed_point_visitor.rs | 4 +- checker/src/main.rs | 21 +- checker/src/options.rs | 33 +- checker/src/path.rs | 4 +- checker/src/summaries.rs | 2 +- checker/src/type_visitor.rs | 250 ++++++++------- checker/src/utils.rs | 39 +-- checker/tests/call_graph/fnptr_fold.rs | 12 +- checker/tests/call_graph/static_fold.rs | 12 +- checker/tests/integration_tests.rs | 18 +- checker/tests/run-pass/crate_traversal.rs | 1 + rust-toolchain.toml | 2 +- standard_contracts/src/foreign_contracts.rs | 47 ++- 24 files changed, 609 insertions(+), 605 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78f5e42d..9da89a6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -48,11 +48,11 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.64.0" +version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags", + "bitflags 2.3.3", "cexpr", "clang-sys", "lazy_static", @@ -63,7 +63,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 1.0.109", + "syn 2.0.27", ] [[package]] @@ -72,6 +72,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "byteorder" version = "1.4.3" @@ -80,27 +86,27 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "camino" -version = "1.1.4" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" dependencies = [ "serde", ] [[package]] name = "cargo-platform" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" -version = "0.15.4" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" dependencies = [ "camino", "cargo-platform", @@ -149,7 +155,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_lex", "indexmap", "strsim 0.10.0", @@ -218,9 +224,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", @@ -231,9 +237,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -275,9 +281,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "env_logger" @@ -300,7 +306,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -315,12 +321,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "filetime" @@ -331,7 +334,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -367,9 +370,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -399,18 +402,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "humantime" @@ -443,43 +437,31 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", + "hermit-abi 0.3.2", "rustix", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "lazy_static" @@ -495,9 +477,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.144" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libloading" @@ -511,15 +493,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -527,12 +509,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "log-derive" @@ -554,9 +533,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] @@ -600,7 +579,7 @@ dependencies = [ [[package]] name = "mirai-annotations" -version = "1.12.0" +version = "1.12.1" [[package]] name = "mirai-standard-contracts" @@ -621,19 +600,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.2", "libc", ] [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "parking_lot" @@ -684,18 +663,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -758,7 +737,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -767,14 +746,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" dependencies = [ "aho-corasick", "memchr", @@ -783,9 +774,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "rpds" @@ -811,23 +802,22 @@ checksum = "8ba09476327c4b70ccefb6180f046ef588c26a24cf5d269a9feba316eb4f029f" [[package]] name = "rustix" -version = "0.37.19" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -840,44 +830,44 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.162" +version = "1.0.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +checksum = "60363bdd39a7be0266a520dab25fdc9241d2f987b08a01e01f0ec6d06a981348" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.162" +version = "1.0.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +checksum = "f28482318d6641454cb273da158647922d1be6b5a2fcc6165cd89ebdd7ed576b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -926,9 +916,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "static_assertions" @@ -961,9 +951,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -986,9 +976,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" dependencies = [ "filetime", "libc", @@ -997,15 +987,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1025,22 +1015,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1060,9 +1050,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "untrustworthy_inputs" @@ -1125,132 +1115,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" @@ -1268,8 +1192,9 @@ dependencies = [ [[package]] name = "z3-sys" -version = "0.7.1" -source = "git+https://github.com/prove-rs/z3.rs.git#691ac9782f361969e87ac745a3d9a6816593741a" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cf70fdbc0de3f42b404f49b0d4686a82562254ea29ff0a155eef2f5430f4b0" dependencies = [ "bindgen", "cmake", diff --git a/Cargo.toml b/Cargo.toml index fcf37e5b..220e2643 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "annotations", diff --git a/binaries/summary_store.tar b/binaries/summary_store.tar index d0a128c46e775b5b8abb88efeaff3a9e2ba96207..1f5a336930c0ef011df8ab16a9a46ab22b9339f4 100644 GIT binary patch delta 50145 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

5R0zhW0**`#1qHewTK1dUU~l@j8dVP-_4Bjy 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

d7^MBkMB@~|SXJV_(nTR$_ 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

??o(wTq7lXTC? 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 Kne68sntuV~nHhTk diff --git a/checker/Cargo.toml b/checker/Cargo.toml index 02137195..bcb57037 100644 --- a/checker/Cargo.toml +++ b/checker/Cargo.toml @@ -49,7 +49,7 @@ shellwords = "*" sled = "*" tar = "0.4.38" tempfile = "*" -z3-sys = { version = "*", git="https://github.com/prove-rs/z3.rs.git", features = ["static-link-z3"], optional = true } +z3-sys = { version = "*", features = ["static-link-z3"], optional = true } [dev-dependencies] walkdir = "*" diff --git a/checker/src/block_visitor.rs b/checker/src/block_visitor.rs index f41b1bbe..4fd5e735 100644 --- a/checker/src/block_visitor.rs +++ b/checker/src/block_visitor.rs @@ -15,12 +15,12 @@ use rustc_hir::def_id::DefId; use rustc_index::{Idx, IndexVec}; use rustc_middle::mir; use rustc_middle::mir::interpret::{alloc_range, ConstValue, GlobalAlloc, Scalar}; -use rustc_middle::ty::adjustment::PointerCast; +use rustc_middle::ty::adjustment::PointerCoercion; use rustc_middle::ty::layout::LayoutCx; -use rustc_middle::ty::subst::{GenericArg, SubstsRef}; use rustc_middle::ty::{ Const, FloatTy, IntTy, ParamConst, ScalarInt, Ty, TyKind, UintTy, ValTree, VariantDef, }; +use rustc_middle::ty::{GenericArg, GenericArgsRef}; use rustc_target::abi::{FieldIdx, Primitive, TagEncoding, VariantIdx, Variants}; use crate::abstract_value; @@ -299,14 +299,15 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com place, target, unwind, - } => self.visit_drop(place, *target, *unwind), + replace, + } => self.visit_drop(place, *target, *unwind, *replace), mir::TerminatorKind::Call { func, args, destination, target, unwind, - from_hir_call, + call_source, fn_span, } => self.visit_call( func, @@ -314,7 +315,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com *destination, *target, *unwind, - *from_hir_call, + *call_source, fn_span, ), mir::TerminatorKind::Assert { @@ -369,8 +370,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com span, format!( "unknown tag type for constant-time verification: {tag_name}", - ) - .as_str(), + ), ); self.bv.emit_diagnostic(warning); } @@ -477,7 +477,12 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com place: &mir::Place<'tcx>, target: mir::BasicBlock, unwind: mir::UnwindAction, + // The `replace` flag indicates whether this terminator was created as part of an assignment. + // This should only be used for diagnostic purposes, and does not have any operational + // meaning. + _replace: bool, ) { + let tcx = self.bv.cv.tcx; let place_path = self.get_path_for_place(place); let path = place_path.canonicalize(&self.bv.current_environment); let mut ty = self @@ -492,24 +497,20 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com self.type_visitor_mut() .set_path_rustc_type(path.clone(), ty); - if let TyKind::Adt(def, substs) = ty.kind() { - if let Some(destructor) = self.bv.tcx.adt_destructor(def.did()) { - let actual_argument_types = vec![self - .bv - .cv - .tcx - .mk_mut_ref(self.bv.cv.tcx.lifetimes.re_static, ty)]; + if let TyKind::Adt(def, args) = ty.kind() { + if let Some(destructor) = tcx.adt_destructor(def.did()) { + let actual_argument_types = vec![Ty::new_mut_ref(tcx, tcx.lifetimes.re_static, ty)]; let callee_generic_arguments = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); let callee_generic_argument_map = self.type_visitor().get_generic_arguments_map( def.did(), callee_generic_arguments, &actual_argument_types, ); - let fun_ty = self.bv.tcx.type_of(destructor.did).skip_binder(); + let fun_ty = tcx.type_of(destructor.did).skip_binder(); let func_const = self - .visit_function_reference(destructor.did, fun_ty, Some(substs)) + .visit_function_reference(destructor.did, fun_ty, Some(args)) .clone(); let func_to_call = Rc::new(func_const.clone().into()); let ref_to_path_value = AbstractValue::make_reference(path.clone()); @@ -579,7 +580,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com /// reused across function calls without duplicating the contents. /// * `destination` - Destination for the return value. If some, the call returns a value. /// * `unwind` - Work to be done if the call unwinds. - /// * `from_hir_call` - Whether this is from a call in HIR, rather than from an overloaded + /// * `call_source` - Where this call came from in HIR/THIR. /// operator. True for overloaded function call. #[allow(clippy::too_many_arguments)] #[logfn_inputs(TRACE)] @@ -590,7 +591,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com destination: mir::Place<'tcx>, target: Option, unwind: mir::UnwindAction, - from_hir_call: bool, + _call_source: mir::CallSource, fn_span: &rustc_span::Span, ) { // This offset is used to distinguish any local variables that leak out from the called function @@ -631,15 +632,15 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com let callee_def_id = func_ref_to_call .def_id .expect("callee obtained via operand should have def id"); - let substs = self + let generic_args = self .bv .cv - .substs_cache + .generic_args_cache .get(&callee_def_id) .expect("MIR should ensure this"); let mut callee_generic_arguments = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); + .specialize_generic_args(generic_args, &self.type_visitor().generic_argument_map); let actual_args: Vec<(Rc, Rc)> = args .iter() .map(|arg| (self.get_operand_path(arg), self.visit_operand(arg))) @@ -676,8 +677,8 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com // might not be specialized enough. if !actual_argument_types.is_empty() && !utils::are_concrete(callee_generic_arguments) { let fty = self.bv.tcx.type_of(callee_def_id).skip_binder(); - if let TyKind::FnDef(_, substs) = fty.kind() { - for (i, generic_ty_arg) in substs.types().enumerate() { + if let TyKind::FnDef(_, args) = fty.kind() { + for (i, generic_ty_arg) in args.types().enumerate() { if let TyKind::Param(t_par) = generic_ty_arg.kind() { if t_par.name.as_str() == "Self" { let mut gen_args: Vec> = @@ -686,7 +687,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com .type_visitor() .get_dereferenced_type(actual_argument_types[0]) .into(); - callee_generic_arguments = self.bv.tcx.mk_substs(&gen_args); + callee_generic_arguments = self.bv.tcx.mk_args(&gen_args); break; } } @@ -1010,29 +1011,29 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com ); if let TyKind::Alias( rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, + rustc_middle::ty::AliasTy { def_id, args, .. }, ) = specialized_closure_ty.kind() { - let substs = self + let args = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); - self.bv.cv.substs_cache.insert(*def_id, substs); + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); + self.bv.cv.generic_args_cache.insert(*def_id, args); let closure_ty = self.bv.tcx.type_of(*def_id).skip_binder(); let map = self .type_visitor() - .get_generic_arguments_map(*def_id, substs, &[]); + .get_generic_arguments_map(*def_id, args, &[]); specialized_closure_ty = self .type_visitor() .specialize_generic_argument_type(closure_ty, &map); } match specialized_closure_ty.kind() { - TyKind::Closure(def_id, substs) - | TyKind::Generator(def_id, substs, _) - | TyKind::FnDef(def_id, substs) => { + TyKind::Closure(def_id, args) + | TyKind::Generator(def_id, args, _) + | TyKind::FnDef(def_id, args) => { return extract_func_ref(self.visit_function_reference( *def_id, specialized_closure_ty, - Some(substs), + Some(args), )); } TyKind::Ref(_, ty, _) => { @@ -1041,13 +1042,13 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com *ty, &self.type_visitor().generic_argument_map, ); - if let TyKind::Closure(def_id, substs) | TyKind::FnDef(def_id, substs) = + if let TyKind::Closure(def_id, args) | TyKind::FnDef(def_id, args) = specialized_closure_ty.kind() { return extract_func_ref(self.visit_function_reference( *def_id, specialized_closure_ty, - Some(substs), + Some(args), )); } if let TyKind::Dynamic(..) = specialized_closure_ty.kind() { @@ -1158,7 +1159,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com .bv .cv .session - .struct_span_warn(span, diagnostic.as_ref()); + .struct_span_warn(span, diagnostic.as_ref().to_string()); for pc_span in precondition.spans.iter() { let snippet = self.bv.tcx.sess.source_map().span_to_snippet(*pc_span); if snippet.is_ok() { @@ -1317,7 +1318,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com ) { let span = self.bv.current_span.source_callsite(); - let warning = self.bv.cv.session.struct_span_warn(span, warning.as_str()); + let warning = self.bv.cv.session.struct_span_warn(span, warning.clone()); self.bv.emit_diagnostic(warning); } } @@ -1405,10 +1406,9 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com value_name, if checking_presence { "may not" } else { "may" }, tag_name - ) - .as_str(), + ), ); - self.bv.emit_diagnostic(warning); + self.bv.emit_diagnostic(warning.clone()); } else if promotable_entry_condition.is_none() || tag_check.extract_promotable_disjuncts(false).is_none() { @@ -1419,10 +1419,9 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com "the {value_name} may have a {tag_name} tag, \ and the tag check cannot be promoted as a precondition, \ because it contains local variables", - ) - .as_str(), + ), ); - self.bv.emit_diagnostic(warning); + self.bv.emit_diagnostic(warning.clone()); } } @@ -1430,10 +1429,11 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com // The existence of the tag on the value is different from the expectation. // In this case, report an error. let span = self.bv.current_span.source_callsite(); - let warning = self.bv.cv.session.struct_span_warn( - span, - format!("the {value_name} has a {tag_name} tag").as_str(), - ); + let warning = self + .bv + .cv + .session + .struct_span_warn(span, format!("the {value_name} has a {tag_name} tag")); self.bv.emit_diagnostic(warning); } @@ -1539,7 +1539,8 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com if entry_cond_as_bool.unwrap_or(false) { let error = get_assert_msg_description(msg); let span = self.bv.current_span; - let warning = self.bv.cv.session.struct_span_warn(span, error); + let warning = + self.bv.cv.session.struct_span_warn(span, error.to_string()); self.bv.emit_diagnostic(warning); // No need to push a precondition, the caller can never satisfy it. return; @@ -1573,7 +1574,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com // Can't make this the caller's problem. let warning = format!("possible {}", get_assert_msg_description(msg)); let span = self.bv.current_span; - let warning = self.bv.cv.session.struct_span_warn(span, warning.as_str()); + let warning = self.bv.cv.session.struct_span_warn(span, warning); self.bv.emit_diagnostic(warning); return; } @@ -1888,10 +1889,13 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com // To look up box.0.0 we need the type of the thin pointer, which we // derive from target_type (which is known to be a slice pointer). let deref_ty = self.type_visitor().get_dereferenced_type(target_type); - let thin_ptr_ty = self.bv.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: deref_ty, - mutbl: rustc_hir::Mutability::Not, - }); + let thin_ptr_ty = Ty::new_ptr( + self.bv.tcx, + rustc_middle::ty::TypeAndMut { + ty: deref_ty, + mutbl: rustc_hir::Mutability::Not, + }, + ); let ptr_val = self .bv .lookup_path_and_refine_result(qualifier.clone(), thin_ptr_ty); @@ -2063,7 +2067,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com | mir::CastKind::PointerFromExposedAddress // All sorts of pointer-to-pointer casts. Note that reference-to-raw-ptr casts are // translated into `&raw mut/const *r`, i.e., they are not actually casts. - | mir::CastKind::Pointer(..) + | mir::CastKind::PointerCoercion(..) // Cast into a dyn* object. | mir::CastKind::DynStar => { // The value remains unchanged, but pointers may be fat, so use copy_or_move_elements @@ -2082,7 +2086,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com return; } }; - if matches!(cast_kind, mir::CastKind::Pointer(PointerCast::Unsize)){ + if matches!(cast_kind, mir::CastKind::PointerCoercion(PointerCoercion::Unsize)){ // Unsize a pointer/reference value, e.g., `&[T; n]` to // `&[T]`. Note that the source could be a thin or fat pointer. // This will do things like convert thin pointers to fat @@ -2141,7 +2145,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com return; } let mut source_path = self.visit_rh_place(place); - if matches!(cast_kind, mir::CastKind::Pointer(PointerCast::ClosureFnPointer(_))){ + if matches!(cast_kind, mir::CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(_))){ source_path = Path::new_function(source_path) } self.bv @@ -2248,6 +2252,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com let right = self.visit_operand(right_operand); let mut result = match bin_op { mir::BinOp::Add => left.addition(right), + mir::BinOp::AddUnchecked => left.addition(right), mir::BinOp::BitAnd => left.bit_and(right), mir::BinOp::BitOr => left.bit_or(right), mir::BinOp::BitXor => left.bit_xor(right), @@ -2258,6 +2263,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com mir::BinOp::Le => left.less_or_equal(right), mir::BinOp::Lt => left.less_than(right), mir::BinOp::Mul => left.multiply(right), + mir::BinOp::MulUnchecked => left.multiply(right), mir::BinOp::Ne => left.not_equals(right), mir::BinOp::Offset => { let r = left.offset(right); @@ -2266,8 +2272,11 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } mir::BinOp::Rem => left.remainder(right), mir::BinOp::Shl => left.shift_left(right), + mir::BinOp::ShlUnchecked => left.shift_left(right), mir::BinOp::Shr => left.shr(right), + mir::BinOp::ShrUnchecked => left.shr(right), mir::BinOp::Sub => left.subtract(right), + mir::BinOp::SubUnchecked => left.subtract(right), }; if let Expression::BitAnd { left, right } = &result.expression { if right.expression.is_memory_reference() { @@ -2528,7 +2537,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com self.visit_use(index_path, operand); } } - mir::AggregateKind::Adt(def, variant_idx, substs, _, case_index) => { + mir::AggregateKind::Adt(def, variant_idx, args, _, case_index) => { let mut path = path; let adt_def = self.bv.tcx.adt_def(def); let variant_def = &adt_def.variants()[*variant_idx]; @@ -2557,7 +2566,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com let case_index = case_index.unwrap_or(0usize.into()); let field_path = Path::new_union_field(path, case_index.into(), num_cases); let field = &variant_def.fields[case_index]; - let field_ty = field.ty(self.bv.tcx, substs); + let field_ty = field.ty(self.bv.tcx, args); self.type_visitor_mut() .set_path_rustc_type(field_path.clone(), field_ty); self.visit_use(field_path, &operands[0usize.into()]); @@ -2569,7 +2578,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } for (i, field) in variant_def.fields.iter().enumerate() { let field_path = Path::new_field(path.clone(), i); - let field_ty = field.ty(self.bv.tcx, substs); + let field_ty = field.ty(self.bv.tcx, args); self.type_visitor_mut() .set_path_rustc_type(field_path.clone(), field_ty); if let Some(operand) = operands.get(i.into()) { @@ -2582,10 +2591,10 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } } } - mir::AggregateKind::Closure(def_id, substs) - | mir::AggregateKind::Generator(def_id, substs, _) => { + mir::AggregateKind::Closure(def_id, args) + | mir::AggregateKind::Generator(def_id, args, _) => { let ty = self.bv.tcx.type_of(*def_id).skip_binder(); - let func_const = self.visit_function_reference(*def_id, ty, Some(substs)); + let func_const = self.visit_function_reference(*def_id, ty, Some(args)); let func_val = Rc::new(func_const.clone().into()); self.bv.update_value_at(path.clone(), func_val); for (i, operand) in operands.iter().enumerate() { @@ -2704,23 +2713,22 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com ) -> Rc { let mut def_id = unevaluated.def; let def_ty = self.bv.cv.tcx.type_of(def_id); - let substs = self.type_visitor().specialize_substs( - unevaluated.substs, - &self.type_visitor().generic_argument_map, - ); - self.bv.cv.substs_cache.insert(def_id, substs); + let args = self + .type_visitor() + .specialize_generic_args(unevaluated.args, &self.type_visitor().generic_argument_map); + self.bv.cv.generic_args_cache.insert(def_id, args); let path = match unevaluated.promoted { Some(promoted) => { let index = promoted.index(); Rc::new(PathEnum::PromotedConstant { ordinal: index }.into()) } None => { - if !substs.is_empty() { + if !args.is_empty() { let param_env = rustc_middle::ty::ParamEnv::reveal_all(); trace!("devirtualize resolving def_id {:?}: {:?}", def_id, def_ty); - trace!("substs {:?}", substs); + trace!("args {:?}", args); if let Ok(Some(instance)) = - rustc_middle::ty::Instance::resolve(self.bv.tcx, param_env, def_id, substs) + rustc_middle::ty::Instance::resolve(self.bv.tcx, param_env, def_id, args) { def_id = instance.def.def_id(); trace!("resolved it to {:?}", def_id); @@ -2731,7 +2739,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } else if self.bv.cv.known_names_cache.get(self.bv.tcx, def_id) == KnownNames::AllocRawVecMinNonZeroCap { - if let Ok(ty_and_layout) = self.type_visitor().layout_of(substs.type_at(0)) { + if let Ok(ty_and_layout) = self.type_visitor().layout_of(args.type_at(0)) { if !ty_and_layout.is_unsized() { let size_of_t = ty_and_layout.layout.size().bytes(); let min_non_zero_cap: u128 = if size_of_t == 1 { @@ -2772,13 +2780,15 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com /// Synthesizes a MIRAI constant value from a RustC constant as used in the type system #[logfn_inputs(TRACE)] pub fn visit_const(&mut self, literal: &Const<'tcx>) -> Rc { - let mut val = literal.kind(); + let mut kind = literal.kind(); let lty = literal.ty(); - if let rustc_middle::ty::ConstKind::Unevaluated(_unevaluated) = &val { - val = val.eval(self.bv.tcx, self.type_visitor().get_param_env()); + if let rustc_middle::ty::ConstKind::Unevaluated(_unevaluated) = &kind { + kind = literal + .eval(self.bv.tcx, self.type_visitor().get_param_env()) + .kind(); } - match &val { + match &kind { // A const generic parameter. rustc_middle::ty::ConstKind::Param(ParamConst { index, .. }) => { if let Some(gen_args) = self.type_visitor().generic_arguments { @@ -2788,7 +2798,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } assume_unreachable!( "reference to unmatched generic constant argument {:?} {:?} {:?}", - val, + kind, self.type_visitor().generic_arguments, self.bv.current_span ); @@ -2810,7 +2820,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com heap_block } _ => { - debug!("val {:?}", val); + debug!("kind {:?}", kind); Rc::new(ConstantDomain::Unimplemented.into()) } } @@ -2833,14 +2843,14 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com fn deserialize_fields( &mut self, - substs: SubstsRef<'tcx>, + args: GenericArgsRef<'tcx>, mut val_tree_iter: std::slice::Iter>, heap_path: Rc, variant: &VariantDef, ) { for (i, field) in variant.fields.iter().enumerate() { let field_path = Path::new_field(heap_path.clone(), i); - let field_ty = field.ty(self.bv.tcx, substs); + let field_ty = field.ty(self.bv.tcx, args); if let Some(val_tree) = val_tree_iter.next() { self.deserialize_val_tree(val_tree, field_path, field_ty); } else { @@ -2862,7 +2872,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com self.bv.update_value_at(target_path, const_value); } ValTree::Branch(val_trees) => match ty.kind() { - TyKind::Adt(def, substs) if def.is_enum() => { + TyKind::Adt(def, args) if def.is_enum() => { let mut val_tree_iter = val_trees.iter(); let variant_index = if let Some(ValTree::Leaf(scalar_int)) = val_tree_iter.next() { @@ -2874,15 +2884,15 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com ); }; let variant = &def.variants()[variant_index]; - self.deserialize_fields(substs, val_tree_iter, target_path, variant); + self.deserialize_fields(args, val_tree_iter, target_path, variant); } TyKind::Adt(def, _) if def.is_union() => { debug!("Did not expect to a serialized union value {:?}", def); } - TyKind::Adt(def, substs) => { + TyKind::Adt(def, args) => { let val_tree_iter = val_trees.iter(); let variant = &def.variants()[VariantIdx::new(0)]; - self.deserialize_fields(substs, val_tree_iter, target_path, variant); + self.deserialize_fields(args, val_tree_iter, target_path, variant); } TyKind::Tuple(types) => { let mut val_tree_iter = val_trees.iter(); @@ -2997,12 +3007,12 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } Some(GlobalAlloc::Function(instance)) => { let def_id = instance.def.def_id(); - let substs = self.type_visitor().specialize_substs( - instance.substs, + let args = self.type_visitor().specialize_generic_args( + instance.args, &self.type_visitor().generic_argument_map, ); let fn_ty = self.bv.tcx.type_of(def_id).skip_binder(); - self.bv.cv.substs_cache.insert(def_id, substs); + self.bv.cv.generic_args_cache.insert(def_id, args); let fun_val = Rc::new( self.bv .cv @@ -3010,7 +3020,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com .get_function_constant_for( def_id, fn_ty, - Some(substs), + Some(args), self.bv.tcx, &mut self.bv.cv.known_names_cache, &mut self.bv.cv.summary_cache, @@ -3153,8 +3163,8 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com self.type_visitor_mut() .set_path_rustc_type(target_path.clone(), ty); match ty.kind() { - TyKind::Adt(def, substs) if def.is_enum() => { - trace!("deserializing {:?} {:?}", def, substs); + TyKind::Adt(def, args) if def.is_enum() => { + trace!("deserializing {:?} {:?}", def, args); trace!("def.repr() {:?}", def.repr()); let mut bytes_left_to_deserialize = bytes; if let Ok(enum_ty_layout) = self.type_visitor().layout_of(ty) { @@ -3199,7 +3209,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com trace!("deserializing field({}) {:?}", i, field); trace!("bytes_left_deserialize {:?}", bytes_left_to_deserialize); let field_path = Path::new_field(target_path.clone(), i); - let field_ty = field.ty(self.bv.tcx, substs); + let field_ty = field.ty(self.bv.tcx, args); trace!( "field ty layout {:?}", self.type_visitor().layout_of(field_ty) @@ -3214,8 +3224,8 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } bytes_left_to_deserialize } - TyKind::Adt(def, substs) => { - trace!("deserializing {:?} {:?}", def, substs); + TyKind::Adt(def, args) => { + trace!("deserializing {:?} {:?}", def, args); let mut bytes_left_to_deserialize = bytes; for variant in def.variants().iter() { trace!("deserializing variant {:?}", variant); @@ -3224,7 +3234,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com trace!("deserializing field({}) {:?}", i, field); trace!("bytes_left_deserialize {:?}", bytes_left_to_deserialize); let field_path = Path::new_field(target_path.clone(), i); - let field_ty = field.ty(self.bv.tcx, substs); + let field_ty = field.ty(self.bv.tcx, args); trace!( "field ty layout {:?}", self.type_visitor().layout_of(field_ty) @@ -3307,7 +3317,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com &bytes[size..] }, TyKind::Uint(UintTy::U8) => unsafe { - let uint_ptr = bytes.as_ptr() as *const u8; + let uint_ptr = bytes.as_ptr(); let u = self.bv.get_u128_const_val((*uint_ptr) as u128); self.bv.update_value_at(target_path, u); &bytes[1..] @@ -3401,22 +3411,22 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } // todo: bytes is the serialization of the captured state of a closure/generator // deserialize that and return an heap block that represents the closure state + func ptr - TyKind::Closure(def_id, substs) - | TyKind::FnDef(def_id, substs) - | TyKind::Generator(def_id, substs, ..) + TyKind::Closure(def_id, args) + | TyKind::FnDef(def_id, args) + | TyKind::Generator(def_id, args, ..) | TyKind::Alias( rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, + rustc_middle::ty::AliasTy { def_id, args, .. }, ) => { let specialized_ty = self.type_visitor().specialize_generic_argument_type( ty, &self.type_visitor().generic_argument_map, ); - let substs = self + let specialized_args = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); let func_val = Rc::new( - self.visit_function_reference(*def_id, specialized_ty, Some(substs)) + self.visit_function_reference(*def_id, specialized_ty, Some(specialized_args)) .clone() .into(), ); @@ -3604,9 +3614,9 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com TyKind::Adt(adt_def, _) => adt_def .discriminants(self.bv.tcx) .find(|(_, var)| var.val == data), - TyKind::Generator(def_id, substs, _) => { - let substs = substs.as_generator(); - substs + TyKind::Generator(def_id, args, _) => { + let generator = args.as_generator(); + generator .discriminants(*def_id, self.bv.tcx) .find(|(_, var)| var.val == data) } @@ -3705,39 +3715,43 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com } TyKind::Uint(..) => self.bv.cv.constant_value_cache.get_u128_for(data), TyKind::RawPtr(..) => self.bv.cv.constant_value_cache.get_u128_for(data), - TyKind::Closure(def_id, substs) => { + TyKind::Closure(def_id, args) => { let specialized_ty = self.type_visitor().specialize_generic_argument_type( ty, &self.type_visitor().generic_argument_map, ); - let substs = self + let specialized_args = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); - if substs.len() >= 3 { - let tuple_ty = substs.last().unwrap().expect_ty(); + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); + if specialized_args.len() >= 3 { + let tuple_ty = specialized_args.last().unwrap().expect_ty(); let cv = self.get_constant_value_from_scalar(tuple_ty, data, size); let cp = Path::get_as_path(cv); let fr = self - .visit_function_reference(*def_id, specialized_ty, Some(substs)) + .visit_function_reference( + *def_id, + specialized_ty, + Some(specialized_args), + ) .clone(); let fv = Rc::::new(fr.into()); let fp = Path::get_as_path(fv.clone()); self.bv.copy_or_move_elements(fp, cp, tuple_ty, true); return fv; } else { - unreachable!("substs for closure not right {:?}", substs); + unreachable!("args for closure not right {:?}", specialized_args); } } - TyKind::FnDef(def_id, substs) => { + TyKind::FnDef(def_id, args) => { debug_assert!(size == 0 && data == 0); let specialized_ty = self.type_visitor().specialize_generic_argument_type( ty, &self.type_visitor().generic_argument_map, ); - let substs = self + let specialized_args = self .type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map); - self.visit_function_reference(*def_id, specialized_ty, Some(substs)) + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); + self.visit_function_reference(*def_id, specialized_ty, Some(specialized_args)) } _ => { let bytes = &data.to_ne_bytes()[0..size]; @@ -3780,11 +3794,11 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com &mut self, def_id: DefId, ty: Ty<'tcx>, - generic_args: Option>, + generic_args: Option>, ) -> &ConstantDomain { //todo: is def_id unique enough? Perhaps add ty? if let Some(generic_args) = generic_args { - self.bv.cv.substs_cache.insert(def_id, generic_args); + self.bv.cv.generic_args_cache.insert(def_id, generic_args); } self.bv.cv.constant_value_cache.get_function_constant_for( def_id, @@ -3924,7 +3938,7 @@ impl<'block, 'analysis, 'compilation, 'tcx> BlockVisitor<'block, 'analysis, 'com let func_const = self.visit_function_reference( *def_id, ty, - Some(generic_args.as_closure().substs), + Some(generic_args.as_closure().args), ); let func_val = Rc::new(func_const.clone().into()); self.bv diff --git a/checker/src/body_visitor.rs b/checker/src/body_visitor.rs index db351abd..2febdab9 100644 --- a/checker/src/body_visitor.rs +++ b/checker/src/body_visitor.rs @@ -17,8 +17,7 @@ use mirai_annotations::*; use rustc_errors::DiagnosticBuilder; use rustc_hir::def_id::DefId; use rustc_middle::mir; -use rustc_middle::ty::subst::SubstsRef; -use rustc_middle::ty::{AdtDef, Const, Ty, TyCtxt, TyKind, TypeAndMut, UintTy}; +use rustc_middle::ty::{AdtDef, Const, GenericArgsRef, Ty, TyCtxt, TyKind, TypeAndMut, UintTy}; use crate::abstract_value::{self, AbstractValue, AbstractValueTrait, BOTTOM}; use crate::block_visitor::BlockVisitor; @@ -295,7 +294,7 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { let dominators = self.mir.basic_blocks.dominators(); for (location1, callee_defid1) in self.block_to_call.iter() { for (location2, callee_defid2) in self.block_to_call.iter() { - if location1 != location2 && location1.dominates(*location2, &dominators) { + if location1 != location2 && location1.dominates(*location2, dominators) { self.cv.call_graph.add_dom(*callee_defid1, *callee_defid2); } } @@ -634,7 +633,7 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { if self.active_calls_map.contains_key(&def_id) { return; } - let generic_args = self.cv.substs_cache.get(&def_id).cloned(); + let generic_args = self.cv.generic_args_cache.get(&def_id).cloned(); let callee_generic_argument_map = if let Some(generic_args) = generic_args { self.type_visitor() .get_generic_arguments_map(def_id, generic_args, &[]) @@ -1723,13 +1722,13 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { let union_type = self .type_visitor() .get_path_rustc_type(qualifier, self.current_span); - if let TyKind::Adt(def, substs) = union_type.kind() { - let substs = self + if let TyKind::Adt(def, args) = union_type.kind() { + let args = self .type_visitor - .specialize_substs(substs, &self.type_visitor().generic_argument_map); + .specialize_generic_args(args, &self.type_visitor().generic_argument_map); for (i, field) in def.all_fields().enumerate() { let target_type = self.type_visitor().specialize_generic_argument_type( - field.ty(self.tcx, substs), + field.ty(self.tcx, args), &self.type_visitor().generic_argument_map, ); let target_path = Path::new_union_field(qualifier.clone(), i, *num_cases); @@ -1794,7 +1793,7 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { fn add_leaf_fields_for<'a>( path: Rc, def: &'a AdtDef, - substs: SubstsRef<'a>, + args: GenericArgsRef<'a>, tcx: TyCtxt<'a>, accumulator: &mut Vec<(Rc, Ty<'a>)>, ) { @@ -1823,9 +1822,9 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { let variant = def.variants().iter().next().expect("at least one variant"); for (i, field) in variant.fields.iter().enumerate() { let field_path = Path::new_field(path.clone(), i); - let field_ty = field.ty(tcx, substs); - if let TyKind::Adt(def, substs) = field_ty.kind() { - add_leaf_fields_for(field_path, def, substs, tcx, accumulator) + let field_ty = field.ty(tcx, args); + if let TyKind::Adt(def, args) = field_ty.kind() { + add_leaf_fields_for(field_path, def, args, tcx, accumulator) } else { accumulator.push((field_path, field_ty)) } @@ -1860,16 +1859,17 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { s_path = Path::new_field(s_path, 0); ty = self.type_visitor().remove_transparent_wrapper(ty); } - let source_rustc_type = self - .tcx - .mk_ref(*region, rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }); + let source_rustc_type = Ty::new_ref( + self.tcx, + *region, + rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }, + ); let s_ref_val = AbstractValue::make_reference(s_path); let source_path = Path::new_computed(s_ref_val); if self.type_visitor.is_slice_pointer(source_rustc_type.kind()) { let pointer_path = Path::new_field(source_path.clone(), 0); - let pointer_type = self - .tcx - .mk_ptr(rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }); + let pointer_type = + Ty::new_ptr(self.tcx, rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }); source_fields.push((pointer_path, pointer_type)); let len_path = Path::new_length(source_path); source_fields.push((len_path, self.tcx.types.usize)); @@ -1890,10 +1890,13 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { _ => { if self.type_visitor.is_slice_pointer(source_rustc_type.kind()) { let pointer_path = Path::new_field(source_path.clone(), 0); - let pointer_type = self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.type_visitor.get_element_type(source_rustc_type), - mutbl: rustc_hir::Mutability::Not, - }); + let pointer_type = Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.type_visitor.get_element_type(source_rustc_type), + mutbl: rustc_hir::Mutability::Not, + }, + ); source_fields.push((pointer_path, pointer_type)); let len_path = Path::new_length(source_path); source_fields.push((len_path, self.tcx.types.usize)); @@ -1932,9 +1935,11 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { t_path = Path::new_field(t_path, 0); ty = self.type_visitor().remove_transparent_wrapper(ty); } - let target_rustc_type = self - .tcx - .mk_ref(*region, rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }); + let target_rustc_type = Ty::new_ref( + self.tcx, + *region, + rustc_middle::ty::TypeAndMut { ty, mutbl: *mutbl }, + ); let t_ref_val = AbstractValue::make_reference(t_path); let target_path = Path::new_computed(t_ref_val); if self @@ -1942,10 +1947,13 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { .is_slice_pointer(target_rustc_type.kind()) { let pointer_path = Path::new_field(target_path.clone(), 0); - let pointer_type = self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.type_visitor.get_element_type(target_rustc_type), - mutbl: rustc_hir::Mutability::Not, - }); + let pointer_type = Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.type_visitor.get_element_type(target_rustc_type), + mutbl: rustc_hir::Mutability::Not, + }, + ); target_fields.push((pointer_path, pointer_type)); let len_path = Path::new_length(target_path); target_fields.push((len_path, self.tcx.types.usize)); @@ -1969,10 +1977,13 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { .is_slice_pointer(target_rustc_type.kind()) { let pointer_path = Path::new_field(target_path.clone(), 0); - let pointer_type = self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.type_visitor.get_element_type(target_rustc_type), - mutbl: rustc_hir::Mutability::Not, - }); + let pointer_type = Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.type_visitor.get_element_type(target_rustc_type), + mutbl: rustc_hir::Mutability::Not, + }, + ); target_fields.push((pointer_path, pointer_type)); let len_path = Path::new_length(target_path); target_fields.push((len_path, self.tcx.types.usize)); @@ -2662,18 +2673,19 @@ impl<'analysis, 'compilation, 'tcx> BodyVisitor<'analysis, 'compilation, 'tcx> { let union_type = self .type_visitor() .get_path_rustc_type(qualifier, self.current_span); - if let TyKind::Adt(def, substs) = union_type.kind() { - let substs = self - .type_visitor - .specialize_substs(substs, &self.type_visitor().generic_argument_map); + if let TyKind::Adt(def, args) = union_type.kind() { + let generic_args = self.type_visitor.specialize_generic_args( + args, + &self.type_visitor().generic_argument_map, + ); let source_field = def.all_fields().nth(*case_index).unwrap(); let source_type = self.type_visitor().specialize_generic_argument_type( - source_field.ty(self.tcx, substs), + source_field.ty(self.tcx, generic_args), &self.type_visitor().generic_argument_map, ); for (i, field) in def.all_fields().enumerate() { let target_type = self.type_visitor().specialize_generic_argument_type( - field.ty(self.tcx, substs), + field.ty(self.tcx, generic_args), &self.type_visitor().generic_argument_map, ); let target_path = diff --git a/checker/src/call_visitor.rs b/checker/src/call_visitor.rs index 4628c8b5..0d500404 100644 --- a/checker/src/call_visitor.rs +++ b/checker/src/call_visitor.rs @@ -12,8 +12,7 @@ use log_derive::*; use mirai_annotations::*; use rustc_hir::def_id::DefId; use rustc_middle::mir; -use rustc_middle::ty::subst::{GenericArg, GenericArgKind, SubstsRef}; -use rustc_middle::ty::{Ty, TyKind, UintTy}; +use rustc_middle::ty::{GenericArg, GenericArgKind, GenericArgsRef, Ty, TyKind, UintTy}; use rustc_target::abi::VariantIdx; use crate::abstract_value::{AbstractValue, AbstractValueTrait}; @@ -38,7 +37,7 @@ pub struct CallVisitor<'call, 'block, 'analysis, 'compilation, 'tcx> { pub callee_def_id: DefId, pub callee_func_ref: Option>, pub callee_fun_val: Rc, - pub callee_generic_arguments: Option>, + pub callee_generic_arguments: Option>, pub callee_known_name: KnownNames, pub callee_generic_argument_map: Option>>, pub unwind: mir::UnwindAction, @@ -63,7 +62,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> pub(crate) fn new( block_visitor: &'call mut BlockVisitor<'block, 'analysis, 'compilation, 'tcx>, callee_def_id: DefId, - callee_generic_arguments: Option>, + callee_generic_arguments: Option>, callee_generic_argument_map: Option>>, environment_before_call: Environment, func_const: ConstantDomain, @@ -244,7 +243,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> let resolved_ty = tcx.type_of(resolved_def_id).skip_binder(); let resolved_map = self.type_visitor().get_generic_arguments_map( resolved_def_id, - instance.substs, + instance.args, &[], ); let specialized_resolved_ty = self @@ -260,7 +259,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> .visit_function_reference( resolved_def_id, specialized_resolved_ty, - Some(instance.substs), + Some(instance.args), ) .clone(); self.callee_func_ref = if let ConstantDomain::Function(fr) = &func_const { @@ -270,10 +269,10 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> None }; self.callee_fun_val = Rc::new(func_const.into()); - self.callee_generic_arguments = Some(instance.substs); + self.callee_generic_arguments = Some(instance.args); self.callee_generic_argument_map = self.type_visitor().get_generic_arguments_map( resolved_def_id, - instance.substs, + instance.args, &self.actual_argument_types, ); if has_mir && specialized_resolved_ty.is_closure() { @@ -285,7 +284,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> .insert(0, (Path::new_parameter(1), self.callee_fun_val.clone())); self.actual_argument_types.insert( 0, - tcx.mk_mut_ref(tcx.lifetimes.re_static, specialized_resolved_ty), + Ty::new_mut_ref(tcx, tcx.lifetimes.re_static, specialized_resolved_ty), ); } } @@ -666,7 +665,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> fn handled_clone(&mut self) -> bool { precondition!(self.actual_argument_types.len() == 1); if let TyKind::Ref(_, t, _) = self.actual_argument_types[0].kind() { - if let TyKind::Adt(def, substs) = t.kind() { + if let TyKind::Adt(def, args) = t.kind() { if def.variants().is_empty() { return false; } @@ -707,9 +706,11 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> { // The caller might be able to avoid the diagnostic because it // knows the actual argument whereas here we only know the type. - let specialized_substs = self - .type_visitor() - .specialize_substs(substs, &self.callee_generic_argument_map); + let specialized_substs = + self.type_visitor().specialize_generic_args( + args, + &self.callee_generic_argument_map, + ); if !utils::are_concrete(specialized_substs) { // The clone method will not resolve, but we don't want visit_caller // to issue a diagnostic because is_zero might refine to true @@ -942,7 +943,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> .bv .cv .session - .struct_span_warn(span, msg.as_ref()); + .struct_span_warn(span, msg.to_string()); self.block_visitor.bv.emit_diagnostic(warning); } else { // If we see an unconditional panic inside a standard contract summary, @@ -967,7 +968,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> .bv .cv .session - .struct_span_warn(span, msg.as_str()); + .struct_span_warn(span, msg.to_string()); self.block_visitor.bv.emit_diagnostic(warning); } return; @@ -1015,7 +1016,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> .bv .cv .session - .struct_span_warn(span, msg.as_ref()); + .struct_span_warn(span, msg.to_string()); self.block_visitor.bv.emit_diagnostic(warning); } else { // Since the assertion occurs in code that is being used rather than @@ -1090,7 +1091,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> _ => { let warning = self.block_visitor.bv.cv.session.struct_span_warn( self.block_visitor.bv.current_span, - warning.as_ref(), + warning.to_string(), ); self.block_visitor.bv.emit_diagnostic(warning); } @@ -1254,7 +1255,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> ); // decl.ty is not type specialized actual_argument_types[0] = - tcx.mk_mut_ref(tcx.lifetimes.re_static, callee_ty); + Ty::new_mut_ref(tcx, tcx.lifetimes.re_static, callee_ty); } } } @@ -1266,31 +1267,35 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> // Get the generic argument map for the indirectly called function let generic_arguments = match callee_ty.kind() { - TyKind::Closure(_, substs) => Some(self.type_visitor().specialize_substs( - substs.as_closure().substs, + TyKind::Closure(_, args) => Some(self.type_visitor().specialize_generic_args( + args.as_closure().args, &self.type_visitor().generic_argument_map, )), - TyKind::Generator(_, substs, _) => Some(self.type_visitor().specialize_substs( - substs.as_generator().substs, + TyKind::Generator(_, args, _) => Some(self.type_visitor().specialize_generic_args( + args.as_generator().args, &self.type_visitor().generic_argument_map, )), - TyKind::FnDef(_, substs) - | TyKind::Alias( - rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { substs, .. }, - ) => Some( - self.type_visitor() - .specialize_substs(substs, &self.type_visitor().generic_argument_map), - ), - _ => self.block_visitor.bv.cv.substs_cache.get(&def_id).cloned(), + TyKind::FnDef(_, args) + | TyKind::Alias(rustc_middle::ty::Opaque, rustc_middle::ty::AliasTy { args, .. }) => { + Some( + self.type_visitor().specialize_generic_args( + args, + &self.type_visitor().generic_argument_map, + ), + ) + } + _ => self + .block_visitor + .bv + .cv + .generic_args_cache + .get(&def_id) + .cloned(), }; - let argument_map = if let Some(substs) = generic_arguments { - self.type_visitor().get_generic_arguments_map( - def_id, - substs, - &actual_argument_types, - ) + let argument_map = if let Some(args) = generic_arguments { + self.type_visitor() + .get_generic_arguments_map(def_id, args, &actual_argument_types) } else { None }; @@ -1505,7 +1510,7 @@ impl<'call, 'block, 'analysis, 'compilation, 'tcx> format!( "the macro {} expects its first argument to be a reference to a non-reference value", if checking_presence { "has_tag! " } else { "does_not_have_tag!" }, - ).as_str(), + ), ); self.block_visitor.bv.emit_diagnostic(warning); } diff --git a/checker/src/callbacks.rs b/checker/src/callbacks.rs index 371b0b3c..a95654a5 100644 --- a/checker/src/callbacks.rs +++ b/checker/src/callbacks.rs @@ -18,6 +18,7 @@ use log_derive::*; use rustc_driver::Compilation; use rustc_interface::{interface, Queries}; use rustc_middle::ty::TyCtxt; +use rustc_session::EarlyErrorHandler; use std::cell::RefCell; use std::collections::HashMap; use std::fmt::{Debug, Formatter, Result}; @@ -97,6 +98,7 @@ impl rustc_driver::Callbacks for MiraiCallbacks { #[logfn(TRACE)] fn after_analysis<'tcx>( &mut self, + _early_error_handler: &EarlyErrorHandler, compiler: &interface::Compiler, queries: &'tcx Queries<'tcx>, ) -> Compilation { @@ -160,7 +162,7 @@ impl MiraiCallbacks { known_names_cache: KnownNamesCache::create_cache_from_language_items(), options: &std::mem::take(&mut self.options), session: compiler.session(), - substs_cache: HashMap::new(), + generic_args_cache: HashMap::new(), summary_cache: PersistentSummaryCache::new(tcx, summary_store_path), tcx, test_run: self.test_run, diff --git a/checker/src/constant_domain.rs b/checker/src/constant_domain.rs index 8d660ad4..ac060491 100644 --- a/checker/src/constant_domain.rs +++ b/checker/src/constant_domain.rs @@ -13,8 +13,7 @@ use serde::{Deserialize, Serialize}; use mirai_annotations::*; use rustc_hir::def_id::DefId; -use rustc_middle::ty::subst::SubstsRef; -use rustc_middle::ty::{Ty, TyCtxt}; +use rustc_middle::ty::{GenericArgsRef, Ty, TyCtxt}; use crate::expression::{Expression, ExpressionType}; use crate::known_names::{KnownNames, KnownNamesCache}; @@ -114,7 +113,7 @@ impl ConstantDomain { pub fn for_function<'a, 'tcx>( function_id: usize, def_id: DefId, - generic_args: Option>, + generic_args: Option>, tcx: TyCtxt<'tcx>, known_names_cache: &mut KnownNamesCache, summary_cache: &mut PersistentSummaryCache<'tcx>, @@ -1260,7 +1259,7 @@ impl<'tcx> ConstantValueCache<'tcx> { &mut self, def_id: DefId, ty: Ty<'tcx>, - generic_args: Option>, + generic_args: Option>, tcx: TyCtxt<'tcx>, known_names_cache: &mut KnownNamesCache, summary_cache: &mut PersistentSummaryCache<'tcx>, diff --git a/checker/src/crate_visitor.rs b/checker/src/crate_visitor.rs index 8bd997da..3c383aeb 100644 --- a/checker/src/crate_visitor.rs +++ b/checker/src/crate_visitor.rs @@ -22,8 +22,7 @@ use mirai_annotations::*; use rustc_errors::{Diagnostic, DiagnosticBuilder}; use rustc_hir::def_id::{DefId, DefIndex}; use rustc_middle::mir; -use rustc_middle::ty::subst::SubstsRef; -use rustc_middle::ty::{TyCtxt, UnevaluatedConst}; +use rustc_middle::ty::{GenericArgsRef, TyCtxt, UnevaluatedConst}; use rustc_session::Session; use crate::body_visitor::BodyVisitor; @@ -50,10 +49,10 @@ pub struct CrateVisitor<'compilation, 'tcx> { pub constant_value_cache: ConstantValueCache<'tcx>, pub diagnostics_for: HashMap>>, pub file_name: &'compilation str, + pub generic_args_cache: HashMap>, pub known_names_cache: KnownNamesCache, pub options: &'compilation Options, pub session: &'compilation Session, - pub substs_cache: HashMap>, pub summary_cache: PersistentSummaryCache<'tcx>, pub tcx: TyCtxt<'tcx>, pub type_cache: Rc>>, diff --git a/checker/src/expression.rs b/checker/src/expression.rs index e272df35..2fee3045 100644 --- a/checker/src/expression.rs +++ b/checker/src/expression.rs @@ -1467,7 +1467,7 @@ impl ExpressionType { U128 => tcx.types.u128, Unit => tcx.types.unit, Usize => tcx.types.usize, - ThinPointer => tcx.mk_imm_ptr(tcx.mk_unit()), + ThinPointer => Ty::new_imm_ptr(tcx, tcx.types.unit), NonPrimitive => tcx.types.trait_object_dummy_self, } } diff --git a/checker/src/fixed_point_visitor.rs b/checker/src/fixed_point_visitor.rs index 1480d1b8..101163ae 100644 --- a/checker/src/fixed_point_visitor.rs +++ b/checker/src/fixed_point_visitor.rs @@ -47,7 +47,7 @@ impl<'fixed, 'analysis, 'compilation, 'tcx> body_visitor: &'fixed mut BodyVisitor<'analysis, 'compilation, 'tcx>, ) -> FixedPointVisitor<'fixed, 'analysis, 'compilation, 'tcx> { let dominators = body_visitor.mir.basic_blocks.dominators(); - let (block_indices, loop_anchors) = get_sorted_block_indices(body_visitor.mir, &dominators); + let (block_indices, loop_anchors) = get_sorted_block_indices(body_visitor.mir, dominators); // in_state[bb] is the join (or widening) of the out_state values of each predecessor of bb let mut in_state: HashMap = HashMap::new(); // out_state[bb] is the environment that results from analyzing block bb, given in_state[bb] @@ -64,7 +64,7 @@ impl<'fixed, 'analysis, 'compilation, 'tcx> bv: body_visitor, block_indices, loop_anchors, - dominators, + dominators: dominators.clone(), in_state, out_state, terminator_state, diff --git a/checker/src/main.rs b/checker/src/main.rs index 3ad29e72..dda7dac0 100644 --- a/checker/src/main.rs +++ b/checker/src/main.rs @@ -26,15 +26,16 @@ use mirai::callbacks; use mirai::options::Options; use mirai::utils; use mirai_annotations::*; -use rustc_session::config::ErrorOutputType; -use rustc_session::early_error; use std::env; use std::path::Path; fn main() { + let early_error_handler = + rustc_session::EarlyErrorHandler::new(rustc_session::config::ErrorOutputType::default()); + // Initialize loggers. if env::var("RUSTC_LOG").is_ok() { - rustc_driver::init_rustc_env_logger(); + rustc_driver::init_rustc_env_logger(&early_error_handler); } if env::var("MIRAI_LOG").is_ok() { let e = env_logger::Env::new() @@ -45,7 +46,11 @@ fn main() { // Get any options specified via the MIRAI_FLAGS environment variable let mut options = Options::default(); - let rustc_args = options.parse_from_str(&env::var("MIRAI_FLAGS").unwrap_or_default(), false); + let rustc_args = options.parse_from_str( + &env::var("MIRAI_FLAGS").unwrap_or_default(), + &early_error_handler, + false, + ); info!("MIRAI options from environment: {:?}", options); // Let arguments supplied on the command line override the environment variable. @@ -53,10 +58,8 @@ fn main() { .enumerate() .map(|(i, arg)| { arg.into_string().unwrap_or_else(|arg| { - early_error( - ErrorOutputType::default(), - &format!("Argument {i} is not valid Unicode: {arg:?}"), - ) + early_error_handler + .early_error(format!("Argument {i} is not valid Unicode: {arg:?}")) }) }) .collect::>(); @@ -68,7 +71,7 @@ fn main() { args.remove(1); } - let mut rustc_command_line_arguments = options.parse(&args[1..], false); + let mut rustc_command_line_arguments = options.parse(&args[1..], &early_error_handler, false); info!("MIRAI options modified by command line: {:?}", options); rustc_driver::install_ice_hook(rustc_driver::DEFAULT_BUG_REPORT_URL, |_| ()); diff --git a/checker/src/options.rs b/checker/src/options.rs index d3f7ef80..f9a53751 100644 --- a/checker/src/options.rs +++ b/checker/src/options.rs @@ -7,8 +7,7 @@ use clap::{Arg, Command, ErrorKind}; use itertools::Itertools; use mirai_annotations::*; -use rustc_session::config::ErrorOutputType; -use rustc_session::early_error; +use rustc_session::EarlyErrorHandler; /// Creates the clap::Command metadata for argument parsing. fn make_options_parser<'help>(running_test_harness: bool) -> Command<'help> { @@ -105,21 +104,29 @@ impl Options { /// Parse options from an argument string. The argument string will be split using unix /// shell escaping rules. Any content beyond the leftmost `--` token will be returned /// (excluding this token). - pub fn parse_from_str(&mut self, s: &str, running_test_harness: bool) -> Vec { + pub fn parse_from_str( + &mut self, + s: &str, + handler: &EarlyErrorHandler, + running_test_harness: bool, + ) -> Vec { self.parse( &shellwords::split(s).unwrap_or_else(|e| { - early_error( - ErrorOutputType::default(), - &format!("Cannot parse argument string: {e:?}"), - ) + handler.early_error(format!("Cannot parse argument string: {e:?}")) }), + handler, running_test_harness, ) } /// Parses options from a list of strings. Any content beyond the leftmost `--` token /// will be returned (excluding this token). - pub fn parse(&mut self, args: &[String], running_test_harness: bool) -> Vec { + pub fn parse( + &mut self, + args: &[String], + handler: &EarlyErrorHandler, + running_test_harness: bool, + ) -> Vec { let mut mirai_args_end = args.len(); let mut rustc_args_start = 0; if let Some((p, _)) = args.iter().find_position(|s| s.as_str() == "--") { @@ -187,10 +194,7 @@ impl Options { self.max_analysis_time_for_body = match matches.value_of("body_analysis_timeout") { Some(s) => match s.parse::() { Ok(v) => v, - Err(_) => early_error( - ErrorOutputType::default(), - "--body_analysis_timeout expects an integer", - ), + Err(_) => handler.early_error("--body_analysis_timeout expects an integer"), }, None => assume_unreachable!(), } @@ -199,10 +203,7 @@ impl Options { self.max_analysis_time_for_crate = match matches.value_of("crate_analysis_timeout") { Some(s) => match s.parse::() { Ok(v) => v, - Err(_) => early_error( - ErrorOutputType::default(), - "--crate_analysis_timeout expects an integer", - ), + Err(_) => handler.early_error("--crate_analysis_timeout expects an integer"), }, None => assume_unreachable!(), } diff --git a/checker/src/path.rs b/checker/src/path.rs index ef209e50..cdbc9510 100644 --- a/checker/src/path.rs +++ b/checker/src/path.rs @@ -893,7 +893,9 @@ impl PathRefinement for Rc { } if let PathEnum::Offset { value } = &self.value { - let Expression::Offset { left, right } = &value.expression else {unreachable!()}; + let Expression::Offset { left, right } = &value.expression else { + unreachable!() + }; if let Expression::Variable { path, var_type } = &left.expression { let canonical_left_path = path.canonicalize(environment); let canonical_lef_var = diff --git a/checker/src/summaries.rs b/checker/src/summaries.rs index df3fc508..833e8176 100644 --- a/checker/src/summaries.rs +++ b/checker/src/summaries.rs @@ -346,7 +346,7 @@ fn extract_reachable_heap_allocations( } } } - heap_roots.extend(new_roots.into_iter()); + heap_roots.extend(new_roots); } } diff --git a/checker/src/type_visitor.rs b/checker/src/type_visitor.rs index 28ea002c..9e85d011 100644 --- a/checker/src/type_visitor.rs +++ b/checker/src/type_visitor.rs @@ -15,10 +15,10 @@ use mirai_annotations::*; use rustc_hir::def_id::DefId; use rustc_index::Idx; use rustc_middle::mir; -use rustc_middle::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, SubstsRef}; use rustc_middle::ty::{ AdtDef, Const, ConstKind, ExistentialPredicate, ExistentialProjection, ExistentialTraitRef, - FnSig, ParamTy, Ty, TyCtxt, TyKind, TypeAndMut, + FnSig, GenericArg, GenericArgKind, GenericArgs, GenericArgsRef, ParamTy, Ty, TyCtxt, TyKind, + TypeAndMut, }; use rustc_target::abi::VariantIdx; @@ -42,7 +42,7 @@ impl<'tcx> Default for type_visitor::TypeCache<'tcx> { } impl<'tcx> TypeCache<'tcx> { - /// Provides a way to refer to a rustc_middle::ty::Ty via a handle that does not have + /// Provides a way to refer to a rustc_middle::ty::Ty via a handle that does not have /// a life time specifier. pub fn new() -> TypeCache<'tcx> { TypeCache { @@ -78,7 +78,7 @@ pub struct TypeVisitor<'tcx> { pub closures_being_specialized: RefCell>, pub def_id: DefId, pub generic_argument_map: Option>>, - pub generic_arguments: Option>, + pub generic_arguments: Option>, pub mir: &'tcx mir::Body<'tcx>, path_ty_cache: HashMap, Ty<'tcx>>, pub dummy_untagged_value_type: Ty<'tcx>, @@ -140,9 +140,9 @@ impl<'tcx> TypeVisitor<'tcx> { path_ty = t; } match path_ty.kind() { - TyKind::Closure(_, substs) => { - if utils::are_concrete(substs) { - for (i, ty) in substs.as_closure().upvar_tys().enumerate() { + TyKind::Closure(_, args) => { + if utils::are_concrete(args) { + for (i, ty) in args.as_closure().upvar_tys().enumerate() { let var_type = ExpressionType::from(ty.kind()); let mut qualifier = path.clone(); if is_ref { @@ -158,8 +158,8 @@ impl<'tcx> TypeVisitor<'tcx> { } } } - TyKind::Generator(_, substs, _) => { - for (i, ty) in substs.as_generator().prefix_tys().enumerate() { + TyKind::Generator(_, args, _) => { + for (i, ty) in args.as_generator().prefix_tys().enumerate() { let var_type = ExpressionType::from(ty.kind()); let mut qualifier = path.clone(); if is_ref { @@ -176,9 +176,9 @@ impl<'tcx> TypeVisitor<'tcx> { } TyKind::Alias( rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, + rustc_middle::ty::AliasTy { def_id, args, .. }, ) => { - let map = self.get_generic_arguments_map(*def_id, substs, &[]); + let map = self.get_generic_arguments_map(*def_id, args, &[]); let path_ty = self.specialize_generic_argument_type( self.tcx.type_of(*def_id).skip_binder(), &map, @@ -349,8 +349,7 @@ impl<'tcx> TypeVisitor<'tcx> { if target_type.is_never() { target_type } else { - self.tcx - .mk_imm_ref(self.tcx.lifetimes.re_erased, target_type) + Ty::new_imm_ref(self.tcx, self.tcx.lifetimes.re_erased, target_type) } } Expression::InitialParameterValue { path, .. } @@ -377,10 +376,13 @@ impl<'tcx> TypeVisitor<'tcx> { self.get_type_from_index(*type_index) } } - PathEnum::HeapBlock { .. } => self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.tcx.types.u8, - mutbl: rustc_hir::Mutability::Not, - }), + PathEnum::HeapBlock { .. } => Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.tcx.types.u8, + mutbl: rustc_hir::Mutability::Not, + }, + ), PathEnum::Offset { value } => { if let Expression::Offset { left, .. } = &value.expression { let base_path = Path::get_as_path(left.clone()); @@ -440,7 +442,7 @@ impl<'tcx> TypeVisitor<'tcx> { } match &**selector { PathSelector::ConstantSlice { .. } => { - return self.tcx.mk_imm_ref(self.tcx.lifetimes.re_erased, t); + return Ty::new_imm_ref(self.tcx, self.tcx.lifetimes.re_erased, t); } PathSelector::Function => { return t; @@ -452,10 +454,10 @@ impl<'tcx> TypeVisitor<'tcx> { | PathSelector::Field(ordinal) => { if let TyKind::Alias( rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, + rustc_middle::ty::AliasTy { def_id, args, .. }, ) = &t.kind() { - let map = self.get_generic_arguments_map(*def_id, substs, &[]); + let map = self.get_generic_arguments_map(*def_id, args, &[]); t = self.specialize_generic_argument_type( self.tcx.type_of(*def_id).skip_binder(), &map, @@ -464,17 +466,20 @@ impl<'tcx> TypeVisitor<'tcx> { trace!("opaque type_of {:?}", t); } match t.kind() { - TyKind::Adt(def, substs) => { - return self.get_field_type(def, substs, *ordinal); + TyKind::Adt(def, args) => { + return self.get_field_type(def, args, *ordinal); } TyKind::Array(elem_ty, ..) | TyKind::Slice(elem_ty) => { match *ordinal { 0 => { // Field 0 of a sized array is a raw pointer to the array element type - return self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: *elem_ty, - mutbl: rustc_hir::Mutability::Not, - }); + return Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: *elem_ty, + mutbl: rustc_hir::Mutability::Not, + }, + ); } 1 => { return self.tcx.types.usize; @@ -482,8 +487,8 @@ impl<'tcx> TypeVisitor<'tcx> { _ => {} } } - TyKind::Closure(def_id, substs) => { - let closure_substs = substs.as_closure(); + TyKind::Closure(def_id, args) => { + let closure_substs = args.as_closure(); if closure_substs.is_valid() { return closure_substs .upvar_tys() @@ -497,11 +502,11 @@ impl<'tcx> TypeVisitor<'tcx> { }); } } - TyKind::Generator(def_id, substs, _) => { + TyKind::Generator(def_id, args, _) => { let mut tuple_types = - substs.as_generator().state_tys(*def_id, self.tcx); + args.as_generator().state_tys(*def_id, self.tcx); if let Some(field_tys) = tuple_types.nth(*ordinal) { - return self.tcx.mk_tup_from_iter(field_tys); + return Ty::new_tup_from_iter(self.tcx, field_tys); } info!("generator field not found {:?} {:?}", def_id, ordinal); return self.tcx.types.never; @@ -511,9 +516,9 @@ impl<'tcx> TypeVisitor<'tcx> { // why would getting a field from a closure not need a deref // before the field access? I.e. is a reference to a closure // a sort of fat pointer? - if let TyKind::Closure(def_id, substs) = t.kind() { - if utils::are_concrete(substs) { - return substs + if let TyKind::Closure(def_id, args) = t.kind() { + if utils::are_concrete(args) { + return args .as_closure() .upvar_tys() .nth(*ordinal) @@ -533,10 +538,13 @@ impl<'tcx> TypeVisitor<'tcx> { match *ordinal { 0 => { // Field 0 of a str is a raw pointer to char - return self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.tcx.types.char, - mutbl: rustc_hir::Mutability::Not, - }); + return Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.tcx.types.char, + mutbl: rustc_hir::Mutability::Not, + }, + ); } 1 => { return self.tcx.types.usize; @@ -557,10 +565,13 @@ impl<'tcx> TypeVisitor<'tcx> { match *ordinal { 0 => { // Field 0 of a slice pointer is a raw pointer to the slice element type - return self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: self.get_element_type(t), - mutbl: rustc_hir::Mutability::Mut, - }); + return Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: self.get_element_type(t), + mutbl: rustc_hir::Mutability::Mut, + }, + ); } 1 => { return self.tcx.types.usize; @@ -603,19 +614,19 @@ impl<'tcx> TypeVisitor<'tcx> { while type_visitor::is_transparent_wrapper(t) || matches!(t.kind(), TyKind::Adt(..)) { - if let TyKind::Adt(def, substs) = t.kind() { - let substs = - self.specialize_substs(substs, &self.generic_argument_map); + if let TyKind::Adt(def, args) = t.kind() { + let args = + self.specialize_generic_args(args, &self.generic_argument_map); if !def.is_enum() { // Could be a *&S vs *&S.Field_0 confusion - t = self.get_field_type(def, substs, 0); + t = self.get_field_type(def, args, 0); continue; } if *ordinal < def.variants().len() { let variant = &def.variants()[VariantIdx::new(*ordinal)]; let field_tys = - variant.fields.iter().map(|fd| fd.ty(self.tcx, substs)); - return self.tcx.mk_tup_from_iter(field_tys); + variant.fields.iter().map(|fd| fd.ty(self.tcx, args)); + return Ty::new_tup_from_iter(self.tcx, field_tys); } if !type_visitor::is_transparent_wrapper(t) { break; @@ -637,8 +648,8 @@ impl<'tcx> TypeVisitor<'tcx> { } PathSelector::Slice(_) => { return { - let slice_ty = self.tcx.mk_slice(self.get_element_type(t)); - self.tcx.mk_mut_ref(self.tcx.lifetimes.re_static, slice_ty) + let slice_ty = Ty::new_slice(self.tcx, self.get_element_type(t)); + Ty::new_mut_ref(self.tcx, self.tcx.lifetimes.re_static, slice_ty) }; } PathSelector::TagField => { @@ -708,13 +719,13 @@ impl<'tcx> TypeVisitor<'tcx> { pub fn get_field_type( &self, def: &'tcx AdtDef, - substs: SubstsRef<'tcx>, + args: GenericArgsRef<'tcx>, ordinal: usize, ) -> Ty<'tcx> { for variant in def.variants().iter() { if ordinal < variant.fields.len() { let field = &variant.fields[ordinal.into()]; - let ft = field.ty(self.tcx, substs); + let ft = field.ty(self.tcx, args); trace!("field {:?} type is {:?}", ordinal, ft); return ft; } @@ -746,10 +757,13 @@ impl<'tcx> TypeVisitor<'tcx> { if let Some(ty) = self.path_ty_cache.get(rp) { if ty.is_adt() { let param_path = p.replace_root(arg_path, Path::new_parameter(i + 1)); - let ptr_ty = self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: *ty, - mutbl: rustc_hir::Mutability::Not, - }); + let ptr_ty = Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: *ty, + mutbl: rustc_hir::Mutability::Not, + }, + ); result.insert(param_path, ptr_ty); } } @@ -770,7 +784,7 @@ impl<'tcx> TypeVisitor<'tcx> { pub fn get_generic_arguments_map( &self, def_id: DefId, - generic_args: SubstsRef<'tcx>, + generic_args: GenericArgsRef<'tcx>, actual_argument_types: &[Ty<'tcx>], ) -> Option>> { let mut substitution_map = self.generic_argument_map.clone(); @@ -781,7 +795,7 @@ impl<'tcx> TypeVisitor<'tcx> { // as well. This applies recursively. Note that a child cannot mask the // generic parameters of its parent with one of its own, so each parameter // definition in this iteration will have a unique name. - InternalSubsts::for_item(self.tcx, def_id, |param_def, _| { + GenericArgs::for_item(self.tcx, def_id, |param_def, _| { if let Some(gen_arg) = generic_args.get(param_def.index as usize) { let specialized_gen_arg = self.specialize_generic_argument(*gen_arg, &substitution_map); @@ -868,7 +882,8 @@ impl<'tcx> TypeVisitor<'tcx> { TyKind::Ref(region, ty, mutbl) => { if let TyKind::Param(t_par) = ty.kind() { if t_par.name.as_str() == "Self" && !self.actual_argument_types.is_empty() { - return self.tcx.mk_ref( + return Ty::new_ref( + self.tcx, *region, rustc_middle::ty::TypeAndMut { ty: self.actual_argument_types[0], @@ -927,7 +942,7 @@ impl<'tcx> TypeVisitor<'tcx> { } mir::ProjectionElem::OpaqueCast(ty) => *ty, mir::ProjectionElem::Downcast(_, ordinal) => { - if let TyKind::Adt(def, substs) = base_ty.kind() { + if let TyKind::Adt(def, args) = base_ty.kind() { if ordinal.index() >= def.variants().len() { debug!( "illegally down casting to index {} of {:?} at {:?}", @@ -936,16 +951,16 @@ impl<'tcx> TypeVisitor<'tcx> { current_span ); let variant = &def.variants().iter().last().unwrap(); - let field_tys = variant.fields.iter().map(|fd| fd.ty(self.tcx, substs)); - return self.tcx.mk_tup_from_iter(field_tys); + let field_tys = variant.fields.iter().map(|fd| fd.ty(self.tcx, args)); + return Ty::new_tup_from_iter(self.tcx, field_tys); } let variant = &def.variants()[*ordinal]; - let field_tys = variant.fields.iter().map(|fd| fd.ty(self.tcx, substs)); - return self.tcx.mk_tup_from_iter(field_tys); - } else if let TyKind::Generator(def_id, substs, ..) = base_ty.kind() { - let mut tuple_types = substs.as_generator().state_tys(*def_id, self.tcx); + let field_tys = variant.fields.iter().map(|fd| fd.ty(self.tcx, args)); + return Ty::new_tup_from_iter(self.tcx, field_tys); + } else if let TyKind::Generator(def_id, args, ..) = base_ty.kind() { + let mut tuple_types = args.as_generator().state_tys(*def_id, self.tcx); if let Some(field_tys) = tuple_types.nth(ordinal.index()) { - return self.tcx.mk_tup_from_iter(field_tys); + return Ty::new_tup_from_iter(self.tcx, field_tys); } debug!( "illegally down casting to index {} of {:?} at {:?}", @@ -988,18 +1003,21 @@ impl<'tcx> TypeVisitor<'tcx> { ty: Ty<'tcx>, ) -> std::result::Result< rustc_middle::ty::layout::TyAndLayout<'tcx>, - rustc_middle::ty::layout::LayoutError<'tcx>, + &'tcx rustc_middle::ty::layout::LayoutError<'tcx>, > { let param_env = self.get_param_env(); if utils::is_concrete(ty.kind()) { self.tcx.layout_of(param_env.and(ty)) } else { - Err(rustc_middle::ty::layout::LayoutError::Unknown(ty)) + Err(&*self + .tcx + .arena + .alloc(rustc_middle::ty::layout::LayoutError::Unknown(ty))) } } pub fn remove_transparent_wrapper(&self, ty: Ty<'tcx>) -> Ty<'tcx> { - if let TyKind::Adt(def, substs) = ty.kind() { + if let TyKind::Adt(def, args) = ty.kind() { if def.repr().transparent() { let variant_0 = VariantIdx::from_u32(0); let v = &def.variants()[variant_0]; @@ -1011,7 +1029,7 @@ impl<'tcx> TypeVisitor<'tcx> { !is_zst }); if let Some(f) = non_zst_field { - return f.ty(self.tcx, substs); + return f.ty(self.tcx, args); } } } @@ -1054,7 +1072,7 @@ impl<'tcx> TypeVisitor<'tcx> { // The projection of an associated type. For example, // `>::N`. if let TyKind::Alias(rustc_middle::ty::Projection, projection) = gen_arg_type.kind() { - let specialized_substs = self.specialize_substs(projection.substs, map); + let specialized_substs = self.specialize_generic_args(projection.args, map); let item_def_id = projection.def_id; return if utils::are_concrete(specialized_substs) { let param_env = self @@ -1068,13 +1086,11 @@ impl<'tcx> TypeVisitor<'tcx> { ) { let instance_item_def_id = instance.def.def_id(); if item_def_id == instance_item_def_id { - return self - .tcx - .mk_projection(projection.def_id, specialized_substs); + return Ty::new_projection(self.tcx, projection.def_id, specialized_substs); } let item_type = self.tcx.type_of(instance_item_def_id).skip_binder(); let map = - self.get_generic_arguments_map(instance_item_def_id, instance.substs, &[]); + self.get_generic_arguments_map(instance_item_def_id, instance.args, &[]); if item_type == gen_arg_type && map.is_none() { // Can happen if the projection just adds a life time item_type @@ -1098,15 +1114,16 @@ impl<'tcx> TypeVisitor<'tcx> { gen_arg_type } } else { - self.tcx - .mk_projection(projection.def_id, specialized_substs) + Ty::new_projection(self.tcx, projection.def_id, specialized_substs) }; } if map.is_none() { return gen_arg_type; } match gen_arg_type.kind() { - TyKind::Adt(def, substs) => self.tcx.mk_adt(*def, self.specialize_substs(substs, map)), + TyKind::Adt(def, args) => { + Ty::new_adt(self.tcx, *def, self.specialize_generic_args(args, map)) + } TyKind::Array(elem_ty, len) => { let specialized_elem_ty = self.specialize_generic_argument_type(*elem_ty, map); let specialized_len = self.specialize_const(*len, map); @@ -1115,18 +1132,22 @@ impl<'tcx> TypeVisitor<'tcx> { } TyKind::Slice(elem_ty) => { let specialized_elem_ty = self.specialize_generic_argument_type(*elem_ty, map); - self.tcx.mk_slice(specialized_elem_ty) + Ty::new_slice(self.tcx, specialized_elem_ty) } TyKind::RawPtr(rustc_middle::ty::TypeAndMut { ty, mutbl }) => { let specialized_ty = self.specialize_generic_argument_type(*ty, map); - self.tcx.mk_ptr(rustc_middle::ty::TypeAndMut { - ty: specialized_ty, - mutbl: *mutbl, - }) + Ty::new_ptr( + self.tcx, + rustc_middle::ty::TypeAndMut { + ty: specialized_ty, + mutbl: *mutbl, + }, + ) } TyKind::Ref(region, ty, mutbl) => { let specialized_ty = self.specialize_generic_argument_type(*ty, map); - self.tcx.mk_ref( + Ty::new_ref( + self.tcx, *region, rustc_middle::ty::TypeAndMut { ty: specialized_ty, @@ -1134,9 +1155,9 @@ impl<'tcx> TypeVisitor<'tcx> { }, ) } - TyKind::FnDef(def_id, substs) => self - .tcx - .mk_fn_def(*def_id, self.specialize_substs(substs, map)), + TyKind::FnDef(def_id, args) => { + Ty::new_fn_def(self.tcx, *def_id, self.specialize_generic_args(args, map)) + } TyKind::FnPtr(fn_sig) => { let map_fn_sig = |fn_sig: FnSig<'tcx>| { let specialized_inputs_and_output = self.tcx.mk_type_list_from_iter( @@ -1153,33 +1174,33 @@ impl<'tcx> TypeVisitor<'tcx> { } }; let specialized_fn_sig = fn_sig.map_bound(map_fn_sig); - self.tcx.mk_fn_ptr(specialized_fn_sig) + Ty::new_fn_ptr(self.tcx, specialized_fn_sig) } TyKind::Dynamic(predicates, region, kind) => { let specialized_predicates = predicates.iter().map( |bound_pred: rustc_middle::ty::Binder<'_, ExistentialPredicate<'tcx>>| { bound_pred.map_bound(|pred| match pred { - ExistentialPredicate::Trait(ExistentialTraitRef { def_id, substs }) => { + ExistentialPredicate::Trait(ExistentialTraitRef { def_id, args }) => { ExistentialPredicate::Trait(ExistentialTraitRef { def_id, - substs: self.specialize_substs(substs, map), + args: self.specialize_generic_args(args, map), }) } ExistentialPredicate::Projection(ExistentialProjection { def_id, - substs, + args, term, }) => { if let Some(ty) = term.ty() { ExistentialPredicate::Projection(ExistentialProjection { def_id, - substs: self.specialize_substs(substs, map), + args: self.specialize_generic_args(args, map), term: self.specialize_generic_argument_type(ty, map).into(), }) } else { ExistentialPredicate::Projection(ExistentialProjection { def_id, - substs: self.specialize_substs(substs, map), + args: self.specialize_generic_args(args, map), term, }) } @@ -1188,14 +1209,15 @@ impl<'tcx> TypeVisitor<'tcx> { }) }, ); - self.tcx.mk_dynamic( + Ty::new_dynamic( + self.tcx, self.tcx .mk_poly_existential_predicates_from_iter(specialized_predicates), *region, *kind, ) } - TyKind::Closure(def_id, substs) => { + TyKind::Closure(def_id, args) => { // Closure types can be part of their own type parameters... // so need to guard against endless recursion { @@ -1207,19 +1229,20 @@ impl<'tcx> TypeVisitor<'tcx> { return gen_arg_type; } } - let specialized_closure = self - .tcx - .mk_closure(*def_id, self.specialize_substs(substs, map)); + let specialized_closure = + Ty::new_closure(self.tcx, *def_id, self.specialize_generic_args(args, map)); let mut borrowed_closures_being_specialized = self.closures_being_specialized.borrow_mut(); let closures_being_specialized = borrowed_closures_being_specialized.deref_mut(); closures_being_specialized.remove(def_id); specialized_closure } - TyKind::Generator(def_id, substs, movability) => { - self.tcx - .mk_generator(*def_id, self.specialize_substs(substs, map), *movability) - } + TyKind::Generator(def_id, args, movability) => Ty::new_generator( + self.tcx, + *def_id, + self.specialize_generic_args(args, map), + *movability, + ), TyKind::GeneratorWitness(bound_types) => { let map_types = |types: &rustc_middle::ty::List>| { self.tcx.mk_type_list_from_iter( @@ -1229,19 +1252,18 @@ impl<'tcx> TypeVisitor<'tcx> { ) }; let specialized_types = bound_types.map_bound(map_types); - self.tcx.mk_generator_witness(specialized_types) + Ty::new_generator_witness(self.tcx, specialized_types) } - TyKind::Tuple(types) => self.tcx.mk_tup_from_iter( + TyKind::Tuple(types) => Ty::new_tup_from_iter( + self.tcx, types .iter() .map(|ty| self.specialize_generic_argument_type(ty, map)), ), TyKind::Alias( rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, - ) => self - .tcx - .mk_opaque(*def_id, self.specialize_substs(substs, map)), + rustc_middle::ty::AliasTy { def_id, args, .. }, + ) => Ty::new_opaque(self.tcx, *def_id, self.specialize_generic_args(args, map)), TyKind::Param(ParamTy { name, .. }) => { if let Some(map) = map { if let Some(gen_arg) = map.get(name) { @@ -1255,16 +1277,16 @@ impl<'tcx> TypeVisitor<'tcx> { } #[logfn_inputs(TRACE)] - pub fn specialize_substs( + pub fn specialize_generic_args( &self, - substs: SubstsRef<'tcx>, + args: GenericArgsRef<'tcx>, map: &Option>>, - ) -> SubstsRef<'tcx> { - let specialized_generic_args: Vec> = substs + ) -> GenericArgsRef<'tcx> { + let specialized_generic_args: Vec> = args .iter() .map(|gen_arg| self.specialize_generic_argument(gen_arg, map)) .collect(); - self.tcx.mk_substs(&specialized_generic_args) + self.tcx.mk_args(&specialized_generic_args) } } diff --git a/checker/src/utils.rs b/checker/src/utils.rs index e13ff209..40abc3a2 100644 --- a/checker/src/utils.rs +++ b/checker/src/utils.rs @@ -16,8 +16,9 @@ use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData}; use rustc_hir::Node; use rustc_middle::ty; use rustc_middle::ty::print::{FmtPrinter, Printer}; -use rustc_middle::ty::subst::{GenericArgKind, SubstsRef}; -use rustc_middle::ty::{FloatTy, IntTy, Ty, TyCtxt, TyKind, UintTy}; +use rustc_middle::ty::{ + FloatTy, GenericArgKind, GenericArgsRef, IntTy, Ty, TyCtxt, TyKind, UintTy, +}; /// Returns the location of the rust system binaries that are associated with this build of Mirai. /// The location is obtained by looking at the contents of the environmental variables that were @@ -70,10 +71,10 @@ pub fn contains_function<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> bool { if ty.is_fn() || ty.is_closure() || ty.is_generator() { return true; } - if let TyKind::Adt(def, substs) = ty.kind() { + if let TyKind::Adt(def, args) = ty.kind() { for variant in def.variants().iter() { for (_, field) in variant.fields.iter().enumerate() { - let field_ty = field.ty(tcx, substs); + let field_ty = field.ty(tcx, args); if contains_function(field_ty, tcx) { return true; } @@ -152,7 +153,7 @@ pub fn is_trait_method(def_id: DefId, tcx: TyCtxt<'_>) -> bool { #[logfn(TRACE)] pub fn argument_types_key_str<'tcx>( tcx: TyCtxt<'tcx>, - generic_args: Option>, + generic_args: Option>, ) -> Rc { let mut result = "_".to_string(); if let Some(generic_args) = generic_args { @@ -211,7 +212,7 @@ fn append_mangled_type<'tcx>(str: &mut String, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) TyKind::Closure(def_id, subs) => { str.push_str("closure_"); str.push_str(qualified_type_name(tcx, *def_id).as_str()); - for sub in subs.as_closure().substs { + for sub in subs.as_closure().args { if let GenericArgKind::Type(ty) = sub.unpack() { str.push('_'); append_mangled_type(str, ty, tcx); @@ -224,7 +225,7 @@ fn append_mangled_type<'tcx>(str: &mut String, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) let principal = tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), principal); str.push_str(qualified_type_name(tcx, principal.def_id).as_str()); - for sub in principal.substs { + for sub in principal.args { if let GenericArgKind::Type(ty) = sub.unpack() { str.push('_'); append_mangled_type(str, ty, tcx); @@ -249,7 +250,7 @@ fn append_mangled_type<'tcx>(str: &mut String, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) TyKind::Generator(def_id, subs, ..) => { str.push_str("generator_"); str.push_str(qualified_type_name(tcx, *def_id).as_str()); - for sub in subs.as_generator().substs { + for sub in subs.as_generator().args { if let GenericArgKind::Type(ty) = sub.unpack() { str.push('_'); append_mangled_type(str, ty, tcx); @@ -262,13 +263,10 @@ fn append_mangled_type<'tcx>(str: &mut String, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) append_mangled_type(str, ty, tcx) } } - TyKind::Alias( - rustc_middle::ty::Opaque, - rustc_middle::ty::AliasTy { def_id, substs, .. }, - ) => { + TyKind::Alias(rustc_middle::ty::Opaque, rustc_middle::ty::AliasTy { def_id, args, .. }) => { str.push_str("impl_"); str.push_str(qualified_type_name(tcx, *def_id).as_str()); - for sub in *substs { + for sub in *args { if let GenericArgKind::Type(ty) = sub.unpack() { str.push('_'); append_mangled_type(str, ty, tcx); @@ -446,8 +444,8 @@ pub fn def_id_as_qualified_name_str(tcx: TyCtxt<'_>, def_id: DefId) -> Rc { name.push('('); let fn_sig = if fn_ty.is_fn() { fn_ty.fn_sig(tcx).skip_binder() - } else if let ty::Closure(_, substs) = fn_ty.kind() { - substs.as_closure().sig().skip_binder() + } else if let ty::Closure(_, args) = fn_ty.kind() { + args.as_closure().sig().skip_binder() } else { unreachable!() }; @@ -480,7 +478,7 @@ pub fn def_id_display_name(tcx: TyCtxt<'_>, def_id: DefId) -> String { } /// Returns false if any of the generic arguments are themselves generic -pub fn are_concrete(gen_args: SubstsRef<'_>) -> bool { +pub fn are_concrete(gen_args: GenericArgsRef<'_>) -> bool { for gen_arg in gen_args.iter() { if let GenericArgKind::Type(ty) = gen_arg.unpack() { if !is_concrete(ty.kind()) { @@ -498,12 +496,9 @@ pub fn is_concrete(ty: &TyKind<'_>) -> bool { | TyKind::Closure(_, gen_args) | TyKind::FnDef(_, gen_args) | TyKind::Generator(_, gen_args, _) - | TyKind::Alias( - _, - rustc_middle::ty::AliasTy { - substs: gen_args, .. - }, - ) => are_concrete(gen_args), + | TyKind::Alias(_, rustc_middle::ty::AliasTy { args: gen_args, .. }) => { + are_concrete(gen_args) + } TyKind::Tuple(types) => types.iter().all(|t| is_concrete(t.kind())), TyKind::Bound(..) | TyKind::Dynamic(..) diff --git a/checker/tests/call_graph/fnptr_fold.rs b/checker/tests/call_graph/fnptr_fold.rs index 67304dae..64146c4f 100644 --- a/checker/tests/call_graph/fnptr_fold.rs +++ b/checker/tests/call_graph/fnptr_fold.rs @@ -68,10 +68,10 @@ commit; /* EXPECTED:CALL_SITES{ "files": [ "tests/call_graph/fnptr_fold.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/std/src/io/stdio.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/fmt/mod.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/slice/mod.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/ptr/metadata.rs" + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/std/src/io/stdio.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/fmt/mod.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/slice/mod.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/ptr/metadata.rs" ], "callables": [ { @@ -113,7 +113,7 @@ commit; { "name": "/core/core::slice::::len(&[T])->usize", "file_index": 3, - "first_line": 140, + "first_line": 141, "local": true }, { @@ -175,7 +175,7 @@ commit; ], [ 3, - 141, + 142, 9, 6, 7 diff --git a/checker/tests/call_graph/static_fold.rs b/checker/tests/call_graph/static_fold.rs index 544535b1..f24f7367 100644 --- a/checker/tests/call_graph/static_fold.rs +++ b/checker/tests/call_graph/static_fold.rs @@ -64,10 +64,10 @@ commit; /* EXPECTED:CALL_SITES{ "files": [ "tests/call_graph/static_fold.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/std/src/io/stdio.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/fmt/mod.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/slice/mod.rs", - "/rustc/2f2c438dce75d8cc532c3baa849eeddc0901802c/library/core/src/ptr/metadata.rs" + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/std/src/io/stdio.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/fmt/mod.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/slice/mod.rs", + "/rustc/500647fd8138cc09e87edb08d62f81654fbf6ef8/library/core/src/ptr/metadata.rs" ], "callables": [ { @@ -109,7 +109,7 @@ commit; { "name": "/core/core::slice::::len(&[T])->usize", "file_index": 3, - "first_line": 140, + "first_line": 141, "local": true }, { @@ -157,7 +157,7 @@ commit; ], [ 3, - 141, + 142, 9, 6, 7 diff --git a/checker/tests/integration_tests.rs b/checker/tests/integration_tests.rs index a0571375..244c65ac 100644 --- a/checker/tests/integration_tests.rs +++ b/checker/tests/integration_tests.rs @@ -19,6 +19,7 @@ extern crate rayon; extern crate rustc_ast; extern crate rustc_data_structures; extern crate rustc_driver; +extern crate rustc_session; extern crate tempfile; use std::collections::HashMap; @@ -31,6 +32,7 @@ use std::str::FromStr; use rayon::iter::IntoParallelIterator; use rayon::iter::ParallelIterator; use regex::Regex; +use rustc_session::*; use serde::Deserialize; use tempfile::TempDir; use walkdir::WalkDir; @@ -148,9 +150,9 @@ fn run_directory(directory_path: PathBuf) -> Vec<(String, String)> { files_and_temp_dirs } -fn build_options() -> Options { +fn build_options(early_error_handler: &EarlyErrorHandler) -> Options { let mut options = Options::default(); - options.parse_from_str("", true); // get defaults + options.parse_from_str("", early_error_handler, true); // get defaults options.diag_level = DiagLevel::Paranoid; // override default options.max_analysis_time_for_body = 20; options.max_analysis_time_for_crate = 60; @@ -254,6 +256,7 @@ fn invoke_driver_on_files( // Runs the single test case found in file_name, using temp_dir_path as the place // to put compiler output, which for Mirai includes the persistent summary store. fn invoke_driver( + early_error_handler: &EarlyErrorHandler, file_name: String, temp_dir_path: String, sys_root: String, @@ -265,7 +268,8 @@ fn invoke_driver( let file_content = read_to_string(Path::new(&file_name)).unwrap(); let options_re = Regex::new(r"(?m)^\s*//\s*MIRAI_FLAGS\s(?P.*)$").unwrap(); if let Some(captures) = options_re.captures(&file_content) { - rustc_args = options.parse_from_str(&captures["flags"], true); // override based on test source + rustc_args = options.parse_from_str(&captures["flags"], early_error_handler, true); + // override based on test source } } @@ -424,9 +428,11 @@ fn check_call_graph_output( // Default test driver fn start_driver(config: DriverConfig) -> usize { + let early_error_handler = EarlyErrorHandler::new(config::ErrorOutputType::default()); let sys_root = utils::find_sysroot(); - let options = build_options(); + let options = build_options(&early_error_handler); self::invoke_driver( + &early_error_handler, config.file_name, config.temp_dir_path, sys_root, @@ -438,12 +444,14 @@ fn start_driver(config: DriverConfig) -> usize { // Test driver for call graph generation; // sets up call graph configuration. fn start_driver_call_graph(config: DriverConfig) -> usize { + let early_error_handler = EarlyErrorHandler::new(config::ErrorOutputType::default()); let sys_root = utils::find_sysroot(); - let mut options = build_options(); + let mut options = build_options(&early_error_handler); let (call_graph_config, call_graph_config_path) = generate_call_graph_config(&config.file_name, &config.temp_dir_path); options.call_graph_config = Some(call_graph_config_path); let result = self::invoke_driver( + &early_error_handler, config.file_name.clone(), config.temp_dir_path.clone(), sys_root, diff --git a/checker/tests/run-pass/crate_traversal.rs b/checker/tests/run-pass/crate_traversal.rs index c975741e..0f7a199c 100644 --- a/checker/tests/run-pass/crate_traversal.rs +++ b/checker/tests/run-pass/crate_traversal.rs @@ -92,6 +92,7 @@ fn bar() -> bool { f(&1, &-1) } +#[allow(dropping_references)] fn test7() { loop { let beacon = { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 16570262..008bdd83 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "nightly-2023-05-09" +channel = "nightly-2023-07-28" components = [ "clippy", "rustfmt", "rustc-dev", "rust-src", "rust-std", "llvm-tools-preview" ] diff --git a/standard_contracts/src/foreign_contracts.rs b/standard_contracts/src/foreign_contracts.rs index 28e16064..63147554 100644 --- a/standard_contracts/src/foreign_contracts.rs +++ b/standard_contracts/src/foreign_contracts.rs @@ -2867,22 +2867,37 @@ pub mod core { ) { std::intrinsics::copy_nonoverlapping(src, dst, count); } - // pub fn volatile_copy_memory(dst: *mut T, src: *const T, count: usize) {} - // pub fn volatile_set_memory(dst: *mut T, val: T, count: usize) { - // *dst = val; - // } - // pub fn volatile_load(src: *const T) -> T { - // *src - // } - // pub fn volatile_store(dst: *mut T, val: T) { - // *dst = val; - // } - // pub fn unaligned_volatile_load(src: *const T) -> T { - // *src - // } - // pub fn unaligned_volatile_store(dst: *mut T, val: T) { - // *dst = val - // } + pub unsafe fn volatile_copy_memory(dst: *mut T, src: *const T, count: usize) { + std::intrinsics::copy_nonoverlapping(src, dst, count); + } + pub unsafe fn volatile_set_memory(dst: *mut T, val: T, count: usize) { + // todo: add a intrinsic function for this to MIRAI + *dst = val; + } + pub unsafe fn volatile_load(src: *const T) -> T + where + T: Copy, + { + *src + } + pub unsafe fn volatile_store(dst: *mut T, val: T) + where + T: Copy, + { + *dst = val; + } + pub unsafe fn unaligned_volatile_load(src: *const T) -> T + where + T: Copy, + { + *src + } + pub unsafe fn unaligned_volatile_store(dst: *mut T, val: T) + where + T: Copy, + { + *dst = val + } default_contract!(float_to_int_unchecked); pub fn fmaf32(a: f32, b: f32, c: f32) -> f32 {