Skip to content

Commit 31386c1

Browse files
committed
Revert "fix(ffi): Fix memory leaks in FFIArray test cleanup"
This reverts commit 5fcb0ea.
1 parent 6942c0d commit 31386c1

3 files changed

Lines changed: 44 additions & 40 deletions

File tree

dash-spv-ffi/tests/test_types.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ mod tests {
4343
fn test_ffi_array_new_and_destroy() {
4444
let test_data = vec![1u32, 2, 3, 4, 5];
4545
let len = test_data.len();
46-
let mut array = FFIArray::new(test_data);
46+
let array = FFIArray::new(test_data);
4747

4848
assert!(!array.data.is_null());
4949
assert_eq!(array.len, len);
@@ -54,22 +54,26 @@ mod tests {
5454
assert_eq!(slice.len(), len);
5555
assert_eq!(slice, &[1, 2, 3, 4, 5]);
5656

57-
dash_spv_ffi_array_destroy(&mut array as *mut FFIArray);
57+
// Allocate on heap for proper FFI destroy
58+
let array_ptr = Box::into_raw(Box::new(array));
59+
dash_spv_ffi_array_destroy(array_ptr);
5860
}
5961
}
6062

6163
#[test]
6264
fn test_ffi_array_empty() {
6365
let empty_vec: Vec<u8> = vec![];
64-
let mut array = FFIArray::new(empty_vec);
66+
let array = FFIArray::new(empty_vec);
6567

6668
assert_eq!(array.len, 0);
6769

6870
unsafe {
6971
let slice = array.as_slice::<u8>();
7072
assert_eq!(slice.len(), 0);
7173

72-
dash_spv_ffi_array_destroy(&mut array as *mut FFIArray);
74+
// Allocate on heap for proper FFI destroy
75+
let array_ptr = Box::into_raw(Box::new(array));
76+
dash_spv_ffi_array_destroy(array_ptr);
7377
}
7478
}
7579

dash-spv-ffi/tests/unit/test_memory_management.rs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,25 +45,25 @@ mod tests {
4545
unsafe {
4646
// Test with different types and sizes
4747
let small_array: Vec<u32> = vec![1, 2, 3, 4, 5];
48-
let mut small_ffi = FFIArray::new(small_array);
48+
let small_ffi = FFIArray::new(small_array);
4949
assert!(!small_ffi.data.is_null());
5050
assert_eq!(small_ffi.len, 5);
51-
dash_spv_ffi_array_destroy(&mut small_ffi as *mut FFIArray);
51+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(small_ffi)));
5252

5353
// Test with large array
5454
let large_array: Vec<u64> = (0..100_000).collect();
55-
let mut large_ffi = FFIArray::new(large_array);
55+
let large_ffi = FFIArray::new(large_array);
5656
assert!(!large_ffi.data.is_null());
5757
assert_eq!(large_ffi.len, 100_000);
58-
dash_spv_ffi_array_destroy(&mut large_ffi as *mut FFIArray);
58+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(large_ffi)));
5959

6060
// Test with empty array
6161
let empty_array: Vec<u8> = vec![];
62-
let mut empty_ffi = FFIArray::new(empty_array);
62+
let empty_ffi = FFIArray::new(empty_array);
6363
// Even empty arrays have valid pointers
6464
assert!(!empty_ffi.data.is_null());
6565
assert_eq!(empty_ffi.len, 0);
66-
dash_spv_ffi_array_destroy(&mut empty_ffi as *mut FFIArray);
66+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(empty_ffi)));
6767
}
6868
}
6969

