forked from rust-lang/rust-clippy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#4821 - Areredify:as_conversions, r=flip1995
Add `as_conversions` lint changelog: closes rust-lang#4771, adding a new pedantic allow-by-default lint that lints against any usage of `as`.
- Loading branch information
Showing
9 changed files
with
106 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
use rustc::lint::{in_external_macro, EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass}; | ||
use rustc::{declare_lint_pass, declare_tool_lint}; | ||
use syntax::ast::*; | ||
|
||
use crate::utils::span_help_and_lint; | ||
|
||
declare_clippy_lint! { | ||
/// **What it does:** Checks for usage of `as` conversions. | ||
/// | ||
/// **Why is this bad?** `as` conversions will perform many kinds of | ||
/// conversions, including silently lossy conversions and dangerous coercions. | ||
/// There are cases when it makes sense to use `as`, so the lint is | ||
/// Allow by default. | ||
/// | ||
/// **Known problems:** None. | ||
/// | ||
/// **Example:** | ||
/// ```rust,ignore | ||
/// let a: u32; | ||
/// ... | ||
/// f(a as u16); | ||
/// ``` | ||
/// | ||
/// Usually better represents the semantics you expect: | ||
/// ```rust,ignore | ||
/// f(a.try_into()?); | ||
/// ``` | ||
/// or | ||
/// ```rust,ignore | ||
/// f(a.try_into().expect("Unexpected u16 overflow in f")); | ||
/// ``` | ||
/// | ||
pub AS_CONVERSIONS, | ||
restriction, | ||
"using a potentially dangerous silent `as` conversion" | ||
} | ||
|
||
declare_lint_pass!(AsConversions => [AS_CONVERSIONS]); | ||
|
||
impl EarlyLintPass for AsConversions { | ||
fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) { | ||
if in_external_macro(cx.sess(), expr.span) { | ||
return; | ||
} | ||
|
||
if let ExprKind::Cast(_, _) = expr.kind { | ||
span_help_and_lint( | ||
cx, | ||
AS_CONVERSIONS, | ||
expr.span, | ||
"using a potentially dangerous silent `as` conversion", | ||
"consider using a safe wrapper for this conversion", | ||
); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#[warn(clippy::as_conversions)] | ||
|
||
fn main() { | ||
let i = 0u32 as u64; | ||
|
||
let j = &i as *const u64 as *mut u64; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
error: using a potentially dangerous silent `as` conversion | ||
--> $DIR/as_conversions.rs:4:13 | ||
| | ||
LL | let i = 0u32 as u64; | ||
| ^^^^^^^^^^^ | ||
| | ||
= note: `-D clippy::as-conversions` implied by `-D warnings` | ||
= help: consider using a safe wrapper for this conversion | ||
|
||
error: using a potentially dangerous silent `as` conversion | ||
--> $DIR/as_conversions.rs:6:13 | ||
| | ||
LL | let j = &i as *const u64 as *mut u64; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= help: consider using a safe wrapper for this conversion | ||
|
||
error: using a potentially dangerous silent `as` conversion | ||
--> $DIR/as_conversions.rs:6:13 | ||
| | ||
LL | let j = &i as *const u64 as *mut u64; | ||
| ^^^^^^^^^^^^^^^^ | ||
| | ||
= help: consider using a safe wrapper for this conversion | ||
|
||
error: aborting due to 3 previous errors | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters