string: address performance concerns for strncmp()
Created by: Arcterus
Not sure why but I couldn't test this using the test suite, so I had to manually test the function. It seems to work fine though (e.g. no overflows when doing a - b
).
Merge request reports
Activity
156 156 157 157 #[no_mangle] 158 158 pub unsafe extern "C" fn strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int { 159 let s1 = platform::c_str_n(s1, n); 160 let s2 = platform::c_str_n(s2, n); 161 162 let min_len = n.min(s1.len()).min(s2.len()); 163 for i in 0..min_len { 164 let val = s1[i] - s2[i]; 165 if val != 0 { 166 return val as c_int; 159 let s1 = core::slice::from_raw_parts(s1 as *const c_uchar, n); 160 let s2 = core::slice::from_raw_parts(s2 as *const c_uchar, n); 156 156 157 157 #[no_mangle] 158 158 pub unsafe extern "C" fn strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int { 159 let s1 = platform::c_str_n(s1, n); 160 let s2 = platform::c_str_n(s2, n); 161 162 let min_len = n.min(s1.len()).min(s2.len()); 163 for i in 0..min_len { 164 let val = s1[i] - s2[i]; 165 if val != 0 { 166 return val as c_int; 159 let s1 = core::slice::from_raw_parts(s1 as *const c_uchar, n); 160 let s2 = core::slice::from_raw_parts(s2 as *const c_uchar, n); 156 156 157 157 #[no_mangle] 158 158 pub unsafe extern "C" fn strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int { 159 let s1 = platform::c_str_n(s1, n); 160 let s2 = platform::c_str_n(s2, n); 161 162 let min_len = n.min(s1.len()).min(s2.len()); 163 for i in 0..min_len { 164 let val = s1[i] - s2[i]; 165 if val != 0 { 166 return val as c_int; 159 let s1 = core::slice::from_raw_parts(s1 as *const c_uchar, n); 160 let s2 = core::slice::from_raw_parts(s2 as *const c_uchar, n); 156 156 157 157 #[no_mangle] 158 158 pub unsafe extern "C" fn strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int { 159 let s1 = platform::c_str_n(s1, n); 160 let s2 = platform::c_str_n(s2, n); 161 162 let min_len = n.min(s1.len()).min(s2.len()); 163 for i in 0..min_len { 164 let val = s1[i] - s2[i]; 165 if val != 0 { 166 return val as c_int; 159 let s1 = core::slice::from_raw_parts(s1 as *const c_uchar, n); 160 let s2 = core::slice::from_raw_parts(s2 as *const c_uchar, n); 156 156 157 157 #[no_mangle] 158 158 pub unsafe extern "C" fn strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int { 159 let s1 = platform::c_str_n(s1, n); 160 let s2 = platform::c_str_n(s2, n); 161 162 let min_len = n.min(s1.len()).min(s2.len()); 163 for i in 0..min_len { 164 let val = s1[i] - s2[i]; 165 if val != 0 { 166 return val as c_int; 159 let s1 = core::slice::from_raw_parts(s1 as *const c_uchar, n); 160 let s2 = core::slice::from_raw_parts(s2 as *const c_uchar, n);
Please register or sign in to reply