Details
-
Type:
Code Smell Detection
-
Status: Active
-
Resolution: Unresolved
-
Labels:
-
Message:The code of this ["case"|branch] is a duplicate; refactor so that all ["case" blocks|branches] are unique.
-
Highlighting:
-
Default Severity:Major
-
Impact:Low
-
Likelihood:High
-
Default Quality Profiles:Sonar way
-
Targeted languages:PL/I, VB6
-
Covered Languages:ABAP, C#, C, C++, Cobol, Flex, Go, Java, JavaScript, Kotlin, Objective-C, PHP, PL/SQL, Python, RPG, Ruby, Scala, Swift, T-SQL, TypeScript, VB.Net
-
Irrelevant for Languages:HTML, XML
-
Remediation Function:Constant/Issue
-
Constant Cost:10min
-
Analysis Level:Syntactic Analysis
-
Analysis Scope:Main Sources
-
Common Rule:Yes
-
CPPCheck:duplicateBranch
-
ESLint-SonarJS:no-duplicated-branches
-
FindBugs:DB_DUPLICATE_SWITCH_CLAUSES, DB_DUPLICATE_BRANCHES
-
ReSharper:ConditionalTernaryEqualBranch
Description
Having two cases in a switch statement or two branches in an if chain with the same implementation is at best duplicate code, and at worst a coding error. If the same logic is truly needed for both instances, then in an if chain they should be combined, or for a switch, one should fall through to the other.
Noncompliant Code Example
switch (i) { case 1: doFirstThing(); doSomething(); break; case 2: doSomethingDifferent(); break; case 3: // Noncompliant; duplicates case 1's implementation doFirstThing(); doSomething(); break; default: doTheRest(); } if (a >= 0 && a < 10) { doFirstThing(); doTheThing(); } else if (a >= 10 && a < 20) { doTheOtherThing(); } else if (a >= 20 && a < 50) { doFirstThing(); doTheThing(); // Noncompliant; duplicates first condition } else { doTheRest(); }
Exceptions
Blocks in an if chain that contain a single line of code are ignored, as are blocks in a switch statement that contain a single line of code with or without a following break.
if (a == 1) { doSomething(); //no issue, usually this is done on purpose to increase the readability } else if (a == 2) { doSomethingElse(); } else { doSomething(); }
But this exception does not apply to if chains without else-s, or to switch-es without default clauses when all branches have the same single line of code. In case of if chains with else-s, or of switch-es with default clauses, rule S3923 raises a bug.
if (a == 1) { doSomething(); //Noncompliant, this might have been done on purpose but probably not } else if (a == 2) { doSomething(); }
Attachments
Issue Links
- is implemented by
-
SONARFLEX-161 S1871: Fix IndexOutOfBoundsException for empty switch statements
-
- Closed
-
-
SONARPY-477 S1871: Raise only one issue when more than one code block is duplicated
-
- Closed
-
-
SONARPLI-181 Rule: Two branches in a conditional structure should not have exactly the same implementation
-
- Open
-
-
SONARVBSIX-261 Rule: Two branches in a conditional structure should not have exactly the same implementation
-
- Open
-
-
CPP-806 Rule: Two cases in the same "switch" should not have exactly the same implementation
-
- Closed
-
-
SONARCOBOL-1187 Rule: Two branches in the same conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARPHP-431 Rule: Two branches in the same conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARPLSQL-602 Rule: Two branches in the same conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARRPG-117 Rule: Two branches in the same conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSLANG-7 Rule S1871: Two branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSLANG-154 Enable in Ruby rule S1871 (DuplicateBranchCheck)
-
- Closed
-
-
SONARSLANG-217 [Scala] Enable Rule: S1871 Two branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSLANG-323 [Apex] Enable Rule: S1871 Two branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSWIFT-61 Rule: Two branches in the same conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARTSQL-18 Rule: Two branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSLANG-424 [Go] Enable rules about identical branches
-
- Closed
-
-
SONARFLEX-58 S1871: Extend rule on if-statements
-
- Open
-
-
SONARSWIFT-161 Update S1871 to cover ternary operator
-
- Closed
-
- is related to
-
SONARPY-299 Rule S3923 (with update of S1871): All branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARSWIFT-275 Rule S3923: All branches in a conditional structure should not have exactly the same implementation
-
- Closed
-
-
SONARJAVA-3744 Extend existing rules to support Switch Expression
-
- Closed
-
-
SONARPY-123 Update S1871 to cover ternary operator
-
- Closed
-
-
SONARPY-256 Update S1871 to cover single line of code exception
-
- Closed
-
-
CPP-2510 S3923: Improve code equivalence checking in case of macro expansion
-
- To Do
-
-
SONARSLANG-514 [Scala] S1871 FPs with complex pattern matching
-
- Open
-
-
SONARSLANG-351 [Scala] S3923 & S1871 should not raise an issue on variable shadowed in pattern matching.
-
- Closed
-
- links to
1.
|
COBOL | RSPEC-2585 |
|
Active | Unassigned | |
2.
|
Swift | RSPEC-2633 |
|
Active | Unassigned | |
3.
|
Python | RSPEC-2705 |
|
Active | Unassigned | |
4.
|
PHP | RSPEC-2863 |
|
Active | Unassigned | |
5.
|
RPG | RSPEC-2868 |
|
Active | Unassigned | |
6.
|
JavaScript | RSPEC-3022 |
|
Active | Unassigned | |
7.
|
ABAP | RSPEC-3703 |
|
Active | Unassigned | |
8.
|
VB.NET | RSPEC-3714 |
|
Active | Unassigned | |
9.
|
C# | RSPEC-3716 |
|
Active | Unassigned | |
10.
|
T-SQL | RSPEC-4100 |
|
Active | Unassigned | |
11.
|
PL/SQL | RSPEC-4240 |
|
Active | Unassigned | |
12.
|
Go | RSPEC-4590 |
|
Active | Unassigned | |
13.
|
Ruby | RSPEC-4763 |
|
Active | Unassigned | |
14.
|
Kotlin | RSPEC-4799 |
|
Active | Unassigned | |
15.
|
Scala | RSPEC-4930 |
|
Active | Unassigned | |
16.
|
Apex | RSPEC-5002 |
|
Active | Unassigned | |
17.
|
C-Family | RSPEC-5517 |
|
Active | Unassigned |