Skip to content

Commit fb21477

Browse files
committed
Warn on clippy::cast_possible_truncation
Fixes#3197 Signed-off-by: Jonathan Browne <12983479+JBYoshi@users.noreply.github.com>
1 parent 22b83e6 commit fb21477

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+542
-402
lines changed

.cargo/config

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ rustflags = [
55
"-Dclippy::ptr_as_ptr",
66
"-Dclippy::undocumented_unsafe_blocks",
77
"-Dclippy::cast_lossless",
8+
"-Dclippy::cast_possible_truncation",
89
"-Dclippy::cast_sign_loss"
910
]
1011

src/devices/src/bus.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ mod tests {
167167
implBusDeviceforConstantDevice{
168168
fnread(&mutself,offset:u64,data:&mut[u8]){
169169
for(i, v)in data.iter_mut().enumerate(){
170-
*v = (offsetasu8) + (i asu8);
170+
*v = u8::try_from(offset).unwrap() + u8::try_from(i).unwrap();
171171
}
172172
}
173173

174174
fnwrite(&mutself,offset:u64,data:&[u8]){
175175
for(i, v)in data.iter().enumerate(){
176-
assert_eq!(*v,(offsetasu8) + (i asu8))
176+
assert_eq!(*v,u8::try_from(offset).unwrap() + u8::try_from(i).unwrap())
177177
}
178178
}
179179
}

src/devices/src/legacy/i8042.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ mod tests {
415415

416416
// Test buffer full.
417417
for i in0..BUF_SIZE{
418-
i8042.push_byte(i asu8).unwrap();
418+
i8042.push_byte(u8::try_from(i).unwrap()).unwrap();
419419
assert_eq!(i8042.buf_len(), i + 1);
420420
}
421421
assert_eq!(i8042.push_byte(0).unwrap_err(),Error::InternalBufferFull);

src/devices/src/legacy/rtc_pl031.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl BusDevice for RTCDevice {
1616
if data.len() == 4{
1717
// read() function from RTC implementation expects a slice of
1818
// len 4, and we just validated that this is the data lengt
19-
self.read(offset asu16, data.try_into().unwrap())
19+
self.read(u16::try_from(offset).unwrap(), data.try_into().unwrap())
2020
}else{
2121
warn!(
2222
"Found invalid data length while trying to read from the RTC: {}",
@@ -30,7 +30,7 @@ impl BusDevice for RTCDevice {
3030
if data.len() == 4{
3131
// write() function from RTC implementation expects a slice of
3232
// len 4, and we just validated that this is the data length
33-
self.write(offset asu16, data.try_into().unwrap())
33+
self.write(u16::try_from(offset).unwrap(), data.try_into().unwrap())
3434
}else{
3535
warn!(
3636
"Found invalid data length while trying to write to the RTC: {}",

src/devices/src/legacy/serial.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,15 @@ impl<W: Write + Send + 'static> BusDevice
272272
self.serial.events().metrics.missed_read_count.inc();
273273
return;
274274
}
275-
data[0] = self.serial.read(offset asu8);
275+
data[0] = self.serial.read(u8::try_from(offset).unwrap());
276276
}
277277

278278
fnwrite(&mutself,offset:u64,data:&[u8]){
279279
if data.len() != 1{
280280
self.serial.events().metrics.missed_write_count.inc();
281281
return;
282282
}
283-
ifletErr(err) = self.serial.write(offset asu8, data[0]){
283+
ifletErr(err) = self.serial.write(u8::try_from(offset).unwrap(), data[0]){
284284
// Counter incremented for any handle_write() error.
285285
error!("Failed the write to serial: {:?}", err);
286286
self.serial.events().metrics.error_count.inc();

src/devices/src/virtio/balloon/device.rs

+47-11
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,8 @@ impl VirtioDevice for Balloon {
545545
ifletSome(end) = offset.checked_add(data.len()asu64){
546546
// This write can't fail, offset and end are checked against config_len.
547547
data.write_all(
548-
&config_space_bytes[offset asusize..cmp::min(end, config_len)asusize],
548+
&config_space_bytes[usize::try_from(offset).unwrap()
549+
..usize::try_from(cmp::min(end, config_len)).unwrap()],
549550
)
550551
.unwrap();
551552
}
@@ -559,7 +560,9 @@ impl VirtioDevice for Balloon {
559560
error!("Failed to write config space");
560561
return;
561562
}
562-
config_space_bytes[offset asusize..(offset + data_len)asusize].copy_from_slice(data);
563+
config_space_bytes
564+
[usize::try_from(offset).unwrap()..usize::try_from(offset + data_len).unwrap()]
565+
.copy_from_slice(data);
563566
}
564567

565568
fnactivate(&mutself,mem:GuestMemoryMmap) -> ActivateResult{
@@ -689,7 +692,10 @@ pub(crate) mod tests {
689692
| (u64::from(*deflate_on_oom) << VIRTIO_BALLOON_F_DEFLATE_ON_OOM)
690693
| ((u64::from(*stats_interval)) << VIRTIO_BALLOON_F_STATS_VQ);
691694

692-
assert_eq!(balloon.avail_features_by_page(0), features asu32);
695+
assert_eq!(
696+
balloon.avail_features_by_page(0),
697+
(features &0xffff_ffff)asu32
698+
);
693699
assert_eq!(balloon.avail_features_by_page(1),(features >> 32)asu32);
694700
for i in2..10{
695701
assert_eq!(balloon.avail_features_by_page(i),0u32);
@@ -780,7 +786,7 @@ pub(crate) mod tests {
780786
&infq,
781787
0,
782788
page_addr,
783-
SIZE_OF_U32asu32,
789+
u32::try_from(SIZE_OF_U32).unwrap(),
784790
VIRTQ_DESC_F_NEXT | VIRTQ_DESC_F_WRITE,
785791
);
786792

@@ -800,7 +806,7 @@ pub(crate) mod tests {
800806
&infq,
801807
1,
802808
page_addr,
803-
SIZE_OF_U32asu32 + 1,
809+
u32::try_from(SIZE_OF_U32).unwrap() + 1,
804810
VIRTQ_DESC_F_NEXT,
805811
);
806812

@@ -835,7 +841,13 @@ pub(crate) mod tests {
835841
// to trigger the inflate event queue.
836842
{
837843
mem.write_obj::<u32>(0x1,GuestAddress(page_addr)).unwrap();
838-
set_request(&infq,0, page_addr,SIZE_OF_U32asu32,VIRTQ_DESC_F_NEXT);
844+
set_request(
845+
&infq,
846+
0,
847+
page_addr,
848+
u32::try_from(SIZE_OF_U32).unwrap(),
849+
VIRTQ_DESC_F_NEXT,
850+
);
839851

840852
check_metric_after_block!(
841853
METRICS.balloon.event_fails,
@@ -856,7 +868,13 @@ pub(crate) mod tests {
856868
// Test the happy case.
857869
{
858870
mem.write_obj::<u32>(0x1,GuestAddress(page_addr)).unwrap();
859-
set_request(&infq,0, page_addr,SIZE_OF_U32asu32,VIRTQ_DESC_F_NEXT);
871+
set_request(
872+
&infq,
873+
0,
874+
page_addr,
875+
u32::try_from(SIZE_OF_U32).unwrap(),
876+
VIRTQ_DESC_F_NEXT,
877+
);
860878

861879
check_metric_after_block!(
862880
METRICS.balloon.inflate_count,
@@ -884,7 +902,13 @@ pub(crate) mod tests {
884902

885903
// Error case: forgot to trigger deflate event queue.
886904
{
887-
set_request(&defq,0, page_addr,SIZE_OF_U32asu32,VIRTQ_DESC_F_NEXT);
905+
set_request(
906+
&defq,
907+
0,
908+
page_addr,
909+
u32::try_from(SIZE_OF_U32).unwrap(),
910+
VIRTQ_DESC_F_NEXT,
911+
);
888912
check_metric_after_block!(
889913
METRICS.balloon.event_fails,
890914
1,
@@ -898,7 +922,13 @@ pub(crate) mod tests {
898922

899923
// Happy case.
900924
{
901-
set_request(&defq,1, page_addr,SIZE_OF_U32asu32,VIRTQ_DESC_F_NEXT);
925+
set_request(
926+
&defq,
927+
1,
928+
page_addr,
929+
u32::try_from(SIZE_OF_U32).unwrap(),
930+
VIRTQ_DESC_F_NEXT,
931+
);
902932
check_metric_after_block!(
903933
METRICS.balloon.deflate_count,
904934
1,
@@ -920,7 +950,13 @@ pub(crate) mod tests {
920950

921951
// Error case: forgot to trigger stats event queue.
922952
{
923-
set_request(&statsq,0,0x1000,SIZE_OF_STATasu32,VIRTQ_DESC_F_NEXT);
953+
set_request(
954+
&statsq,
955+
0,
956+
0x1000,
957+
u32::try_from(SIZE_OF_STAT).unwrap(),
958+
VIRTQ_DESC_F_NEXT,
959+
);
924960
check_metric_after_block!(
925961
METRICS.balloon.event_fails,
926962
1,
@@ -956,7 +992,7 @@ pub(crate) mod tests {
956992
&statsq,
957993
0,
958994
page_addr,
959-
2*SIZE_OF_STATasu32,
995+
u32::try_from(2*SIZE_OF_STAT).unwrap(),
960996
VIRTQ_DESC_F_NEXT,
961997
);
962998
check_metric_after_block!(METRICS.balloon.stats_updates_count,1,{

src/devices/src/virtio/balloon/test_utils.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ pub fn invoke_handler_for_queue_event(b: &mut Balloon, queue_index: usize) {
2929

3030
pubfnset_request(queue:&VirtQueue,idx:usize,addr:u64,len:u32,flags:u16){
3131
// Set the index of the next request.
32-
queue.avail.idx.set((idx + 1)asu16);
32+
queue.avail.idx.set(u16::try_from(idx + 1).unwrap());
3333
// Set the current descriptor table entry index.
34-
queue.avail.ring[idx].set(idx asu16);
34+
queue.avail.ring[idx].set(u16::try_from(idx).unwrap());
3535
// Set the current descriptor table entry.
3636
queue.dtable[idx].set(addr, len, flags,1);
3737
}
3838

3939
pubfncheck_request_completion(queue:&VirtQueue,idx:usize){
4040
// Check that the next used will be idx + 1.
41-
assert_eq!(queue.used.idx.get(),(idx + 1)asu16);
41+
assert_eq!(usize::from(queue.used.idx.get()),idx + 1);
4242
// Check that the current used is idx.
43-
assert_eq!(queue.used.ring[idx].get().id, idxasu32);
43+
assert_eq!(usize::try_from(queue.used.ring[idx].get().id).unwrap(), idx);
4444
// The length of the completed request is 0.
4545
assert_eq!(queue.used.ring[idx].get().len,0);
4646
}

src/devices/src/virtio/balloon/utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ pub(crate) fn remove_range(
8888
let ret = unsafe{
8989
libc::mmap(
9090
phys_address.cast(),
91-
range_len asusize,
91+
usize::try_from(range_len).unwrap(),
9292
libc::PROT_READ | libc::PROT_WRITE,
9393
libc::MAP_FIXED | libc::MAP_ANONYMOUS | libc::MAP_PRIVATE,
9494
-1,
@@ -103,7 +103,7 @@ pub(crate) fn remove_range(
103103
// Madvise the region in order to mark it as not used.
104104
// SAFETY: The address and length are known to be valid.
105105
let ret = unsafe{
106-
let range_len = range_len asusize;
106+
let range_len = usize::try_from(range_len).unwrap();
107107
libc::madvise(phys_address.cast(), range_len, libc::MADV_DONTNEED)
108108
};
109109
if ret < 0{

src/devices/src/virtio/block/device.rs

+29-17
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ impl DiskProperties {
175175
// The config space is little endian.
176176
letmut config = Vec::with_capacity(CONFIG_SPACE_SIZE);
177177
for i in0..CONFIG_SPACE_SIZE{
178+
// `as` truncates large integers into smaller integers, here this is intentional
179+
#[allow(clippy::cast_possible_truncation)]
178180
config.push((self.nsectors >> (8* i))asu8);
179181
}
180182
config
@@ -569,8 +571,11 @@ impl VirtioDevice for Block {
569571
}
570572
ifletSome(end) = offset.checked_add(data.len()asu64){
571573
// This write can't fail, offset and end are checked against config_len.
572-
data.write_all(&self.config_space[offset asusize..cmp::min(end, config_len)asusize])
573-
.unwrap();
574+
data.write_all(
575+
&self.config_space[usize::try_from(offset).unwrap()
576+
..usize::try_from(cmp::min(end, config_len)).unwrap()],
577+
)
578+
.unwrap();
574579
}
575580
}
576581

@@ -583,7 +588,9 @@ impl VirtioDevice for Block {
583588
return;
584589
}
585590

586-
self.config_space[offset asusize..(offset + data_len)asusize].copy_from_slice(data);
591+
self.config_space
592+
[usize::try_from(offset).unwrap()..usize::try_from(offset + data_len).unwrap()]
593+
.copy_from_slice(data);
587594
}
588595

589596
fnactivate(&mutself,mem:GuestMemoryMmap) -> ActivateResult{
@@ -666,7 +673,7 @@ pub(crate) mod tests {
666673
let cfg = disk_properties.virtio_block_config_space();
667674
assert_eq!(cfg.len(),CONFIG_SPACE_SIZE);
668675
for(i, byte)in cfg.iter().enumerate(){
669-
assert_eq!(*byte,(num_sectors >> (8* i))asu8);
676+
assert_eq!(*byte,((num_sectors >> (8* i))&0xff)asu8);
670677
}
671678
// Testing `backing_file.virtio_block_disk_image_id()` implies
672679
// duplicating that logic in tests, so skipping it.
@@ -688,7 +695,10 @@ pub(crate) mod tests {
688695

689696
let features:u64 = (1u64 << VIRTIO_F_VERSION_1) | (1u64 << VIRTIO_RING_F_EVENT_IDX);
690697

691-
assert_eq!(block.avail_features_by_page(0), features asu32);
698+
assert_eq!(
699+
block.avail_features_by_page(0),
700+
(features &0xffff_ffff)asu32
701+
);
692702
assert_eq!(block.avail_features_by_page(1),(features >> 32)asu32);
693703

694704
for i in2..10{
@@ -808,8 +818,8 @@ pub(crate) mod tests {
808818
let status_addr = GuestAddress(vq.dtable[2].addr.get());
809819
assert_eq!(used.len,1);
810820
assert_eq!(
811-
mem.read_obj::<u8>(status_addr).unwrap(),
812-
VIRTIO_BLK_S_IOERRasu8
821+
u32::from(mem.read_obj::<u8>(status_addr).unwrap()),
822+
VIRTIO_BLK_S_IOERR
813823
);
814824
}
815825

@@ -833,8 +843,8 @@ pub(crate) mod tests {
833843
let status_addr = GuestAddress(vq.dtable[2].addr.get());
834844
assert_eq!(used.len,1);
835845
assert_eq!(
836-
mem.read_obj::<u8>(status_addr).unwrap(),
837-
VIRTIO_BLK_S_IOERRasu8
846+
u32::from(mem.read_obj::<u8>(status_addr).unwrap()),
847+
VIRTIO_BLK_S_IOERR
838848
);
839849
}
840850
}
@@ -1020,8 +1030,8 @@ pub(crate) mod tests {
10201030

10211031
let status_addr = GuestAddress(vq.dtable[2].addr.get());
10221032
assert_eq!(
1023-
mem.read_obj::<u8>(status_addr).unwrap(),
1024-
VIRTIO_BLK_S_IOERRasu8
1033+
u32::from(mem.read_obj::<u8>(status_addr).unwrap()),
1034+
VIRTIO_BLK_S_IOERR
10251035
);
10261036
}
10271037

@@ -1241,8 +1251,8 @@ pub(crate) mod tests {
12411251

12421252
let status_addr = GuestAddress(vq.dtable[2].addr.get());
12431253
assert_eq!(
1244-
mem.read_obj::<u8>(status_addr).unwrap(),
1245-
VIRTIO_BLK_S_IOERRasu8
1254+
u32::from(mem.read_obj::<u8>(status_addr).unwrap()),
1255+
VIRTIO_BLK_S_IOERR
12461256
);
12471257
}
12481258
}
@@ -1402,10 +1412,12 @@ pub(crate) mod tests {
14021412
let status_addr = vq.dtable[used.idasusize + 1].addr.get();
14031413
assert_eq!(used.len,1);
14041414
assert_eq!(
1405-
vq.memory()
1406-
.read_obj::<u8>(GuestAddress(status_addr))
1407-
.unwrap(),
1408-
VIRTIO_BLK_S_OKasu8
1415+
u32::from(
1416+
vq.memory()
1417+
.read_obj::<u8>(GuestAddress(status_addr))
1418+
.unwrap()
1419+
),
1420+
VIRTIO_BLK_S_OK
14091421
);
14101422
}
14111423
}

src/devices/src/virtio/block/io/mod.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -241,14 +241,14 @@ pub mod tests {
241241
fncheck_dirty_mem(mem:&GuestMemoryMmap,addr:GuestAddress,len:u32){
242242
let bitmap = mem.find_region(addr).unwrap().bitmap().as_ref().unwrap();
243243
for offset in addr.0..addr.0 + u64::from(len){
244-
assert!(bitmap.dirty_at(offset asusize));
244+
assert!(bitmap.dirty_at(usize::try_from(offset).unwrap()));
245245
}
246246
}
247247

248248
fncheck_clean_mem(mem:&GuestMemoryMmap,addr:GuestAddress,len:u32){
249249
let bitmap = mem.find_region(addr).unwrap().bitmap().as_ref().unwrap();
250250
for offset in addr.0..addr.0 + u64::from(len){
251-
assert!(!bitmap.dirty_at(offset asusize));
251+
assert!(!bitmap.dirty_at(usize::try_from(offset).unwrap()));
252252
}
253253
}
254254

@@ -287,16 +287,13 @@ pub mod tests {
287287
.to_vec();
288288

289289
// Partial write
290-
let partial_len = 50;
291-
let addr = GuestAddress(MEM_LENasu64- partial_len);
290+
let partial_len = 50u32;
291+
let addr = GuestAddress(u64::try_from(MEM_LEN - partial_lenasusize).unwrap());
292292
mem.write(&data, addr).unwrap();
293-
assert_sync_execution!(
294-
engine.write(0,&mem, addr,FILE_LEN,()),
295-
partial_len asu32
296-
);
293+
assert_sync_execution!(engine.write(0,&mem, addr,FILE_LEN,()), partial_len);
297294
// Partial read
298295
let mem = create_mem();
299-
assert_sync_execution!(engine.read(0,&mem, addr,FILE_LEN,()), partial_lenasu32);
296+
assert_sync_execution!(engine.read(0,&mem, addr,FILE_LEN,()), partial_len);
300297
// Check data
301298
letmut buf = vec![0u8; partial_len asusize];
302299
mem.read_slice(&mut buf, addr).unwrap();

0 commit comments

Comments
 (0)
close