G.TYP.INT.02 避免在有符号整数和无符号整数之间进行强制转换

【级别】 建议

【描述】

当有符号整数被强制转换为无符号整数时,负值会发生回绕(wrap around),变成更大的正值,这在实际应用时有可能助长缓冲区溢出风险。

注意:在 Rust 中整数溢出属于 未指定(unspecified)行为,而非未定义行为 (见 RFC 560)。

【反例】

#![warn(clippy::cast_sign_loss)]
fn main(){
    let y: i8 = -1;
    y as u128; // will return 18446744073709551615
}

【正例】

#![warn(clippy::cast_sign_loss)]

fn main(){
    let y : i8 = -1;
    // Error: 
    // the trait `From<i8>` is not implemented for `u128`
    // the trait bound `u128: From<i8>` is not satisfied
    let z = u128::from(y);
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
cast_sign_lossyesnopedanticallow

注意:默认情况下该 lint 是 allow,如果需要检查这种转换,则需要设置为 warndeny

参考