What it does
Check a mistaken casting function item to usize or all other integer primitive types.
Categories (optional)
- Kind: correctness or pedantic
What is the advantage of the recommended code over the original code
- It is a mistake to cast a function item to
usize instead of getting function result.
This could be unnotice for a long time.
- If you want to get pointer address of a function, explicitly cast it to function pointer and
usize.
- Explicit is better than implicit.
The bug appeared in real code: rust-lang/rustup@5d9d980
I was author of the bug :) .
Drawbacks
It is verbose and somewhat redundant.
Example
use std::mem::size_of;
extern "C" {
fn foo(len: usize);
}
unsafe {
foo(size_of::<usize> as usize);
}
Could be written as:
unsafe {
foo(size_of::<usize>());
// or
foo(size_of::<usize> as fn() -> usize as usize);
// or
foo(size_of::<usize> as *const () as usize);
}
What it does
Check a mistaken casting function item to
usizeor all other integer primitive types.Categories (optional)
What is the advantage of the recommended code over the original code
usizeinstead of getting function result.This could be unnotice for a long time.
usize.The bug appeared in real code: rust-lang/rustup@5d9d980
I was author of the bug :) .
Drawbacks
It is verbose and somewhat redundant.
Example
Could be written as: