8000 Enable `unsafe_op_in_unsafe_fn` and `missing_unsafe_on_extern` lints … · RustPython/RustPython@ff9947f · GitHub
[go: up one dir, main page]

Skip to content

Commit ff9947f

Browse files
authored
Enable unsafe_op_in_unsafe_fn and missing_unsafe_on_extern lints (#5557)
* Enable unsafe_op_in_unsafe_fn lint * Enable missing_unsafe_on_extern lint * Make PyObjectRef::{from,into}_raw() use NonNull
2 parents 52208b3 + 92e02a7 commit ff9947f

File tree

32 files changed

+187
-157
lines changed

32 files changed

+187
-157
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ wasm-bindgen = "0.2.100"
189189

190190
[workspace.lints.rust]
191191
unsafe_code = "allow"
192+
unsafe_op_in_unsafe_fn = "deny"
193+
missing_unsafe_on_extern = "deny"
194+
unsafe_attr_outside_unsafe = "deny"
192195

193196
[workspace.lints.clippy]
194197
perf = "warn"

common/src/boxvec.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,16 @@ impl<T> BoxVec<T> {
8787
pub unsafe fn push_unchecked(&mut self, element: T) {
8888
let len = self.len();
8989
debug_assert!(len < self.capacity());
90-
ptr::write(self.get_unchecked_ptr(len), element);
91-
self.set_len(len + 1);
90+
// SAFETY: len < capacity
91+
unsafe {
92+
ptr::write(self.get_unchecked_ptr(len), element);
93+
self.set_len(len + 1);
94+
}
9295
}
9396

9497
/// Get pointer to where element at `index` would be
9598
unsafe fn get_unchecked_ptr(&mut self, index: usize) -> *mut T {
96-
self.xs.as_mut_ptr().add(index).cast()
99+
unsafe { self.xs.as_mut_ptr().add(index).cast() }
97100
}
98101

99102
pub fn insert(&mut self, index: usize, element: T) {
@@ -568,15 +571,15 @@ unsafe fn raw_ptr_add<T>(ptr: *mut T, offset: usize) -> *mut T {
568571
// Special case for ZST
569572
(ptr as usize).wrapping_add(offset) as _
570573
} else {
571-
ptr.add(offset)
574+
unsafe { ptr.add(offset) }
572575
}
573576
}
574577

575578
unsafe fn raw_ptr_write<T>(ptr: *mut T, value: T) {
576579
if mem::size_of::<T>() == 0 {
577580
/* nothing */
578581
} else {
579-
ptr::write(ptr, value)
582+
unsafe { ptr::write(ptr, value) }
580583
}
581584
}
582585

common/src/crt_fd.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{cmp, ffi, io};
66
#[cfg(windows)]
77
use libc::commit as fsync;
88
#[cfg(windows)]
9-
extern "C" {
9+
unsafe extern "C" {
1010
#[link_name = "_chsize_s"]
1111
fn ftruncate(fd: i32, len: i64) -> i32;
1212
}
@@ -74,7 +74,7 @@ impl Fd {
7474

7575
#[cfg(windows)]
7676
pub fn to_raw_handle(&self) -> io::Result<std::os::windows::io::RawHandle> {
77-
extern "C" {
77+
unsafe extern "C" {
7878
fn _get_osfhandle(fd: i32) -> libc::intptr_t;
7979
}
8080
let handle = unsafe { suppress_iph!(_get_osfhandle(self.0)) };

common/src/encodings.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ struct DecodeError<'a> {
4242
/// # Safety
4343
/// `v[..valid_up_to]` must be valid utf8
4444
unsafe fn make_decode_err(v: &[u8], valid_up_to: usize, err_len: Option<usize>) -> DecodeError<'_> {
45-
let valid_prefix = core::str::from_utf8_unchecked(v.get_unchecked(..valid_up_to));
46-
let rest = v.get_unchecked(valid_up_to..);
45+
let (valid_prefix, rest) = unsafe { v.split_at_unchecked(valid_up_to) };
46+
let valid_prefix = unsafe { core::str::from_utf8_unchecked(valid_prefix) };
4747
DecodeError {
4848
valid_prefix,
4949
rest,

common/src/fileutils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub mod windows {
9494
}
9595
}
9696

97-
extern "C" {
97+
unsafe extern "C" {
9898
fn _get_osfhandle(fd: i32) -> libc::intptr_t;
9999
}
100100

common/src/linked_list.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -208,37 +208,39 @@ impl<L: Link> LinkedList<L, L::Target> {
208208
/// The caller **must** ensure that `node` is currently contained by
209209
/// `self` or not contained by any other list.
210210
pub unsafe fn remove(&mut self, node: NonNull<L::Target>) -> Option<L::Handle> {
211-
if let Some(prev) = L::pointers(node).as_ref().get_prev() {
212-
debug_assert_eq!(L::pointers(prev).as_ref().get_next(), Some(node));
213-
L::pointers(prev)
214-
.as_mut()
215-
.set_next(L::pointers(node).as_ref().get_next());
216-
} else {
217-
if self.head != Some(node) {
218-
return None;
211+
unsafe {
212+
if let Some(prev) = L::pointers(node).as_ref().get_prev() {
213+
debug_assert_eq!(L::pointers(prev).as_ref().get_next(), Some(node));
214+
L::pointers(prev)
215+
.as_mut()
216+
.set_next(L::pointers(node).as_ref().get_next());
217+
} else {
218+
if self.head != Some(node) {
219+
return None;
220+
}
221+
222+
self.head = L::pointers(node).as_ref().get_next();
219223
}
220224

221-
self.head = L::pointers(node).as_ref().get_next();
222-
}
225+
if let Some(next) = L::pointers(node).as_ref().get_next() {
226+
debug_assert_eq!(L::pointers(next).as_ref().get_prev(), Some(node));
227+
L::pointers(next)
228+
.as_mut()
229+
.set_prev(L::pointers(node).as_ref().get_prev());
230+
} else {
231+
// // This might be the last item in the list
232+
// if self.tail != Some(node) {
233+
// return None;
234+
// }
235+
236+
// self.tail = L::pointers(node).as_ref().get_prev();
237+
}
223238

224-
if let Some(next) = L::pointers(node).as_ref().get_next() {
225-
debug_assert_eq!(L::pointers(next).as_ref().get_prev(), Some(node));
226-
L::pointers(next)
227-
.as_mut()
228-
.set_prev(L::pointers(node).as_ref().get_prev());
229-
} else {
230-
// // This might be the last item in the list
231-
// if self.tail != Some(node) {
232-
// return None;
233-
// }
239+
L::pointers(node).as_mut().set_next(None);
240+
L::pointers(node).as_mut().set_prev(None);
234241

235-
// self.tail = L::pointers(node).as_ref().get_prev();
242+
Some(L::from_raw(node))
236243
}
237-
238-
L::pointers(node).as_mut().set_next(None);
239-
L::pointers(node).as_mut().set_prev(None);
240-
241-
Some(L::from_raw(node))
242244
}
243245

244246
// pub fn last(&self) -> Option<&L::Target> {

common/src/lock/cell_lock.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ unsafe impl RawRwLockUpgrade for RawCellRwLock {
140140

141141
#[inline]
142142
unsafe fn unlock_upgradable(&self) {
143-
self.unlock_shared()
143+
unsafe { self.unlock_shared() }
144144
}
145145

146146
#[inline]
147147
unsafe fn upgrade(&self) {
148-
if !self.try_upgrade() {
148+
if !unsafe { self.try_upgrade() } {
149149
deadlock("upgrade ", "RwLock")
150150
}
151151
}

common/src/lock/thread_mutex.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ impl<R: RawMutex, G: GetThreadId> RawThreadMutex<R, G> {
6565
/// This method may only be called if the mutex is held by the current thread.
6666
pub unsafe fn unlock(&self) {
6767
self.owner.store(0, Ordering::Relaxed);
68-
self.mutex.unlock();
68+
unsafe { self.mutex.unlock() };
6969
}
7070
}
7171

common/src/macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub mod __macro_private {
4141
libc::uintptr_t,
4242
);
4343
#[cfg(target_env = "msvc")]
44-
extern "C" {
44+
unsafe extern "C" {
4545
pub fn _set_thread_local_invalid_parameter_handler(
4646
pNew: InvalidParamHandler,
4747
) -> InvalidParamHandler;

common/src/os.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub fn last_os_error() -> io::Error {
2323
let err = io::Error::last_os_error();
2424
// FIXME: probably not ideal, we need a bigger dichotomy between GetLastError and errno
2525
if err.raw_os_error() == Some(0) {
26-
extern "C" {
26+
unsafe extern "C" {
2727
fn _get_errno(pValue: *mut i32) -> i32;
2828
}
2929
let mut errno = 0;
@@ -44,7 +44,7 @@ pub fn last_os_error() -> io::Error {
4444
pub fn last_posix_errno() -> i32 {
4545
let err = io::Error::last_os_error();
4646
if err.raw_os_error() == Some(0) {
47-
extern "C" {
47+
unsafe extern "C" {
4848
fn _get_errno(pValue: *mut i32) -> i32;
4949
}
5050
let mut errno = 0;

compiler/core/src/bytecode.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,10 +293,8 @@ impl<T: OpArgType> Arg<T> {
293293
/// # Safety
294294
/// T::from_op_arg(self) must succeed
295295
pub unsafe fn get_unchecked(self, arg: OpArg) -> T {
296-
match T::from_op_arg(arg.0) {
297-
Some(t) => t,
298-
None => std::hint::unreachable_unchecked(),
299-
}
296+
// SAFETY: requirements forwarded from caller
297+
unsafe { T::from_op_arg(arg.0).unwrap_unchecked() }
300298
}
301299
}
302300

jit/src/lib.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,14 @@ impl CompiledCode {
152152
}
153153

154154
unsafe fn invoke_raw(&self, cif_args: &[libffi::middle::Arg]) -> Option<AbiValue> {
155-
let cif = self.sig.to_cif();
156-
let value = cif.call::<UnTypedAbiValue>(
157-
libffi::middle::CodePtr::from_ptr(self.code as *const _),
158-
cif_args,
159-
);
160-
self.sig.ret.as_ref().map(|ty| value.to_typed(ty))
155+
unsafe {
156+
let cif = self.sig.to_cif();
157+
let value = cif.call::<UnTypedAbiValue>(
158+
libffi::middle::CodePtr::from_ptr(self.code as *const _),
159+
cif_args,
160+
);
161+
self.sig.ret.as_ref().map(|ty| value.to_typed(ty))
162+
}
161163
}
162164
}
163165

@@ -290,10 +292,12 @@ union UnTypedAbiValue {
290292

291293
impl UnTypedAbiValue {
292294
unsafe fn to_typed(self, ty: &JitType) -> AbiValue {
293-
match ty {
294-
JitType::Int => AbiValue::Int(self.int),
295-
JitType::Float => AbiValue::Float(self.float),
296-
JitType::Bool => AbiValue::Bool(self.boolean != 0),
295+
unsafe {
296+
match ty {
297+
JitType::Int => AbiValue::Int(self.int),
298+
JitType::Float => AbiValue::Float(self.float),
299+
JitType::Bool => AbiValue::Bool(self.boolean != 0),
300+
}
297301
}
298302
}
299303
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub fn run(init: impl FnOnce(&mut VirtualMachine) + 'static) -> ExitCode {
7878
// don't translate newlines (\r\n <=> \n)
7979
#[cfg(windows)]
8080
{
81-
extern "C" {
81+
unsafe extern "C" {
8282
fn _setmode(fd: i32, flags: i32) -> i32;
8383
}
8484
unsafe {

stdlib/src/locale.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct lconv {
3030
}
3131

3232
#[cfg(windows)]
33-
extern "C" {
33+
unsafe extern "C" {
3434
fn localeconv() -> *mut lconv;
3535
}
3636

@@ -78,11 +78,13 @@ mod _locale {
7878
return vm.ctx.new_list(group_vec);
7979
}
8080

81-
let mut ptr = group;
82-
while ![0, libc::c_char::MAX].contains(&*ptr) {
83-
let val = vm.ctx.new_int(*ptr);
84-
group_vec.push(val.into());
85-
ptr = ptr.add(1);
81+
unsafe {
82+
let mut ptr = group;
83+
while ![0, libc::c_char::MAX].contains(&*ptr) {
84+
let val = vm.ctx.new_int(*ptr);
85+
group_vec.push(val.into());
86+
ptr = ptr.add(1);
87+
}
8688
}
8789
// https://github.com/python/cpython/blob/677320348728ce058fa3579017e985af74a236d4/Modules/_localemodule.c#L80
8890
if !group_vec.is_empty() {

stdlib/src/select.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,30 @@ mod platform {
3636
// based off winsock2.h: https://gist.github.com/piscisaureus/906386#file-winsock2-h-L128-L141
3737

3838
pub unsafe fn FD_SET(fd: RawFd, set: *mut fd_set) {
39-
let mut slot = (&raw mut (*set).fd_array).cast::<RawFd>();
40-
let fd_count = (*set).fd_count;
41-
for _ in 0..fd_count {
42-
if *slot == fd {
43-
return;
39+
unsafe {
40+
let mut slot = (&raw mut (*set).fd_array).cast::<RawFd>();
41+
let fd_count = (*set).fd_count;
42+
for _ in 0..fd_count {
43+
if *slot == fd {
44+
return;
45+
}
46+
slot = slot.add(1);
47+
}
48+
// slot == &fd_array[fd_count] at this point
49+
if fd_count < FD_SETSIZE {
50+
*slot = fd as RawFd;
51+
(*set).fd_count += 1;
4452
}
45-
slot = slot.add(1);
46-
}
47-
// slot == &fd_array[fd_count] at this point
48-
if fd_count < FD_SETSIZE {
49-
*slot = fd as RawFd;
50-
(*set).fd_count += 1;
5153
}
5254
}
5355

5456
pub unsafe fn FD_ZERO(set: *mut fd_set) {
55-
(*set).fd_count = 0;
57+
unsafe { (*set).fd_count = 0 };
5658
}
5759

5860
pub unsafe fn FD_ISSET(fd: RawFd, set: *mut fd_set) -> bool {
5961
use WinSock::__WSAFDIsSet;
60-
__WSAFDIsSet(fd as _, set) != 0
62+
unsafe { __WSAFDIsSet(fd as _, set) != 0 }
6163
}
6264

6365
pub fn check_err(x: i32) -> bool {
@@ -82,7 +84,7 @@ mod platform {
8284

8385
#[allow(non_snake_case)]
8486
pub unsafe fn FD_ISSET(fd: RawFd, set: *const fd_set) -> bool {
85-
let set = &*set;
87+
let set = unsafe { &*set };
8688
let n = set.__nfds;
8789
for p in &set.__fds[..n] {
8890
if *p == fd {
@@ -94,7 +96,7 @@ mod platform {
9496

9597
#[allow(non_snake_case)]
9698
pub unsafe fn FD_SET(fd: RawFd, set: *mut fd_set) {
97-
let set = &mut *set;
99+
let set = unsafe { &mut *set };
98100
let n = set.__nfds;
99101
for p in &set.__fds[..n] {
100102
if *p == fd {
@@ -107,11 +109,11 @@ mod platform {
107109

108110
#[allow(non_snake_case)]
109111
pub unsafe fn FD_ZERO(set: *mut fd_set) {
110-
let set = &mut *set;
112+
let set = unsafe { &mut *set };
111113
set.__nfds = 0;
112114
}
113115

114-
extern "C" {
116+
unsafe extern "C" {
115117
pub fn select(
116118
nfds: libc::c_int,
117119
readfds: *mut fd_set,

stdlib/src/socket.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,7 +1788,7 @@ mod _socket {
17881788
}
17891789

17901790
unsafe fn slice_as_uninit<T>(v: &mut [T]) -> &mut [MaybeUninit<T>] {
1791-
&mut *(v as *mut [T] as *mut [MaybeUninit<T>])
1791+
unsafe { &mut *(v as *mut [T] as *mut [MaybeUninit<T>]) }
17921792
}
17931793

17941794
enum IoOrPyException {
@@ -2312,12 +2312,12 @@ mod _socket {
23122312
#[cfg(unix)]
23132313
{
23142314
use std::os::unix::io::FromRawFd;
2315-
Socket::from_raw_fd(fileno)
2315+
unsafe { Socket::from_raw_fd(fileno) }
23162316
}
23172317
#[cfg(windows)]
23182318
{
23192319
use std::os::windows::io::FromRawSocket;
2320-
Socket::from_raw_socket(fileno)
2320+
unsafe { Socket::from_raw_socket(fileno) }
23212321
}
23222322
}
23232323
pub(super) fn sock_fileno(sock: &Socket) -> RawSocket {

0 commit comments

Comments
 (0)
0