PC-влакна върху етикетите на кутията на превключвателя: Нарушава изискваното правило 5-0-12 на MISRA C++ 2008

//дефинирани са някои статични const променливи

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: Нарушава изискваното правило 5-0-12 на MISRA C++ 2008, Забранена употреба на нечислова стойност в етикет за регистър“

Така че въпросът е защо PC-lint не разглежда статичните const членове като числова стойност?

Добра идея ли е изрично да въвеждате етикети за cast case (което трябва да разреши това)?

към какъв тип трябва да се преобразуват етикетите на case? Ще стане ли само uint8_t?

Някакъв друг начин за освобождаване на този проблем с Lint?


person learning fellow    schedule 09.04.2014    source източник


Отговори (2)


Опитайте да използвате enum, тъй като те са "известни", използвайки следния код например, втората функция няма проблема.

#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;
}
person Simeon Pilgrim    schedule 09.07.2014

правило казва: „[Изрично] типът знак и неподписан знак трябва да се използват само за съхранение и използване на числови стойности.“ Предполагам, че това не позволява използването като етикети и съобщението за грешка на мъх е лошо формулирано. Не виждам нищо лошо в това и просто бих деактивирал предупреждението за този код или, ако е необходимо, за целия файл.

person Peter - Reinstate Monica    schedule 08.07.2014
comment
Благодаря за редакцията. Тъй като не мога да разговарям директно с вас: Как се отървахте от пренасочването на Google? - person Peter - Reinstate Monica; 09.07.2014