主要内容

MISRA C:2023 Rule 16.4

R2026b

Every switch statement shall have a default label

自 R2024a 起

描述

Every switch statement shall have a default label 1

理由

要求使用 default 标签属于防御性编程。即使 switch 语句涵盖了所有可能的值,也不能保证输入一定取这些值之一。位于 default 标签之后的语句会执行某些相应的操作。如果 default 标签不需要任何操作,请使用注释说明为什么没有具体操作。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示。

示例

全部展开

short func1(short xyz){

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

在此示例中,switch 语句不包含 default 标签,因此不合规。

更正 - 添加带错误标志的 default

一种可能的更正方法是使用 default 标签来标记输入错误。如果您的 switch 语句涵盖了所有预期输入,那么 default case 会标记任何输入错误。

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;
}

在此示例中,switch 语句不包含 default 标签,因此不合规。即使此 switch 语句处理了枚举的所有值,也无法保证 color 一定会取这些值之一。

更正 - 添加 default

为实现合规,请在 switch 语句末尾添加 default 标签。您可以使用此 case 来标记意外输入。

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;
}

检查信息

组:Switch 语句
类别:必需
AGC 类别:建议
PQL 名称:std.misra_c_2023.R16_4

版本历史记录

在 R2024a 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C:2025

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.