3.3.3. Deny-by-default lints

未匹配的标注

默认拒绝的 lints

默认情况下,这些 lint 都设置为’deny’级别。

exceeding-bitshifts

此 lint 检测到移位超出了类型的位数。一些触发此 lint 的示例代码:

1_i32 << 32;

这将产生:

error: bitshift exceeds the type's number of bits
 --> src/main.rs:2:5
  |
2 |     1_i32 << 32;
  |     ^^^^^^^^^^^
  |

invalid-type-param-default

此 lint 检测在无效位置中,允许的类型参数默认值错误。一些触发此 lint 的示例代码:

fn foo<T=i32>(t: T) {}

这将产生:

error: defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions.
 --> src/main.rs:4:8
  |
4 | fn foo<T=i32>(t: T) {}
  |        ^
  |
  = note: #[deny(invalid_type_param_default)] on by default
  = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
  = note: for more information, see issue #36887 <https://github.com/rust-lang/rust/issues/36887>

missing-fragment-specifier

当一个未使用的macro_rules!宏定义模式出现时,会发出 missing_fragment_specifier 警告,因其有一个元变量(例如$e)后面没有片段说明符(例如:expr)。

通过删除未使用的macro_rules!宏定义模式,可以始终修复此警告。

mutable-transmutes

这种 lint 抓取&T&mut T的转化,因为它是未定义的行为。一些触发此 lint 的示例代码:

unsafe {
    let y = std::mem::transmute::<&i32, &mut i32>(&5);
}

这将产生:

error: mutating transmuted &mut T from &T may cause undefined behavior, consider instead using an UnsafeCell
 --> src/main.rs:3:17
  |
3 |         let y = std::mem::transmute::<&i32, &mut i32>(&5);
  |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |

no-mangle-const-items

这个 lint 检测到任何带#[no_mangle]属性的const项。常量确实没有导出符号,因此,这可能意味着您打算使用static不是const。一些触发此 lint 的示例代码:

#[no_mangle]
const FOO: i32 = 5;

这将产生:

error: const items should never be #[no_mangle]
 --> src/main.rs:3:1
  |
3 | const FOO: i32 = 5;
  | -----^^^^^^^^^^^^^^
  | |
  | help: try a static value: `pub static`
  |

overflowing-literals

此 lint 检测其类型的字面值超出范围。一些触发此 lint 的示例代码:

let x: u8 = 1000;

这将产生:

error: literal out of range for u8
 --> src/main.rs:2:17
  |
2 |     let x: u8 = 1000;
  |                 ^^^^
  |

patterns-in-fns-without-body

此 lint 检测到以前被错误允许的模式,无函数体的函数。一些触发此 lint 的示例代码:

trait Trait {
    fn foo(mut arg: u8);
}

这将产生:

warning: patterns aren't allowed in methods without bodies
 --> src/main.rs:2:12
  |
2 |     fn foo(mut arg: u8);
  |            ^^^^^^^
  |
  = note: `#[warn(patterns_in_fns_without_body)]` on by default
  = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
  = note: for more information, see issue #35203 <https://github.com/rust-lang/rust/issues/35203>

如果要解决此问题,移除此种模式;它可以在有被继承的情况下,去定义无函数体的函数。 像这样:

trait Trait {
    fn foo(arg: u8);
}

impl Trait for i32 {
    fn foo(mut arg: u8) {

    }
}

pub-use-of-private-extern-crate

此 lint 检测重新导出一个私有extern crate的特定情况;

unknown-crate-types

此 lint 检测到在一个#[crate_type]指示中,发现一个未知箱类型。一些触发此 lint 的示例代码:

#![crate_type="lol"]

这将产生:

error: invalid `crate_type` value
 --> src/lib.rs:1:1
  |
1 | #![crate_type="lol"]
  | ^^^^^^^^^^^^^^^^^^^^
  |

const-err

此 lint 检测到,在运行时可能会引起 panic 错误的表达式,这些表达式是出现在 const 上下文中的一类错误。

let _ = [0; 4][4];

这将产生:

error: index out of bounds: the len is 4 but the index is 4
 --> src/lib.rs:1:9
  |
1 | let _ = [0; 4][4];
  |         ^^^^^^^^^
  |

order-dependent-trait-objects

此 lint 检测到 trait 一致性冲突,它将允许创建两个涉及标记 trait 的相同动态对象的 trait 。

文档原文: What is rustc? - The rustc book
GitHub:rust/src/doc/rustc at master · rust-lang/rust

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~