smartlist.rs: do not use i8 interchangeably with libc::c_char
I tried to look at why our arm rust builds are failing, and found these warnings:
20:53:59 --> /srv/jenkins-workspace/workspace/tor-ci-linux-master-rust-arm/ARCHITECTURE/armhf/SUITE/sid/tor/src/rust/smartlist/smartlist.rs:37:44
20:53:59 |
20:53:59 37 | unsafe { slice::from_raw_parts(self.list, self.num_used as usize) };
20:53:59 | ^^^^^^^^^ expected i8, found u8
20:53:59 |
20:53:59 = note: expected type `*const *const i8`
20:53:59 found type `*const *const u8`
20:53:59
20:53:59 error[E0308]: mismatched types
20:53:59 --> /srv/jenkins-workspace/workspace/tor-ci-linux-master-rust-arm/ARCHITECTURE/armhf/SUITE/sid/tor/src/rust/smartlist/smartlist.rs:46:52
20:53:59 |
20:53:59 46 | let c_string = unsafe { CStr::from_ptr(*elem) };
20:53:59 | ^^^^^ expected u8, found i8
20:53:59 |
20:53:59 = note: expected type `*const u8`
20:53:59 found type `*const i8`
20:53:59
They happen because we're declaring Stringlist::list as c_char
, but we're declaring elems as i8
. That's fine on platforms where C's char
is signed, but on other platforms, char
is unsigned, and libc::c_char is u8
.
I believe we can fix this by changing i8
to c_char
on this line:
let elems: &[*const i8] =
unsafe { slice::from_raw_parts(self.list, self.num_used as usize) };