@@ -125,12 +125,12 @@ mod tests {
125125
// Each thread creates and destroys arrays
126126
for j in 0..50 {
127127
let array: Vec<u32> = (0..j * 10).collect();
128-
let mut ffi_array = FFIArray::new(array);
128+
let ffi_array = FFIArray::new(array);
129129

130130
// Simulate some work
131131
thread::sleep(Duration::from_micros(10));
132132

133-
dash_spv_ffi_array_destroy(&mut ffi_array as *mut FFIArray);
133+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(ffi_array)));
134134
}
135135
}
136136
});
@@ -163,11 +163,11 @@ mod tests {
163163

164164
// Array allocation
165165
let large_array: Vec<u8> = vec![0xFF; size];
166-
let mut ffi_array = FFIArray::new(large_array);
166+
let ffi_array = FFIArray::new(large_array);
167167
assert!(!ffi_array.data.is_null());
168168
assert_eq!(ffi_array.len, size);
169169

170-
dash_spv_ffi_array_destroy(&mut ffi_array as *mut FFIArray);
170+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(ffi_array)));
171171
}
172172
}
173173
}
@@ -192,18 +192,18 @@ mod tests {
192192
dash_spv_ffi_string_destroy(null_string);
193193

194194
// Test with array
195-
let mut ffi_array = FFIArray::new(vec![1u32, 2, 3]);
196-
dash_spv_ffi_array_destroy(&mut ffi_array as *mut FFIArray);
195+
let ffi_array = FFIArray::new(vec![1u32, 2, 3]);
196+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(ffi_array)));
197197

198198
// Destroying with null should be safe
199-
let mut null_array = FFIArray {
199+
let null_array = FFIArray {
200200
data: std::ptr::null_mut(),
201201
len: 0,
202202
capacity: 0,
203203
elem_size: 0,
204204
elem_align: 1,
205205
};
206-
dash_spv_ffi_array_destroy(&mut null_array as *mut FFIArray);
206+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(null_array)));
207207
}
208208
}
209209

@@ -215,21 +215,21 @@ mod tests {
215215

216216
// u8 - 1 byte alignment
217217
let u8_array = vec![1u8, 2, 3, 4];
218-
let mut u8_ffi = FFIArray::new(u8_array);
218+
let u8_ffi = FFIArray::new(u8_array);
219219
assert_eq!(u8_ffi.data as usize % std::mem::align_of::<u8>(), 0);
220-
dash_spv_ffi_array_destroy(&mut u8_ffi as *mut FFIArray);
220+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(u8_ffi)));
221221

222222
// u32 - 4 byte alignment
223223
let u32_array = vec![1u32, 2, 3, 4];
224-
let mut u32_ffi = FFIArray::new(u32_array);
224+
let u32_ffi = FFIArray::new(u32_array);
225225
assert_eq!(u32_ffi.data as usize % std::mem::align_of::<u32>(), 0);
226-
dash_spv_ffi_array_destroy(&mut u32_ffi as *mut FFIArray);
226+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(u32_ffi)));
227227

228228
// u64 - 8 byte alignment
229229
let u64_array = vec![1u64, 2, 3, 4];
230-
let mut u64_ffi = FFIArray::new(u64_array);
230+
let u64_ffi = FFIArray::new(u64_array);
231231
assert_eq!(u64_ffi.data as usize % std::mem::align_of::<u64>(), 0);
232-
dash_spv_ffi_array_destroy(&mut u64_ffi as *mut FFIArray);
232+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(u64_ffi)));
233233
}
234234
}
235235

@@ -341,10 +341,10 @@ mod tests {
341341

342342
// Empty array
343343
let empty_vec: Vec<u8> = vec![];
344-
let mut empty_array = FFIArray::new(empty_vec);
344+
let empty_array = FFIArray::new(empty_vec);
345345
assert!(!empty_array.data.is_null());
346346
assert_eq!(empty_array.len, 0);
347-
dash_spv_ffi_array_destroy(&mut empty_array as *mut FFIArray);
347+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(empty_array)));
348348
}
349349
}
350350

@@ -407,8 +407,8 @@ mod tests {
407407
dash_spv_ffi_string_destroy(s);
408408
}
409409

410-
for mut a in arrays {
411-
dash_spv_ffi_array_destroy(&mut a as *mut FFIArray);
410+
for a in arrays {
411+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(a)));
412412
}
413413

414414
cycle += 1;
@@ -424,7 +424,7 @@ mod tests {
424424
// Test that memory allocated in one thread can be safely used in another
425425
unsafe {
426426
let string = FFIString::new("Allocated in thread 1");
427-
let mut array = FFIArray::new(vec![1u32, 2, 3, 4, 5]);
427+
let array = FFIArray::new(vec![1u32, 2, 3, 4, 5]);
428428

429429
// Verify we can read the data
430430
let s = FFIString::from_ptr(string.ptr).unwrap();
@@ -435,7 +435,7 @@ mod tests {
435435

436436
// Clean up
437437
dash_spv_ffi_string_destroy(string);
438-
dash_spv_ffi_array_destroy(&mut array as *mut FFIArray);
438+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(array)));
439439
}
440440
}
441441
}

dash-spv-ffi/tests/unit/test_type_conversions.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,60 +61,60 @@ mod tests {
6161
fn test_ffi_array_different_sizes() {
6262
// Test empty array
6363
let empty: Vec<u32> = vec![];
64-
let mut empty_array = FFIArray::new(empty);
64+
let empty_array = FFIArray::new(empty);
6565
assert_eq!(empty_array.len, 0);
6666
assert!(!empty_array.data.is_null()); // Even empty vec has allocated pointer
6767
unsafe {
6868
let slice = empty_array.as_slice::<u32>();
6969
assert_eq!(slice.len(), 0);
70-
dash_spv_ffi_array_destroy(&mut empty_array as *mut FFIArray);
70+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(empty_array)));
7171
}
7272

7373
// Test single element
7474
let single = vec![42u32];
75-
let mut single_array = FFIArray::new(single);
75+
let single_array = FFIArray::new(single);
7676
assert_eq!(single_array.len, 1);
7777
unsafe {
7878
let slice = single_array.as_slice::<u32>();
7979
assert_eq!(slice.len(), 1);
8080
assert_eq!(slice[0], 42);
81-
dash_spv_ffi_array_destroy(&mut single_array as *mut FFIArray);
81+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(single_array)));
8282
}
8383

8484
// Test large array
8585
let large: Vec<u32> = (0..10000).collect();
86-
let mut large_array = FFIArray::new(large.clone());
86+
let large_array = FFIArray::new(large.clone());
8787
assert_eq!(large_array.len, 10000);
8888
unsafe {
8989
let slice = large_array.as_slice::<u32>();
9090
assert_eq!(slice.len(), 10000);
9191
for (i, &val) in slice.iter().enumerate() {
9292
assert_eq!(val, i as u32);
9393
}
94-
dash_spv_ffi_array_destroy(&mut large_array as *mut FFIArray);
94+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(large_array)));
9595
}
9696
}
9797

9898
#[test]
9999
fn test_ffi_array_memory_alignment() {
100100
// Test with u8
101101
let bytes: Vec<u8> = vec![1, 2, 3, 4];
102-
let mut byte_array = FFIArray::new(bytes);
102+
let byte_array = FFIArray::new(bytes);
103103
unsafe {
104104
let slice = byte_array.as_slice::<u8>();
105105
assert_eq!(slice, &[1, 2, 3, 4]);
106-
dash_spv_ffi_array_destroy(&mut byte_array as *mut FFIArray);
106+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(byte_array)));
107107
}
108108

109109
// Test with u64 (requires 8-byte alignment)
110110
let longs: Vec<u64> = vec![u64::MAX, 0, 42];
111-
let mut long_array = FFIArray::new(longs);
111+
let long_array = FFIArray::new(longs);
112112
unsafe {
113113
let slice = long_array.as_slice::<u64>();
114114
assert_eq!(slice[0], u64::MAX);
115115
assert_eq!(slice[1], 0);
116116
assert_eq!(slice[2], 42);
117-
dash_spv_ffi_array_destroy(&mut long_array as *mut FFIArray);
117+
dash_spv_ffi_array_destroy(Box::into_raw(Box::new(long_array)));
118118
}
119119
}
120120

0 commit comments

Comments
 (0)