交换机外壳标签上的PC棉绒:违反MISRA C++2008要求规则5-0-12

PC-lint on switch case labels: Violates MISRA C++ 2008 Required Rule 5-0-12

本文关键字:C++2008 MISRA 5-0-12 规则 违反 标签 外壳 棉绒 PC 交换机      更新时间:2023-10-16

//定义了一些静态常量变量

static const uint8_t FirstData = 1;
static const uint8_t SecondData = 2;

//一些交换机案例

switch (Numdata)   //Numdata is either FirstData, SecondData
{
    case FirstData:
         //some code
    case SecondData:
         //some code
}

//现在PC lint对此抱怨"注意1960:违反MISRA C++2008要求的规则5-0-12,不允许在案例标签中使用非数字值"

所以问题是为什么PC lint不将静态常量成员视为数值?

显式键入强制转换大小写标签(应该可以解决此问题)是个好主意吗?

案例标签需要类型转换为什么类型?只有uint8_t可以吗?

有其他方法可以免除这个林特问题吗?

尝试使用枚举,因为它们是"已知的",例如使用以下代码,第二个函数没有问题。

#include <cstdint>
namespace testa
{
    static const uint8_t FirstData = 1;
    static const uint8_t SecondData = 2;
    int32_t func_A(uint8_t Numdata)
    {
        int32_t ret = 0;
        switch (Numdata)   //Numdata is either FirstData, SecondData
        {
        case FirstData:
            ret = 1;
        case SecondData:
            ret = 2;
        }
        return ret;
    }
}
namespace testb
{
    enum data {
        FirstData,
        SecondData
    };
    int32_t func_B(data Numdata)
    {
        int32_t ret = 0;
        switch (Numdata)   //Numdata is either FirstData, SecondData
        {
        case FirstData:
            ret = 1;
        case SecondData:
            ret = 2;
        }
        return ret;
    }
}
int32_t main(int32_t, int8_t*[])
{
    int32_t z = 0;
    z += testa::func_A(testa::FirstData);
    z += testa::func_A(testa::SecondData);
    z += testb::func_B(testb::FirstData);
    z += testb::func_B(testb::SecondData);
    return z;
}

规则规定:"[显式]有符号的字符和无符号的字符类型只能用于存储和使用数值。"我认为这不允许用作标签,lint错误消息的措辞也很糟糕。我认为它没有任何问题,只会禁用该代码的警告,或者,如果必要的话,禁用整个文件的警告。