Main Content

MISRA C:2023 Rule 16.4

Every switch statement shall have a default label

Since R2024a

Description

Rule Definition

Every switch statement shall have a default label

Rationale

The requirement for a default label is defensive programming. Even if your switch covers all possible values, there is no guarantee that the input takes one of these values. Statements following the default label take some appropriate action. If the default label requires no action, use comments to describe why there are no specific actions.

Troubleshooting

If you expect a rule violation but do not see it, refer to Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

short func1(short xyz){

    switch(xyz){      /* Non-compliant - default label is required */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
    }
    return xyz;
}

In this example, the switch statement does not include a default label, and is therefore noncompliant.

Correction — Add default With Error Flag

One possible correction is to use the default label to flag input errors. If your switch-clauses cover all expected input, then the default cases flags any input errors.

short func1(short xyz){
int errorflag = 0;
    switch(xyz){      /* Compliant */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
        default:
            errorflag = 1;
            break;
    }
    if (errorflag == 1)
        return errorflag;
    else 
        return xyz;
}
enum Colors{ 
    RED, GREEN, BLUE 
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Non-compliant - default label is required */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
    }
    return next;
}

In this example, the switch statement does not include a default label, and is therefore noncompliant. Even though this switch statement handles all values of the enumeration, there is no guarantee that color takes one of the those values.

Correction — Add default

To be compliant, add the default label to the end of your switch. You can use this case to flag unexpected inputs.

enum Colors{ 
    RED, GREEN, BLUE, ERROR
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Compliant */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
        default: 
            next = ERROR;
            break;
    }

    return next;
}

Check Information

Group: Switch Statements
Category: Required
AGC Category: Advisory

Version History

Introduced in R2024a