diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-01-27 22:32:24 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-27 22:32:24 +0100 |
| commit | bc26f97394e520f4bf9237c043841fab4a27ba85 (patch) | |
| tree | 219b0dcee9cf798bae8d460a3b4c39814b33de4e /compiler/rustc_data_structures/src | |
| parent | 54f357836ec5786fa7f6f08626ee5b692ccb2757 (diff) | |
| parent | 1ffd043caf7598484a9f38c580aca91760a571f6 (diff) | |
| download | rust-bc26f97394e520f4bf9237c043841fab4a27ba85.tar.gz rust-bc26f97394e520f4bf9237c043841fab4a27ba85.zip | |
Rollup merge of #93193 - Kobzol:stable-hash-permutation-test, r=the8472
Add test for stable hash uniqueness of adjacent field values This PR adds a simple test to check that stable hash will produce a different hash if the order of two values that have the same combined bit pattern changes. r? `@the8472`
Diffstat (limited to 'compiler/rustc_data_structures/src')
| -rw-r--r-- | compiler/rustc_data_structures/src/stable_hasher/tests.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/compiler/rustc_data_structures/src/stable_hasher/tests.rs b/compiler/rustc_data_structures/src/stable_hasher/tests.rs index 391db67d29d..31190363eb6 100644 --- a/compiler/rustc_data_structures/src/stable_hasher/tests.rs +++ b/compiler/rustc_data_structures/src/stable_hasher/tests.rs @@ -98,3 +98,45 @@ fn test_hash_bit_matrix() { assert_ne!(a, b); assert_ne!(hash(&a), hash(&b)); } + +// Check that exchanging the value of two adjacent fields changes the hash. +#[test] +fn test_attribute_permutation() { + macro_rules! test_type { + ($ty: ty) => {{ + struct Foo { + a: $ty, + b: $ty, + } + + impl<CTX> HashStable<CTX> for Foo { + fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) { + self.a.hash_stable(hcx, hasher); + self.b.hash_stable(hcx, hasher); + } + } + + #[allow(overflowing_literals)] + let mut item = Foo { a: 0xFF, b: 0xFF_FF }; + let hash_a = hash(&item); + std::mem::swap(&mut item.a, &mut item.b); + let hash_b = hash(&item); + assert_ne!( + hash_a, + hash_b, + "The hash stayed the same after values were swapped for type `{}`!", + stringify!($ty) + ); + }}; + } + + test_type!(u16); + test_type!(u32); + test_type!(u64); + test_type!(u128); + + test_type!(i16); + test_type!(i32); + test_type!(i64); + test_type!(i128); +} |
