主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 16.4

Every switch statement shall have a default label

描述

规则定义

Every switch statement shall have a default label 1

理由

default 标签的要求是防御性编程。即使您的开关涵盖了所有可能的值,也无法保证输入会取这些值中的一个。在 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 子句涵盖了所有预期的输入,则默认情况会标记任何输入错误。

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

为了合规,请在开关末尾添加标签 default。您可以使用此情况来标记意外输入。

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 类别:建议

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++:2008

  • MISRA C++:2023

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