Просмотр и исправление не инициализированных проверок возвращаемого значения

Выполните один или несколько из следующих шагов до тех пор, пока вы не определите исправление для проверки Return value not initialized. Существует несколько способов исправить эту проверку. Для получения описания примеров проверки и кода смотрите Return value not initialized.

Иногда, особенно для оранжевого чека, можно определить, что чек представляет не реальную ошибку, а Polyspace® предположение, что не соответствует действительности для вашего кода. Если для ослабления допущения можно использовать опцию анализа, повторите верификацию с помощью этой опции. В противном случае можно добавить комментарий и обоснование в результат или код.

Общий рабочий процесс, который применяется ко всем проверкам, см. в разделе Интерпретация результатов Prover кода в пользовательском интерфейсе рабочего стола Polyspace.

Шаг 1: Интерпретируйте информацию о проверке

Выберите проверку на панели Results List. На панели Result Details просмотрите дополнительные сведения о проверке.

Просмотрите вероятную причину проверки, если она упоминается на панели Result Details.

В предыдущем примере программное обеспечение идентифицирует упорную функцию inputRep, как вероятную причину.

Возможное исправление: Чтобы избежать проверки, ограничьте аргумент или возвращаемое значение inputRep. Для образца задайте, что inputRep возвращает значения в определенной области значений, например 1..10. Для получения дополнительной информации смотрите Допущения об упрямых функциях.

Шаг 2: Определите первопричину проверки

Определите первопричину проверки в теле функции. Можно выполнить следующие шаги только в пользовательском интерфейсе Polyspace.

  1. Перейдите к определению функции.

    Щелкните правой кнопкой мыши вызов функции, содержащий проверку. Выберите Go To Definition, если опция существует.

  2. В теле функции проверьте, return ли оператор возникает перед закрывающей скобкой функции.

  3. Если a return оператор не существует:

    1. На панели Search выполните поиск по слову return, или вручную прокрутить тело функции и искать return операторы.

    2. Для каждого return оператор, определите, отображается ли оператор в возможностях, меньшей, чем возможности функции.

      Для образца, a return оператор встречается только в одной ветви if-else оператор.

    Возможное исправление: Посмотрите, можете ли вы разместить return оператор в конце тела функции. Для образца замените следующий код

    int func(int ch) {
        switch(ch) {
            case 1: return 1;
            break;
            case 2: return 2;
            break;
        }
    }
    с
    int func(int ch) {
        int temp;
        switch(ch) {
            case 1: temp = 1;
            break;
            case 2: temp = 2;
            break;
        }
        return temp;
    }
    Для получения информации о том, как применить эту практику, смотрите Number of Return Statements.

Шаг 3: Проверьте общие причины проверки

Проверьте общие причины проверки Return value not initialized.

  • Посмотрите, return ли операторы появляются в if-else, for или while блоки. Идентифицируйте условия, когда функция не входит в блок.

    Например, функция может не ввести while блок для определенных входных параметров функции.

    Возможное исправление:

    • Посмотрите, можно ли разместить return оператор в конце тела функции.

    • В противном случае определите, как избежать условия, когда функция не входит в блок.

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

  • Посмотрите, есть ли у вас такие конструкции кода, как goto которые прерывают нормальный поток управления. Посмотрите, есть ли условия, когда return операторы в функции не могут быть достигнуты из-за этих конструкций кода.

    Возможное исправление:

    • Избегайте goto операторы. Для получения информации о том, как применить эту практику, смотрите Number of Goto Statements.

    • В противном случае определите, как избежать условия при return операторы в функции не могут быть достигнуты.

Шаг 4: Проверка трассировки на допущение Polyspace

Посмотрите, можно ли проследить оранжевую проверку до допущения Polyspace, которое происходит ранее в коде. Если предположение не имеет значения true в вашем случае, добавьте комментарий или обоснование в свой результат или код. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.

Например, у вас есть return оператор в ветвях if-elseif блок, но у вас нет окончательного else блок. Условие, которое вы тестируете в if-elseif блоки включают переменные, полученные из неопределенной функции. Затем:

  1. Polyspace принимает, что для определенных значений этих переменных ни одно из if-elseif вводятся блоки.

  2. Поэтому возможно, что return операторы не достигаются.

  3. Если вы знаете, что эти значения переменных не происходят, добавьте комментарий и обоснование, описывающие, почему вы не изменили код.

Для получения дополнительной информации смотрите Допущения анализа Code Prover.

Отключение этой проверки

Можно отключить эту проверку. Если вы отключаете эту проверку, Polyspace принимает следующее о функции возврат значением, если функция отсутствует return операторы:

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

  • Если возврат значение является указателем, это может быть NULL-значен или указывает на блок памяти с неизвестным смещением.

Для получения дополнительной информации смотрите Disable checks for non-initialization (-disable-initialization-checks).