C / C ++ значение по умолчанию / значение, присвоенное переменной, никогда не используется - PullRequest
0 голосов
/ 16 мая 2018

Мне нравится всегда инициализировать локальные переменные, например,

int32_t result = 0;

Я думал, что это хороший стиль программирования, потому что "результат" никогда не может быть инициализирован, независимо от того, установлены ли следующие if-конструкции или нет.

Но теперь я пробую инструмент проверки статического кода (C_STAT для встроенного рабочего места IAR), и это жалуется на то, что в приведенной ниже функции правило MISRA-C ++ 2008-01-06 ("не должно содержать экземпляров энергонезависимых переменных"). данные значения, которые впоследствии никогда не используются ") и MISRA C: 2012, правило 2.2c (" без мертвого кода ") и CWE 563 (" неиспользуемая переменная ") нарушаются.

// gets signal1 - signal2 (checks range of value)
int16_t getSignalDifferenceFromFloat(float signal1, int16_t signal2)
{
    int32_t result = 0; // <-- this assignment makes the violation 
                        // ... but I feel better with it

    if (signal1 > 65535.0)
    {
        // because result cannot be smaller than the max value of TSignal
        result = 32767;
    }
    else if (signal1 < -65535.0)  // <-- here an else  was missing
    {
        // because result cannot be larger than the min value of TSignal
        result = -32768;
    }
    else
    {
        result = (int32_t)signal1 - (int32_t)signal2;

        if (result < -32768)
        {
            result = -32768;
        }
        else if (result > 32767)
        {
            result = 32767;
        }
    }

    return (int16_t) result;
}

original Вопрос: Что вы об этом думаете?

Новые вопросы:

  1. Существуют ли хорошие стандарты кодирования, которые всегда требуют немедленной инициализации объявленных локальных переменных?
  2. Является ли средство проверки кода слишком педантичным (некоторые компиляторы не жалуются в этом месте, но будут жаловаться, что переменная будет полностью не использована)? Я делаю это годами, но не могу вспомнить, где я это видел.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Статические анализаторы применяют правила, которые вы определяете - некоторые из этих правил будут конфликтовать, потому что вы должны установить их в соответствии с вашим локальным стандартом кодирования.Я предполагаю, что есть также правило, которое может или не может быть включено, что требует инициализации всех переменных;и вы не можете сделать оба.

Выберите неконфликтующий набор правил, который соответствует вашему предпочтительному стандарту.То, что вы выбираете, является вопросом мнения, поэтому не является действительным вопросом SO.

0 голосов
/ 28 июня 2018

Большинство хороших статических анализаторов предоставят вам анализ потока данных, который предупредит вас о возможных путях, оставляющих неинициализированные переменные.

Если взять ваш пример, скажем, что вы (случайно) пропустили одно из следующих назначений, это не будетбыть обнаруженным SA:

/// gets signal1 - signal2 (checks range of value)
int16_t getSignalDifferenceFromFloat(float signal1, int16_t signal2)
{
    int32_t result = 0; // <-- this assignment makes the violation 
        // ... but I feel better with it

    if (signal1 > 65535.0)
    {
        // commented out this line
        // No data-flow anomoly detected
        // result = 32767;
    }

    // Snip rest of code

    return (int16_t) result;
}

Рекомендации MISRA не идеальны ни при каких обстоятельствах, но мы стараемся предотвратить очевидные ... и неинициализированные переменные довольно легко обнаружить - если вы нене пытайтесь решить эту проблему.

Это немного похоже на вставку команды, просто чтобы закрыть инструмент статического анализа ......

[см. профиль для заявлений об отказе]

0 голосов
/ 16 мая 2018

Я согласен с MISRA.

Ненужная инициализация переменной может привести к небрежному коду, поскольку он побеждает инструменты, которые проверяют неинициализированные переменные.

В вашем конкретном случае вы можете локализовать result для окончательного else случая и преждевременно вернуться в других случаях. Но это не всем по вкусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...