Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::case_sensitive_file_extension_comparisons: case-sensitive file extension comparison
What it meansChecks for calls to ends_with with possible file extensions and suggests to use a case-insensitive approach instead. It is in the pedantic group and off by default.
What you see
warning: case-sensitive file extension comparison --> main.rs:4:5 | 4 | filename.ends_with(".rs") | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: consider using a case-insensitive comparison instead = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#case_sensitive_file_extension_comparisons = note: `-W clippy::case-sensitive-file-extension-comparisons` implied by `-W clippy::pedantic` help: use std::path::Path | 4 ~ std::path::Path::new(filename) 5 + .extension() 6 + .is_some_and(|ext| ext.eq_ignore_ascii_case("rs")) |
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
ends_with is case-sensitive and may not detect files with a valid extension.
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
How to fix it
Clippy does not fix this one automatically (its suggestion may change behaviour, so it only shows it). Change the code by hand:
Flagged
fn is_rust_file(filename: &str) -> bool {
filename.ends_with(".rs")
}
Write this instead
fn is_rust_file(filename: &str) -> bool {
let filename = std::path::Path::new(filename);
filename.extension()
.map_or(false, |ext| ext.eq_ignore_ascii_case("rs"))
}
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
case_sensitive_file_extension_comparisons = "warn"In code
#![warn(clippy::case_sensitive_file_extension_comparisons)]One run
cargo clippy -- -W clippy::case-sensitive-file-extension-comparisonsThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for calls to ends_with with possible file extensions
and suggests to use a case-insensitive approach instead.
Why is this bad?
ends_with is case-sensitive and may not detect files with a valid extension.
Example
fn is_rust_file(filename: &str) -> bool {
filename.ends_with(".rs")
}
Use instead:
fn is_rust_file(filename: &str) -> bool {
let filename = std::path::Path::new(filename);
filename.extension()
.map_or(false, |ext| ext.eq_ignore_ascii_case("rs"))
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- assigning_clonesassigning the result of `Clone::clone()` may be inefficient
- bool_to_int_with_ifInstead of using an if statement to convert a bool to an int, this lint suggests using a from() function or an as coercion
- borrow_as_ptrborrow as raw pointer
- cast_losslesscasts from `u8` to `u64` can be expressed infallibly using `From`
- cast_possible_truncationcasting `u64` to `u8` may truncate the value
- cast_possible_wrapcasting `u32` to `i32` may wrap around the value
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?