Uploaded image for project: 'Rules Repository'
  1. Rules Repository
  2. RSPEC-1862 Related "if/else if" statements should not have the same condition
  3. RSPEC-2867

RPG: Related "IF/ELSEIF" statements and "WHEN" clauses in a "SELECT" should not have the same condition

    Details

    • Type: Language-Specification
    • Status: Active
    • Resolution: Unresolved
    • Labels:
      None
    • Impact:
      Unknown 'null' severity
    • Likelihood:
      Unknown 'null' severity

      Description

      A Select or a chain of If/Elseif statements is evaluated from top to bottom. At most, only one branch will be executed: the first one with a condition that evaluates to true.

      Therefore, duplicating a condition automatically leads to dead code. Usually, this is due to a copy/paste error. At best, it's simply dead code and at worst, it's a bug that is likely to induce further bugs as the code is maintained, and obviously it could lead to unexpected behavior.

      Noncompliant Code Example

           C                   IF        X = 1
           C                   EXSR      SR01
           C                   ELSEIF    X = 1                                       Noncompliant
           C                   EXSR      SR02
           C                   ENDIF
      
      /free
           IF param = 1;
              doX();
           ELSEIF param = 2;
              doY();
           ELSEIF param = 1; // Noncompliant
              doZ();
           ENDIF;
      
           SELECT;
             WHEN param = 1;
               doX();
             WHEN param = 2;
               doY();
             WHEN param = 1; // Noncompliant
               doZ();
           ENDSL;
      /end-free
      

      Compliant Solution

           C                   IF        X = 1
           C                   EXSR      SR01
           C                   ELSEIF    X = 2
           C                   EXSR      SR02
           C                   ENDIF
      
      /free
           IF param = 1;
              doX();
           ELSEIF param = 2;
              doY();
           ELSEIF param = 3;
              doZ();
           ENDIF;
      
           SELECT;
             WHEN param = 1;
               doX();
             WHEN param = 2;
               doY();
             WHEN param = 3; 
               doZ();
           ENDSL;
      /end-free
      

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              pierre-yves.nicolas Pierre-Yves Nicolas
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated: