G.TYP.CHR.03 需要将整数转换为字符时,应使用安全转换函数,而非 transmute

【级别】 要求

【描述】

并非每个整数都对应一个合法的 Unicode 标量值,使用 transmute 转换会有未定义行为。

【反例】


#![allow(unused)]
fn main() {
let x = 37_u32;
unsafe {
    // 不符合
    let x: char = std::mem::transmute(x); // where x: u32
    assert_eq!('%', x);
}
}

【正例】


#![allow(unused)]
fn main() {
let x = 37_u32;

// 符合:x 会返回一个 Result 类型,开发者可以进行错误处理
let x = std::char::from_u32(x); 
assert_eq!('%', x);

// 符合:如果确定该整数对应合法的 unicode,可以使用 uncheck 方法加速
let x = unsafe {std::char::from_u32_unchecked(x) };  
assert_eq!('%', x);
}

【Lint 检测】

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