Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.

Commit ded3b5b

Browse files
authored
chore: Add more lints (#70)
* chore: Add more lints Same as neqo. * Fix * Fix * Fixes * Fixes * clippy::unwrap-used in build.rs
1 parent bb286ef commit ded3b5b

File tree

7 files changed

+106
-68
lines changed

7 files changed

+106
-68
lines changed

.clippy.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
allow-mixed-uninlined-format-args = false
2+
allow-unwrap-in-tests = true
13
doc-valid-idents = ["NetBSD", "OpenBSD", ".."]

Cargo.toml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,42 @@ windows-bindgen = { version = "0.58", default-features = false, features = ["met
4444
[features]
4545
gecko = ["dep:mozbuild"]
4646

47+
[lints.rust]
48+
absolute_paths_not_starting_with_crate = "warn"
49+
ambiguous_negative_literals = "warn"
50+
closure_returning_async_block = "warn"
51+
explicit_outlives_requirements = "warn"
52+
macro_use_extern_crate = "warn"
53+
missing_abi = "warn"
54+
non_ascii_idents = "warn"
55+
redundant_imports = "warn"
56+
redundant_lifetimes = "warn"
57+
trivial_numeric_casts = "warn"
58+
unit_bindings = "warn"
59+
unused_import_braces = "warn"
60+
unused_lifetimes = "warn"
61+
unused_macro_rules = "warn"
62+
# unused_qualifications = "warn" # Try to re-enable when MSRV is > 1.76
63+
4764
[lints.clippy]
4865
cargo = { level = "warn", priority = -1 }
4966
nursery = { level = "warn", priority = -1 }
5067
pedantic = { level = "warn", priority = -1 }
68+
multiple_crate_versions = "allow"
69+
cfg_not_test = "warn"
70+
clone_on_ref_ptr = "warn"
71+
create_dir = "warn"
72+
if_then_some_else_none = "warn"
73+
get_unwrap = "warn"
74+
multiple_inherent_impl = "warn"
75+
pathbuf_init_then_push = "warn"
76+
redundant_type_annotations = "warn"
77+
ref_patterns = "warn"
78+
renamed_function_params = "warn"
79+
semicolon_inside_block = "warn"
80+
try_err = "warn"
81+
unneeded_field_pattern = "warn"
82+
unused_result_ok = "warn"
83+
unused_trait_names = "warn"
84+
unwrap_used = "warn"
85+
unwrap_in_result = "warn"

build.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
// option. This file may not be copied, modified, or distributed
55
// except according to those terms.
66

7+
#![allow(clippy::unwrap_used)] // OK in build scripts.
8+
79
const BINDINGS: &str = "bindings.rs";
810

911
#[cfg(feature = "gecko")]

src/bsd.rs

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66

77
use std::{
88
ffi::CStr,
9-
io::{Error, ErrorKind, Read, Result, Write},
9+
io::{Error, ErrorKind, Read as _, Result, Write as _},
1010
marker::PhantomData,
11-
mem::size_of,
1211
net::IpAddr,
1312
num::TryFromIntError,
1413
ops::Deref,
@@ -43,13 +42,13 @@ use crate::{
4342
};
4443

4544
#[cfg(apple)]
46-
const ALIGN: usize = size_of::<libc::c_int>();
45+
const ALIGN: usize = std::mem::size_of::<libc::c_int>();
4746

4847
#[cfg(bsd)]
4948
// See https://github.com/freebsd/freebsd-src/blob/524a425d30fce3d5e47614db796046830b1f6a83/sys/net/route.h#L362-L371
5049
// See https://github.com/NetBSD/src/blob/4b50954e98313db58d189dd87b4541929efccb09/sys/net/route.h#L329-L331
5150
// See https://github.com/Arquivotheca/Solaris-8/blob/2ad1d32f9eeed787c5adb07eb32544276e2e2444/osnet_volume/usr/src/cmd/cmd-inet/usr.sbin/route.c#L238-L239
52-
const ALIGN: usize = size_of::<libc::c_long>();
51+
const ALIGN: usize = std::mem::size_of::<libc::c_long>();
5352

5453
#[cfg(any(apple, target_os = "freebsd", target_os = "openbsd"))]
5554
asserted_const_with_type!(RTM_ADDRS, i32, RTA_DST, u32);
@@ -66,12 +65,12 @@ type AddressFamily = u16;
6665
asserted_const_with_type!(AF_INET, AddressFamily, libc::AF_INET, i32);
6766
asserted_const_with_type!(AF_INET6, AddressFamily, libc::AF_INET6, i32);
6867
asserted_const_with_type!(AF_LINK, AddressFamily, libc::AF_LINK, i32);
69-
asserted_const_with_type!(RTM_VERSION, u8, crate::bsd::bindings::RTM_VERSION, u32);
70-
asserted_const_with_type!(RTM_GET, u8, crate::bsd::bindings::RTM_GET, u32);
68+
asserted_const_with_type!(RTM_VERSION, u8, bindings::RTM_VERSION, u32);
69+
asserted_const_with_type!(RTM_GET, u8, bindings::RTM_GET, u32);
7170

72-
const_assert!(size_of::<sockaddr_in>() + ALIGN <= u8::MAX as usize);
73-
const_assert!(size_of::<sockaddr_in6>() + ALIGN <= u8::MAX as usize);
74-
const_assert!(size_of::<rt_msghdr>() <= u8::MAX as usize);
71+
const_assert!(std::mem::size_of::<sockaddr_in>() + ALIGN <= u8::MAX as usize);
72+
const_assert!(std::mem::size_of::<sockaddr_in6>() + ALIGN <= u8::MAX as usize);
73+
const_assert!(std::mem::size_of::<rt_msghdr>() <= u8::MAX as usize);
7574

7675
struct IfAddrs(*mut ifaddrs);
7776

@@ -104,7 +103,9 @@ impl Drop for IfAddrs {
104103
fn drop(&mut self) {
105104
if !self.0.is_null() {
106105
// Free the memory allocated by `getifaddrs`.
107-
unsafe { freeifaddrs(self.0) };
106+
unsafe {
107+
freeifaddrs(self.0);
108+
}
108109
}
109110
}
110111
}
@@ -115,7 +116,7 @@ struct IfAddrPtr<'a> {
115116
}
116117

117118
impl IfAddrPtr<'_> {
118-
fn addr(&self) -> libc::sockaddr {
119+
fn addr(&self) -> sockaddr {
119120
unsafe { *self.ifa_addr }
120121
}
121122

@@ -136,7 +137,7 @@ impl Deref for IfAddrPtr<'_> {
136137
type Target = ifaddrs;
137138

138139
fn deref(&self) -> &Self::Target {
139-
unsafe { self.ptr.as_ref().unwrap() }
140+
unsafe { self.ptr.as_ref().expect("can deref") }
140141
}
141142
}
142143

@@ -182,8 +183,8 @@ union SockaddrStorage {
182183

183184
fn sockaddr_len(af: AddressFamily) -> Result<usize> {
184185
let sa_len = match af {
185-
AF_INET => size_of::<sockaddr_in>(),
186-
AF_INET6 => size_of::<sockaddr_in6>(),
186+
AF_INET => std::mem::size_of::<sockaddr_in>(),
187+
AF_INET6 => std::mem::size_of::<sockaddr_in6>(),
187188
_ => {
188189
return Err(Error::new(
189190
ErrorKind::InvalidInput,
@@ -202,7 +203,7 @@ impl From<IpAddr> for SockaddrStorage {
202203
#[cfg(not(target_os = "solaris"))]
203204
#[allow(clippy::cast_possible_truncation)]
204205
// `sockaddr_in` len is <= u8::MAX per `const_assert!` above.
205-
sin_len: size_of::<sockaddr_in>() as u8,
206+
sin_len: std::mem::size_of::<sockaddr_in>() as u8,
206207
sin_family: AF_INET,
207208
sin_addr: in_addr {
208209
s_addr: u32::from_ne_bytes(ip.octets()),
@@ -216,7 +217,7 @@ impl From<IpAddr> for SockaddrStorage {
216217
#[cfg(not(target_os = "solaris"))]
217218
#[allow(clippy::cast_possible_truncation)]
218219
// `sockaddr_in6` len is <= u8::MAX per `const_assert!` above.
219-
sin6_len: size_of::<sockaddr_in6>() as u8,
220+
sin6_len: std::mem::size_of::<sockaddr_in6>() as u8,
220221
sin6_family: AF_INET6,
221222
sin6_addr: in6_addr {
222223
s6_addr: ip.octets(),
@@ -249,7 +250,7 @@ impl RouteMessage {
249250
rtm: rt_msghdr {
250251
#[allow(clippy::cast_possible_truncation)]
251252
// `rt_msghdr` len + `ALIGN` is <= u8::MAX per `const_assert!` above.
252-
rtm_msglen: (size_of::<rt_msghdr>() + sa_len) as u16,
253+
rtm_msglen: (std::mem::size_of::<rt_msghdr>() + sa_len) as u16,
253254
rtm_version: RTM_VERSION,
254255
rtm_type: RTM_GET,
255256
rtm_seq: seq,
@@ -275,14 +276,14 @@ impl RouteMessage {
275276

276277
impl From<&RouteMessage> for &[u8] {
277278
fn from(value: &RouteMessage) -> Self {
278-
debug_assert!(value.len() >= size_of::<Self>());
279+
debug_assert!(value.len() >= std::mem::size_of::<Self>());
279280
unsafe { slice::from_raw_parts(ptr::from_ref(value).cast(), value.len()) }
280281
}
281282
}
282283

283284
impl From<&[u8]> for rt_msghdr {
284285
fn from(value: &[u8]) -> Self {
285-
debug_assert!(value.len() >= size_of::<Self>());
286+
debug_assert!(value.len() >= std::mem::size_of::<Self>());
286287
unsafe { ptr::read_unaligned(value.as_ptr().cast()) }
287288
}
288289
}
@@ -303,15 +304,15 @@ fn if_index_mtu(remote: IpAddr) -> Result<(u16, Option<usize>)> {
303304
loop {
304305
let mut buf = vec![
305306
0u8;
306-
size_of::<rt_msghdr>() +
307+
std::mem::size_of::<rt_msghdr>() +
307308
// There will never be `RTAX_MAX` sockaddrs attached, but it's a safe upper bound.
308-
(RTAX_MAX as usize * size_of::<sockaddr_storage>())
309+
(RTAX_MAX as usize * std::mem::size_of::<sockaddr_storage>())
309310
];
310311
let len = fd.read(&mut buf[..])?;
311-
if len < size_of::<rt_msghdr>() {
312+
if len < std::mem::size_of::<rt_msghdr>() {
312313
return Err(default_err());
313314
}
314-
let (reply, mut sa) = buf.split_at(size_of::<rt_msghdr>());
315+
let (reply, mut sa) = buf.split_at(std::mem::size_of::<rt_msghdr>());
315316
let reply: rt_msghdr = reply.into();
316317
if !(reply.rtm_version == query_version
317318
&& reply.rtm_pid == pid
@@ -326,17 +327,10 @@ fn if_index_mtu(remote: IpAddr) -> Result<(u16, Option<usize>)> {
326327
// This is a reply to our query.
327328
// This is the reply we are looking for.
328329
// Some BSDs let us get the interface index and MTU directly from the reply.
329-
let mtu: Option<usize> = if reply.rtm_rmx.rmx_mtu != 0 {
330-
Some(
331-
reply
332-
.rtm_rmx
333-
.rmx_mtu
334-
.try_into()
335-
.map_err(|e: TryFromIntError| unlikely_err(e.to_string()))?,
336-
)
337-
} else {
338-
None
339-
};
330+
let mtu = (reply.rtm_rmx.rmx_mtu != 0)
331+
.then(|| usize::try_from(reply.rtm_rmx.rmx_mtu))
332+
.transpose()
333+
.map_err(|e: TryFromIntError| unlikely_err(e.to_string()))?;
340334
if reply.rtm_index != 0 {
341335
// Some BSDs return the interface index directly.
342336
return Ok((reply.rtm_index, mtu));

src/linux.rs

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
use std::{
88
ffi::CStr,
9-
io::{Error, ErrorKind, Read, Result, Write},
10-
mem::size_of,
9+
io::{Error, ErrorKind, Read as _, Result, Write as _},
1110
net::IpAddr,
1211
num::TryFromIntError,
1312
ptr, slice,
@@ -40,10 +39,10 @@ asserted_const_with_type!(NLM_F_REQUEST, u16, libc::NLM_F_REQUEST, c_int);
4039
asserted_const_with_type!(NLM_F_ACK, u16, libc::NLM_F_ACK, c_int);
4140
asserted_const_with_type!(NLMSG_ERROR, u16, libc::NLMSG_ERROR, c_int);
4241

43-
const_assert!(size_of::<nlmsghdr>() <= u8::MAX as usize);
44-
const_assert!(size_of::<rtmsg>() <= u8::MAX as usize);
45-
const_assert!(size_of::<rtattr>() <= u8::MAX as usize);
46-
const_assert!(size_of::<ifinfomsg>() <= u8::MAX as usize);
42+
const_assert!(std::mem::size_of::<nlmsghdr>() <= u8::MAX as usize);
43+
const_assert!(std::mem::size_of::<rtmsg>() <= u8::MAX as usize);
44+
const_assert!(std::mem::size_of::<rtattr>() <= u8::MAX as usize);
45+
const_assert!(std::mem::size_of::<ifinfomsg>() <= u8::MAX as usize);
4746

4847
const NETLINK_BUFFER_SIZE: usize = 8192; // See netlink(7) man page.
4948

@@ -96,8 +95,10 @@ impl IfIndexMsg {
9695
let addr = AddrBytes::new(remote);
9796
#[allow(clippy::cast_possible_truncation)]
9897
// Structs lens are <= u8::MAX per `const_assert!`s above; `addr_bytes` is max. 16 for IPv6.
99-
let nlmsg_len =
100-
(size_of::<nlmsghdr>() + size_of::<rtmsg>() + size_of::<rtattr>() + addr.len()) as u32;
98+
let nlmsg_len = (std::mem::size_of::<nlmsghdr>()
99+
+ std::mem::size_of::<rtmsg>()
100+
+ std::mem::size_of::<rtattr>()
101+
+ addr.len()) as u32;
101102
Self {
102103
nlmsg: nlmsghdr {
103104
nlmsg_len,
@@ -123,7 +124,7 @@ impl IfIndexMsg {
123124
rt: rtattr {
124125
#[allow(clippy::cast_possible_truncation)]
125126
// Structs len is <= u8::MAX per `const_assert!` above; `addr_bytes` is max. 16 for IPv6.
126-
rta_len: (size_of::<rtattr>() + addr.len()) as u16,
127+
rta_len: (std::mem::size_of::<rtattr>() + addr.len()) as u16,
127128
rta_type: RTA_DST,
128129
},
129130
addr: addr.into(),
@@ -132,7 +133,7 @@ impl IfIndexMsg {
132133

133134
const fn len(&self) -> usize {
134135
let len = self.nlmsg.nlmsg_len as usize;
135-
debug_assert!(len <= size_of::<Self>());
136+
debug_assert!(len <= std::mem::size_of::<Self>());
136137
len
137138
}
138139
}
@@ -147,16 +148,18 @@ impl TryFrom<&[u8]> for nlmsghdr {
147148
type Error = Error;
148149

149150
fn try_from(value: &[u8]) -> Result<Self> {
150-
if value.len() < size_of::<Self>() {
151+
if value.len() < std::mem::size_of::<Self>() {
151152
return Err(default_err());
152153
}
153154
Ok(unsafe { ptr::read_unaligned(value.as_ptr().cast()) })
154155
}
155156
}
156157

157158
fn parse_c_int(buf: &[u8]) -> Result<c_int> {
158-
let bytes = <&[u8] as TryInto<[u8; size_of::<c_int>()]>>::try_into(&buf[..size_of::<c_int>()])
159-
.map_err(|_| default_err())?;
159+
let bytes = <&[u8] as TryInto<[u8; std::mem::size_of::<c_int>()]>>::try_into(
160+
&buf[..std::mem::size_of::<c_int>()],
161+
)
162+
.map_err(|_| default_err())?;
160163
Ok(c_int::from_ne_bytes(bytes))
161164
}
162165

@@ -165,13 +168,13 @@ fn read_msg_with_seq(fd: &mut RouteSocket, seq: u32, kind: u16) -> Result<(nlmsg
165168
let buf = &mut [0u8; NETLINK_BUFFER_SIZE];
166169
let len = fd.read(buf.as_mut_slice())?;
167170
let mut next = &buf[..len];
168-
while size_of::<nlmsghdr>() <= next.len() {
169-
let (hdr, mut msg) = next.split_at(size_of::<nlmsghdr>());
171+
while std::mem::size_of::<nlmsghdr>() <= next.len() {
172+
let (hdr, mut msg) = next.split_at(std::mem::size_of::<nlmsghdr>());
170173
let hdr: nlmsghdr = hdr.try_into()?;
171174
// `msg` has the remainder of this message plus any following messages.
172175
// Strip those it off and assign them to `next`.
173-
debug_assert!(size_of::<nlmsghdr>() <= hdr.nlmsg_len as usize);
174-
(msg, next) = msg.split_at(hdr.nlmsg_len as usize - size_of::<nlmsghdr>());
176+
debug_assert!(std::mem::size_of::<nlmsghdr>() <= hdr.nlmsg_len as usize);
177+
(msg, next) = msg.split_at(hdr.nlmsg_len as usize - std::mem::size_of::<nlmsghdr>());
175178

176179
if hdr.nlmsg_seq != seq {
177180
continue;
@@ -195,7 +198,7 @@ impl TryFrom<&[u8]> for rtattr {
195198
type Error = Error;
196199

197200
fn try_from(value: &[u8]) -> Result<Self> {
198-
if value.len() < size_of::<Self>() {
201+
if value.len() < std::mem::size_of::<Self>() {
199202
return Err(default_err());
200203
}
201204
Ok(unsafe { ptr::read_unaligned(value.as_ptr().cast()) })
@@ -209,12 +212,12 @@ struct RtAttr<'a> {
209212

210213
impl<'a> RtAttr<'a> {
211214
fn new(bytes: &'a [u8]) -> Result<Self> {
212-
debug_assert!(bytes.len() >= size_of::<rtattr>());
213-
let (hdr, mut msg) = bytes.split_at(size_of::<rtattr>());
215+
debug_assert!(bytes.len() >= std::mem::size_of::<rtattr>());
216+
let (hdr, mut msg) = bytes.split_at(std::mem::size_of::<rtattr>());
214217
let hdr: rtattr = hdr.try_into()?;
215218
let aligned_len = aligned_by(hdr.rta_len.into(), 4);
216-
debug_assert!(size_of::<rtattr>() <= aligned_len);
217-
(msg, _) = msg.split_at(aligned_len - size_of::<rtattr>());
219+
debug_assert!(std::mem::size_of::<rtattr>() <= aligned_len);
220+
(msg, _) = msg.split_at(aligned_len - std::mem::size_of::<rtattr>());
218221
Ok(Self { hdr, msg })
219222
}
220223
}
@@ -225,7 +228,7 @@ impl<'a> Iterator for RtAttrs<'a> {
225228
type Item = RtAttr<'a>;
226229

227230
fn next(&mut self) -> Option<Self::Item> {
228-
if size_of::<rtattr>() <= self.0.len() {
231+
if std::mem::size_of::<rtattr>() <= self.0.len() {
229232
let attr = RtAttr::new(self.0).ok()?;
230233
let aligned_len = aligned_by(attr.hdr.rta_len.into(), 4);
231234
debug_assert!(self.0.len() >= aligned_len);
@@ -245,8 +248,8 @@ fn if_index(remote: IpAddr, fd: &mut RouteSocket) -> Result<i32> {
245248

246249
// Receive RTM_GETROUTE response.
247250
let (_hdr, mut buf) = read_msg_with_seq(fd, msg_seq, RTM_NEWROUTE)?;
248-
debug_assert!(size_of::<rtmsg>() <= buf.len());
249-
let buf = buf.split_off(size_of::<rtmsg>());
251+
debug_assert!(std::mem::size_of::<rtmsg>() <= buf.len());
252+
let buf = buf.split_off(std::mem::size_of::<rtmsg>());
250253

251254
// Parse through the attributes to find the interface index.
252255
for attr in RtAttrs(buf.as_slice()).by_ref() {
@@ -268,7 +271,7 @@ impl IfInfoMsg {
268271
fn new(if_index: i32, nlmsg_seq: u32) -> Self {
269272
#[allow(clippy::cast_possible_truncation)]
270273
// Structs lens are <= u8::MAX per `const_assert!`s above.
271-
let nlmsg_len = (size_of::<nlmsghdr>() + size_of::<ifinfomsg>()) as u32;
274+
let nlmsg_len = (std::mem::size_of::<nlmsghdr>() + std::mem::size_of::<ifinfomsg>()) as u32;
272275
Self {
273276
nlmsg: nlmsghdr {
274277
nlmsg_len,
@@ -293,7 +296,7 @@ impl IfInfoMsg {
293296

294297
impl From<&IfInfoMsg> for &[u8] {
295298
fn from(value: &IfInfoMsg) -> Self {
296-
debug_assert!(value.len() >= size_of::<Self>());
299+
debug_assert!(value.len() >= std::mem::size_of::<Self>());
297300
unsafe { slice::from_raw_parts(ptr::from_ref(value).cast(), value.len()) }
298301
}
299302
}
@@ -306,8 +309,8 @@ fn if_name_mtu(if_index: i32, fd: &mut RouteSocket) -> Result<(String, usize)> {
306309

307310
// Receive RTM_GETLINK response.
308311
let (_hdr, mut buf) = read_msg_with_seq(fd, msg_seq, RTM_NEWLINK)?;
309-
debug_assert!(size_of::<ifinfomsg>() <= buf.len());
310-
let buf = buf.split_off(size_of::<ifinfomsg>());
312+
debug_assert!(std::mem::size_of::<ifinfomsg>() <= buf.len());
313+
let buf = buf.split_off(std::mem::size_of::<ifinfomsg>());
311314

312315
// Parse through the attributes to find the interface name and MTU.
313316
let mut ifname = None;

0 commit comments

Comments
 (0)