diff --git a/rules/S7432/metadata.json b/rules/S7432/metadata.json new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/rules/S7432/metadata.json @@ -0,0 +1,2 @@ +{ +} diff --git a/rules/S7432/rust/metadata.json b/rules/S7432/rust/metadata.json new file mode 100644 index 0000000000..faca6f2899 --- /dev/null +++ b/rules/S7432/rust/metadata.json @@ -0,0 +1,24 @@ +{ + "title": "Reversed ranges and slices should not be empty", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "clippy" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-7432", + "sqKey": "S7432", + "scope": "All", + "defaultQualityProfiles": ["Sonar way"], + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/rules/S7432/rust/rule.adoc b/rules/S7432/rust/rule.adoc new file mode 100644 index 0000000000..f15337789a --- /dev/null +++ b/rules/S7432/rust/rule.adoc @@ -0,0 +1,32 @@ +== Why is this an issue? + +Empty ranges result in no iterations, making any loop a no-op. Trying to index slices using reversed ranges will result in runtime panics. Both scenarios lead to bugs or logical errors in the code. + +=== Code examples + +==== Noncompliant code example + +[source,rust,diff-id=1,diff-type=noncompliant] +---- +fn main() { + (10..=0).for_each(|x| println!("{}", x)); // Noncompliant: Empty range + let arr = [1, 2, 3, 4, 5]; + let sub = &arr[3..1]; // Noncompliant: Reversed slice indexing +} +---- + +==== Compliant solution + +[source,rust,diff-id=1,diff-type=compliant] +---- +fn main() { + (0..=10).rev().for_each(|x| println!("{}", x)); // Compliant: Properly reversed range for iteration + let arr = [1, 2, 3, 4, 5]; + let sub = &arr[1..3]; // Compliant: Valid slice indexing +} +---- + +== Resources +=== Documentation + +* Clippy Lints - https://rust-lang.github.io/rust-clippy/master/index.html#reversed_empty_ranges