From 6bf061b27f1395d4fcf3f3043464bfabe7fcc412 Mon Sep 17 00:00:00 2001 From: aneksteind Date: Mon, 1 Aug 2022 16:33:47 -0400 Subject: [PATCH 1/5] add test for fields of references --- analysis/test/src/pointers.rs | 11 ++++++ ...dg__tests__analysis_test_pdg_snapshot.snap | 34 ++++++++++++++----- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/analysis/test/src/pointers.rs b/analysis/test/src/pointers.rs index 7bbe17df92..54258c03a6 100644 --- a/analysis/test/src/pointers.rs +++ b/analysis/test/src/pointers.rs @@ -376,6 +376,16 @@ pub unsafe extern "C" fn test_unique_ref() { *fresh1 = &mut x as *mut i32; } #[no_mangle] +pub unsafe extern "C" fn test_ref_field() { + let s = calloc( + 0i32 as libc::c_ulong, + ::std::mem::size_of::() as libc::c_ulong, + ) as *mut S; + let s_ref = &mut *s; + (*s_ref).field4.field4 = (*s_ref).field4.field4; + free(s_ref as *mut S as *mut libc::c_void); +} +#[no_mangle] pub unsafe extern "C" fn test_realloc_reassign() { let mut s = malloc(::std::mem::size_of::() as libc::c_ulong); s = realloc(s, 2 * mem::size_of::() as c_ulong); @@ -504,6 +514,7 @@ unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) -> lib test_arg_rec(); test_shared_ref(); test_unique_ref(); + test_ref_field(); test_realloc_reassign(); test_realloc_fresh(); test_load_addr(); diff --git a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap index cc49fd3d5c..fb54edf73a 100644 --- a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap +++ b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap @@ -687,6 +687,22 @@ g { } nodes_that_need_write = [] +g { + n[0]: alloc _ => _2 @ bb1[2]: fn test_ref_field; _2 = pointers::calloc(move _3, move _4) + n[1]: copy n[0] => _1 @ bb2[3]: fn test_ref_field; _1 = move _2 as *mut pointers::S (Misc) + n[2]: copy n[1] => _6 @ bb2[6]: fn test_ref_field; _6 = &mut (*_1) + n[3]: field.3 n[2] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32) + n[4]: field.3 n[3] => _7 @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32) + n[5]: addr.load n[4] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32) + n[6]: field.3 n[2] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 + n[7]: field.3 n[6] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 + n[8]: addr.store n[7] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 + n[9]: copy n[0] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6) + n[10]: copy n[9] => _9 @ bb2[17]: fn test_ref_field; _9 = move _10 as *mut libc::c_void (Misc) + n[11]: free n[10] => _8 @ bb2[18]: fn test_ref_field; _8 = pointers::free(move _9) +} +nodes_that_need_write = [8, 7, 6, 2, 1, 0] + g { n[0]: alloc _ => _1 @ bb1[2]: fn test_realloc_reassign; _1 = pointers::malloc(move _2) n[1]: copy n[0] => _5 @ bb2[5]: fn test_realloc_reassign; _5 = _1 @@ -885,13 +901,13 @@ g { nodes_that_need_write = [2, 0] g { - n[0]: &_35 _ => _34 @ bb30[4]: fn main_0; _34 = &mut _35 - n[1]: copy n[0] => _40 @ bb30[12]: fn main_0; _40 = &(*_34) - n[2]: copy n[1] => _39 @ bb30[13]: fn main_0; _39 = move _40 as &[i32] (Pointer(Unsize)) - n[3]: copy n[2] => _1 @ bb0[0]: fn len; _38 = core::slice::::len(move _39) - n[4]: copy n[0] => _42 @ bb31[6]: fn main_0; _42 = &raw mut (*_34) - n[5]: copy n[4] => _41 @ bb31[7]: fn main_0; _41 = move _42 as *mut i32 (Pointer(ArrayToPointer)) - n[6]: copy n[5] => _2 @ bb0[0]: fn insertion_sort; _36 = pointers::insertion_sort(move _37, move _41) + n[0]: &_36 _ => _35 @ bb31[4]: fn main_0; _35 = &mut _36 + n[1]: copy n[0] => _41 @ bb31[12]: fn main_0; _41 = &(*_35) + n[2]: copy n[1] => _40 @ bb31[13]: fn main_0; _40 = move _41 as &[i32] (Pointer(Unsize)) + n[3]: copy n[2] => _1 @ bb0[0]: fn len; _39 = core::slice::::len(move _40) + n[4]: copy n[0] => _43 @ bb32[6]: fn main_0; _43 = &raw mut (*_35) + n[5]: copy n[4] => _42 @ bb32[7]: fn main_0; _42 = move _43 as *mut i32 (Pointer(ArrayToPointer)) + n[6]: copy n[5] => _2 @ bb0[0]: fn insertion_sort; _37 = pointers::insertion_sort(move _38, move _42) n[7]: copy n[6] => _10 @ bb3[4]: fn insertion_sort; _10 = _2 n[8]: offset[1] n[7] => _9 @ bb3[9]: fn insertion_sort; _9 = std::ptr::mut_ptr::::offset(move _10, move _11) n[9]: addr.load n[8] => _ @ bb5[2]: fn insertion_sort; _8 = (*_9) @@ -964,6 +980,6 @@ g { } nodes_that_need_write = [75, 74, 73, 66, 65, 64, 63, 62, 61, 54, 53, 52, 45, 44, 43, 33, 32, 31, 27, 26, 25, 15, 14, 13, 6, 5, 4, 0] -num_graphs = 76 -num_nodes = 658 +num_graphs = 77 +num_nodes = 670 From 4ca53bd38bcc5c122cfc609bbeca8648c89af290 Mon Sep 17 00:00:00 2001 From: aneksteind Date: Mon, 1 Aug 2022 18:25:24 -0400 Subject: [PATCH 2/5] fix bug re: source of AddrOfLocal --- dynamic_instrumentation/src/instrument.rs | 4 ++- ...dg__tests__analysis_test_pdg_snapshot.snap | 34 +++++++++---------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/dynamic_instrumentation/src/instrument.rs b/dynamic_instrumentation/src/instrument.rs index 5679655ebe..d1d64da4f4 100644 --- a/dynamic_instrumentation/src/instrument.rs +++ b/dynamic_instrumentation/src/instrument.rs @@ -241,10 +241,12 @@ impl<'tcx> Visitor<'tcx> for InstrumentationAdder<'_, 'tcx> { statement_index: location.statement_index + 1, ..location }; + + let source = remove_outer_deref(*p, self.tcx()); // Instrument which local's address is taken self.loc(instrumentation_location, copy_fn) .arg_var(dest) - .source(p) + .source(&source) .dest(&dest) .debug_mir(location) .add_to(self); diff --git a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap index fb54edf73a..d19bd3fe80 100644 --- a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap +++ b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap @@ -165,59 +165,59 @@ g { n[1]: copy n[0] => _7 @ bb2[14]: fn exercise_allocator; _7 = move _8 as *const u8 (Pointer(ArrayToPointer)) n[2]: copy n[1] => _6 @ bb2[16]: fn exercise_allocator; _6 = move _7 as *const i8 (Misc) n[3]: copy n[2] => _1 @ bb0[0]: fn printf; _5 = pointers::printf(move _6, move _10) - n[4]: copy n[0] => _30 @ bb11[7]: fn exercise_allocator; _30 = &raw const (*_31) + n[4]: copy _ => _30 @ bb11[7]: fn exercise_allocator; _30 = &raw const (*_31) n[5]: copy n[4] => _29 @ bb11[8]: fn exercise_allocator; _29 = move _30 as *const u8 (Pointer(ArrayToPointer)) n[6]: copy n[5] => _28 @ bb11[10]: fn exercise_allocator; _28 = move _29 as *const i8 (Misc) n[7]: copy n[6] => _1 @ bb0[0]: fn printf; _27 = pointers::printf(move _28, move _32) - n[8]: copy n[0] => _30 @ bb11[7]: fn exercise_allocator; _30 = &raw const (*_31) + n[8]: copy _ => _30 @ bb11[7]: fn exercise_allocator; _30 = &raw const (*_31) n[9]: copy n[8] => _29 @ bb11[8]: fn exercise_allocator; _29 = move _30 as *const u8 (Pointer(ArrayToPointer)) n[10]: copy n[9] => _28 @ bb11[10]: fn exercise_allocator; _28 = move _29 as *const i8 (Misc) n[11]: copy n[10] => _1 @ bb0[0]: fn printf; _27 = pointers::printf(move _28, move _32) - n[12]: copy n[0] => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) + n[12]: copy _ => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) n[13]: copy n[12] => _59 @ bb29[8]: fn exercise_allocator; _59 = move _60 as *const u8 (Pointer(ArrayToPointer)) n[14]: copy n[13] => _58 @ bb29[10]: fn exercise_allocator; _58 = move _59 as *const i8 (Misc) n[15]: copy n[14] => _1 @ bb0[0]: fn printf; _57 = pointers::printf(move _58, move _62) - n[16]: copy n[0] => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) + n[16]: copy _ => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) n[17]: copy n[16] => _59 @ bb29[8]: fn exercise_allocator; _59 = move _60 as *const u8 (Pointer(ArrayToPointer)) n[18]: copy n[17] => _58 @ bb29[10]: fn exercise_allocator; _58 = move _59 as *const i8 (Misc) n[19]: copy n[18] => _1 @ bb0[0]: fn printf; _57 = pointers::printf(move _58, move _62) - n[20]: copy n[0] => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) + n[20]: copy _ => _60 @ bb29[7]: fn exercise_allocator; _60 = &raw const (*_61) n[21]: copy n[20] => _59 @ bb29[8]: fn exercise_allocator; _59 = move _60 as *const u8 (Pointer(ArrayToPointer)) n[22]: copy n[21] => _58 @ bb29[10]: fn exercise_allocator; _58 = move _59 as *const i8 (Misc) n[23]: copy n[22] => _1 @ bb0[0]: fn printf; _57 = pointers::printf(move _58, move _62) - n[24]: copy n[0] => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) + n[24]: copy _ => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) n[25]: copy n[24] => _92 @ bb49[8]: fn exercise_allocator; _92 = move _93 as *const u8 (Pointer(ArrayToPointer)) n[26]: copy n[25] => _91 @ bb49[10]: fn exercise_allocator; _91 = move _92 as *const i8 (Misc) n[27]: copy n[26] => _1 @ bb0[0]: fn printf; _90 = pointers::printf(move _91, move _95) - n[28]: copy n[0] => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) + n[28]: copy _ => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) n[29]: copy n[28] => _92 @ bb49[8]: fn exercise_allocator; _92 = move _93 as *const u8 (Pointer(ArrayToPointer)) n[30]: copy n[29] => _91 @ bb49[10]: fn exercise_allocator; _91 = move _92 as *const i8 (Misc) n[31]: copy n[30] => _1 @ bb0[0]: fn printf; _90 = pointers::printf(move _91, move _95) - n[32]: copy n[0] => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) + n[32]: copy _ => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) n[33]: copy n[32] => _92 @ bb49[8]: fn exercise_allocator; _92 = move _93 as *const u8 (Pointer(ArrayToPointer)) n[34]: copy n[33] => _91 @ bb49[10]: fn exercise_allocator; _91 = move _92 as *const i8 (Misc) n[35]: copy n[34] => _1 @ bb0[0]: fn printf; _90 = pointers::printf(move _91, move _95) - n[36]: copy n[0] => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) + n[36]: copy _ => _93 @ bb49[7]: fn exercise_allocator; _93 = &raw const (*_94) n[37]: copy n[36] => _92 @ bb49[8]: fn exercise_allocator; _92 = move _93 as *const u8 (Pointer(ArrayToPointer)) n[38]: copy n[37] => _91 @ bb49[10]: fn exercise_allocator; _91 = move _92 as *const i8 (Misc) n[39]: copy n[38] => _1 @ bb0[0]: fn printf; _90 = pointers::printf(move _91, move _95) - n[40]: copy n[0] => _8 @ bb2[13]: fn simple_analysis; _8 = &raw const (*_9) + n[40]: copy _ => _8 @ bb2[13]: fn simple_analysis; _8 = &raw const (*_9) n[41]: copy n[40] => _7 @ bb2[14]: fn simple_analysis; _7 = move _8 as *const u8 (Pointer(ArrayToPointer)) n[42]: copy n[41] => _6 @ bb2[16]: fn simple_analysis; _6 = move _7 as *const i8 (Misc) n[43]: copy n[42] => _1 @ bb0[0]: fn printf; _5 = pointers::printf(move _6, move _10) - n[44]: copy n[0] => _5 @ bb0[7]: fn analysis2_helper; _5 = &raw const (*_6) + n[44]: copy n[42] => _5 @ bb0[7]: fn analysis2_helper; _5 = &raw const (*_6) n[45]: copy n[44] => _4 @ bb0[8]: fn analysis2_helper; _4 = move _5 as *const u8 (Pointer(ArrayToPointer)) n[46]: copy n[45] => _3 @ bb0[10]: fn analysis2_helper; _3 = move _4 as *const i8 (Misc) n[47]: copy n[46] => _1 @ bb0[0]: fn printf; _2 = pointers::printf(move _3, move _7) - n[48]: copy n[0] => _8 @ bb2[13]: fn inter_function_analysis; _8 = &raw const (*_9) + n[48]: copy _ => _8 @ bb2[13]: fn inter_function_analysis; _8 = &raw const (*_9) n[49]: copy n[48] => _7 @ bb2[14]: fn inter_function_analysis; _7 = move _8 as *const u8 (Pointer(ArrayToPointer)) n[50]: copy n[49] => _6 @ bb2[16]: fn inter_function_analysis; _6 = move _7 as *const i8 (Misc) n[51]: copy n[50] => _1 @ bb0[0]: fn printf; _5 = pointers::printf(move _6, move _10) - n[52]: copy n[0] => _10 @ bb2[20]: fn invalid; _10 = &raw const (*_11) + n[52]: copy _ => _10 @ bb2[20]: fn invalid; _10 = &raw const (*_11) n[53]: copy n[52] => _9 @ bb2[21]: fn invalid; _9 = move _10 as *const u8 (Pointer(ArrayToPointer)) n[54]: copy n[53] => _8 @ bb2[23]: fn invalid; _8 = move _9 as *const i8 (Misc) n[55]: copy n[54] => _1 @ bb0[0]: fn printf; _7 = pointers::printf(move _8, move _12) - n[56]: copy n[0] => _16 @ bb3[11]: fn invalid; _16 = &raw const (*_17) + n[56]: copy _ => _16 @ bb3[11]: fn invalid; _16 = &raw const (*_17) n[57]: copy n[56] => _15 @ bb3[12]: fn invalid; _15 = move _16 as *const u8 (Pointer(ArrayToPointer)) n[58]: copy n[57] => _14 @ bb3[14]: fn invalid; _14 = move _15 as *const i8 (Misc) n[59]: copy n[58] => _1 @ bb0[0]: fn printf; _13 = pointers::printf(move _14, move _18) @@ -533,7 +533,7 @@ g { n[2]: copy n[1] => _1 @ bb0[0]: fn connection_accepted; _13 = pointers::connection_accepted(move _14, const 0_i32) n[3]: field.0 n[2] => _10 @ bb2[10]: fn connection_accepted; _10 = ((*_1).0: *mut pointers::fdevents) n[4]: addr.load n[3] => _ @ bb2[10]: fn connection_accepted; _10 = ((*_1).0: *mut pointers::fdevents) - n[5]: copy n[0] => _16 @ bb5[5]: fn lighttpd_test; _16 = &raw mut (*_10) + n[5]: copy n[3] => _16 @ bb5[5]: fn lighttpd_test; _16 = &raw mut (*_10) n[6]: copy n[5] => _1 @ bb0[0]: fn connection_close; _15 = pointers::connection_close(move _16, move _17) n[7]: field.0 n[6] => _4 @ bb0[2]: fn connection_close; _4 = ((*_1).0: *mut pointers::fdevents) n[8]: addr.load n[7] => _ @ bb0[2]: fn connection_close; _4 = ((*_1).0: *mut pointers::fdevents) @@ -664,7 +664,7 @@ g { n[3]: copy n[2] => _1 @ bb0[0]: fn shared_ref_foo; _4 = pointers::shared_ref_foo(move _5) n[4]: copy n[3] => _0 @ bb0[1]: fn shared_ref_foo; _0 = _1 n[5]: copy n[4] => _4 @ bb1[0]: fn test_shared_ref; _4 = pointers::shared_ref_foo(move _5) - n[6]: copy n[0] => _6 @ bb1[4]: fn test_shared_ref; _6 = &raw const (*_4) + n[6]: copy n[5] => _6 @ bb1[4]: fn test_shared_ref; _6 = &raw const (*_4) } nodes_that_need_write = [] @@ -697,7 +697,7 @@ g { n[6]: field.3 n[2] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 n[7]: field.3 n[6] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 n[8]: addr.store n[7] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7 - n[9]: copy n[0] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6) + n[9]: copy n[2] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6) n[10]: copy n[9] => _9 @ bb2[17]: fn test_ref_field; _9 = move _10 as *mut libc::c_void (Misc) n[11]: free n[10] => _8 @ bb2[18]: fn test_ref_field; _8 = pointers::free(move _9) } From ab7c822b0eed7bc832e9aa8ccde196d87d6708e4 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 2 Aug 2022 00:44:26 -0700 Subject: [PATCH 3/5] Move the new test to the end so the snapshot isn't disturbed as much. --- analysis/test/src/pointers.rs | 2 +- ...dg__tests__analysis_test_pdg_snapshot.snap | 46 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/analysis/test/src/pointers.rs b/analysis/test/src/pointers.rs index 54258c03a6..7f826ae04c 100644 --- a/analysis/test/src/pointers.rs +++ b/analysis/test/src/pointers.rs @@ -514,7 +514,6 @@ unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) -> lib test_arg_rec(); test_shared_ref(); test_unique_ref(); - test_ref_field(); test_realloc_reassign(); test_realloc_fresh(); test_load_addr(); @@ -530,6 +529,7 @@ unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) -> lib test_load_value_store_value(); let nums = &mut [2i32, 5i32, 3i32, 1i32, 6i32]; insertion_sort(nums.len() as libc::c_int, nums as *mut libc::c_int); + test_ref_field(); return 0i32; } pub fn main() { diff --git a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap index 28943e49d0..552226ad3c 100644 --- a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap +++ b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap @@ -687,22 +687,6 @@ g { } nodes_that_need_write = [] -g { - n[0]: alloc _ => _2 @ bb1[2]: fn test_ref_field; _2 = calloc(move _3, move _4); - n[1]: copy n[0] => _1 @ bb2[3]: fn test_ref_field; _1 = move _2 as *mut pointers::S (Misc); - n[2]: copy n[1] => _6 @ bb2[6]: fn test_ref_field; _6 = &mut (*_1); - n[3]: field.3 n[2] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[4]: field.3 n[3] => _7 @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[5]: addr.load n[4] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[6]: field.3 n[2] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[7]: field.3 n[6] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[8]: addr.store n[7] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[9]: copy n[2] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6); - n[10]: copy n[9] => _9 @ bb2[17]: fn test_ref_field; _9 = move _10 as *mut libc::c_void (Misc); - n[11]: free n[10] => _8 @ bb2[18]: fn test_ref_field; _8 = free(move _9); -} -nodes_that_need_write = [8, 7, 6, 2, 1, 0] - g { n[0]: alloc _ => _1 @ bb1[2]: fn test_realloc_reassign; _1 = malloc(move _2); n[1]: copy n[0] => _5 @ bb2[5]: fn test_realloc_reassign; _5 = _1; @@ -901,13 +885,13 @@ g { nodes_that_need_write = [2, 0] g { - n[0]: &_36 _ => _35 @ bb31[4]: fn main_0; _35 = &mut _36; - n[1]: copy n[0] => _41 @ bb31[12]: fn main_0; _41 = &(*_35); - n[2]: copy n[1] => _40 @ bb31[13]: fn main_0; _40 = move _41 as &[i32] (Pointer(Unsize)); - n[3]: copy n[2] => _1 @ bb0[0]: fn len; _39 = len(move _40); - n[4]: copy n[0] => _43 @ bb32[6]: fn main_0; _43 = &raw mut (*_35); - n[5]: copy n[4] => _42 @ bb32[7]: fn main_0; _42 = move _43 as *mut i32 (Pointer(ArrayToPointer)); - n[6]: copy n[5] => _2 @ bb0[0]: fn insertion_sort; _37 = insertion_sort(move _38, move _42); + n[0]: &_35 _ => _34 @ bb30[4]: fn main_0; _34 = &mut _35; + n[1]: copy n[0] => _40 @ bb30[12]: fn main_0; _40 = &(*_34); + n[2]: copy n[1] => _39 @ bb30[13]: fn main_0; _39 = move _40 as &[i32] (Pointer(Unsize)); + n[3]: copy n[2] => _1 @ bb0[0]: fn len; _38 = len(move _39); + n[4]: copy n[0] => _42 @ bb31[6]: fn main_0; _42 = &raw mut (*_34); + n[5]: copy n[4] => _41 @ bb31[7]: fn main_0; _41 = move _42 as *mut i32 (Pointer(ArrayToPointer)); + n[6]: copy n[5] => _2 @ bb0[0]: fn insertion_sort; _36 = insertion_sort(move _37, move _41); n[7]: copy n[6] => _10 @ bb3[4]: fn insertion_sort; _10 = _2; n[8]: offset[1] n[7] => _9 @ bb3[9]: fn insertion_sort; _9 = offset(move _10, move _11); n[9]: addr.load n[8] => _ @ bb5[2]: fn insertion_sort; _8 = (*_9); @@ -980,6 +964,22 @@ g { } nodes_that_need_write = [75, 74, 73, 66, 65, 64, 63, 62, 61, 54, 53, 52, 45, 44, 43, 33, 32, 31, 27, 26, 25, 15, 14, 13, 6, 5, 4, 0] +g { + n[0]: alloc _ => _2 @ bb1[2]: fn test_ref_field; _2 = calloc(move _3, move _4); + n[1]: copy n[0] => _1 @ bb2[3]: fn test_ref_field; _1 = move _2 as *mut pointers::S (Misc); + n[2]: copy n[1] => _6 @ bb2[6]: fn test_ref_field; _6 = &mut (*_1); + n[3]: field.3 n[2] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); + n[4]: field.3 n[3] => _7 @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); + n[5]: addr.load n[4] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); + n[6]: field.3 n[2] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; + n[7]: field.3 n[6] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; + n[8]: addr.store n[7] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; + n[9]: copy n[2] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6); + n[10]: copy n[9] => _9 @ bb2[17]: fn test_ref_field; _9 = move _10 as *mut libc::c_void (Misc); + n[11]: free n[10] => _8 @ bb2[18]: fn test_ref_field; _8 = free(move _9); +} +nodes_that_need_write = [8, 7, 6, 2, 1, 0] + num_graphs = 77 num_nodes = 670 From c80e0aabb9db4c61e4d3fece929f539ce1dd59c7 Mon Sep 17 00:00:00 2001 From: aneksteind Date: Wed, 3 Aug 2022 14:55:34 -0400 Subject: [PATCH 4/5] make test use proper rust --- analysis/test/src/pointers.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/analysis/test/src/pointers.rs b/analysis/test/src/pointers.rs index 7f826ae04c..ffba97c1d3 100644 --- a/analysis/test/src/pointers.rs +++ b/analysis/test/src/pointers.rs @@ -377,13 +377,20 @@ pub unsafe extern "C" fn test_unique_ref() { } #[no_mangle] pub unsafe extern "C" fn test_ref_field() { - let s = calloc( - 0i32 as libc::c_ulong, - ::std::mem::size_of::() as libc::c_ulong, - ) as *mut S; - let s_ref = &mut *s; - (*s_ref).field4.field4 = (*s_ref).field4.field4; - free(s_ref as *mut S as *mut libc::c_void); + let t = T { + field: 0i32, + field2: 0u64, + field3: 0 as *const S, + field4: 0i32, + }; + + let ref mut s = S { + field: 0i32, + field2: 0u64, + field3: 0 as *const S, + field4: t, + }; + s.field4.field4 = s.field4.field4; } #[no_mangle] pub unsafe extern "C" fn test_realloc_reassign() { From 31053a86aa31b87ed40b058ddfa6a9dff59cb33a Mon Sep 17 00:00:00 2001 From: aneksteind Date: Wed, 3 Aug 2022 14:56:04 -0400 Subject: [PATCH 5/5] update snapshot --- dynamic_instrumentation/src/instrument.rs | 2 +- ...dg__tests__analysis_test_pdg_snapshot.snap | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/dynamic_instrumentation/src/instrument.rs b/dynamic_instrumentation/src/instrument.rs index 793a480c4f..ce1af4e542 100644 --- a/dynamic_instrumentation/src/instrument.rs +++ b/dynamic_instrumentation/src/instrument.rs @@ -232,7 +232,7 @@ impl<'tcx> Visitor<'tcx> for InstrumentationAdder<'_, 'tcx> { Rvalue::AddressOf(_, p) if has_outer_deref(p) && place_ty(&remove_outer_deref(*p, self.tcx())).is_region_ptr() => - { + { let source = remove_outer_deref(*p, self.tcx()); // Instrument which local's address is taken self.loc(location.successor_within_block(), copy_fn) diff --git a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap index 552226ad3c..844dd8488a 100644 --- a/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap +++ b/pdg/src/snapshots/c2rust_pdg__tests__analysis_test_pdg_snapshot.snap @@ -64,6 +64,8 @@ g { n[1]: copy n[0] => _2 @ bb0[0]: fn push; _36 = push(move _37, move _38); n[2]: value.store _ => _20.* @ bb4[8]: fn invalid; (*_20) = const 0_usize as *mut pointers::S (Misc); n[3]: value.store _ => _17.* @ bb8[5]: fn fdevent_unregister; (*_17) = const 0_usize as *mut pointers::fdnode_st (Misc); + n[4]: int_to_ptr _ => _2 @ bb0[3]: fn test_ref_field; _2 = const 0_usize as *const pointers::S (Misc); + n[5]: int_to_ptr _ => _5 @ bb0[9]: fn test_ref_field; _5 = const 0_usize as *const pointers::S (Misc); } nodes_that_need_write = [] @@ -965,21 +967,16 @@ g { nodes_that_need_write = [75, 74, 73, 66, 65, 64, 63, 62, 61, 54, 53, 52, 45, 44, 43, 33, 32, 31, 27, 26, 25, 15, 14, 13, 6, 5, 4, 0] g { - n[0]: alloc _ => _2 @ bb1[2]: fn test_ref_field; _2 = calloc(move _3, move _4); - n[1]: copy n[0] => _1 @ bb2[3]: fn test_ref_field; _1 = move _2 as *mut pointers::S (Misc); - n[2]: copy n[1] => _6 @ bb2[6]: fn test_ref_field; _6 = &mut (*_1); - n[3]: field.3 n[2] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[4]: field.3 n[3] => _7 @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[5]: addr.load n[4] => _ @ bb2[9]: fn test_ref_field; _7 = (((*_6).3: pointers::T).3: i32); - n[6]: field.3 n[2] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[7]: field.3 n[6] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[8]: addr.store n[7] => _ @ bb2[10]: fn test_ref_field; (((*_6).3: pointers::T).3: i32) = move _7; - n[9]: copy n[2] => _10 @ bb2[16]: fn test_ref_field; _10 = &raw mut (*_6); - n[10]: copy n[9] => _9 @ bb2[17]: fn test_ref_field; _9 = move _10 as *mut libc::c_void (Misc); - n[11]: free n[10] => _8 @ bb2[18]: fn test_ref_field; _8 = free(move _9); + n[0]: &_4 _ => _3 @ bb0[15]: fn test_ref_field; _3 = &mut _4; + n[1]: field.3 n[0] => _ @ bb0[17]: fn test_ref_field; _7 = (((*_3).3: pointers::T).3: i32); + n[2]: field.3 n[1] => _7 @ bb0[17]: fn test_ref_field; _7 = (((*_3).3: pointers::T).3: i32); + n[3]: addr.load n[2] => _ @ bb0[17]: fn test_ref_field; _7 = (((*_3).3: pointers::T).3: i32); + n[4]: field.3 n[0] => _ @ bb0[18]: fn test_ref_field; (((*_3).3: pointers::T).3: i32) = move _7; + n[5]: field.3 n[4] => _ @ bb0[18]: fn test_ref_field; (((*_3).3: pointers::T).3: i32) = move _7; + n[6]: addr.store n[5] => _ @ bb0[18]: fn test_ref_field; (((*_3).3: pointers::T).3: i32) = move _7; } -nodes_that_need_write = [8, 7, 6, 2, 1, 0] +nodes_that_need_write = [6, 5, 4, 0] num_graphs = 77 -num_nodes = 670 +num_nodes = 667