Missing return statement

Функция не делает возвращаемого значения, хотя возвращаются, типом не является void

Описание

Этот дефект происходит, когда функция не возвращает значение вдоль по крайней мере одного пути к выполнению. Этот дефект не происходит если:

  • Типом возврата функции является void.

  • Путь к выполнению отключен функцией, которая не возвращает поток выполнения, такого как [[noreturn]] функция.

Риск

Если функция имеет non-void возвращаемое значение в его подписи, это, как ожидают, возвратит значение. Возвращаемое значение этой функции может использоваться в более поздних расчетах. Если выполнение тела функции проходит путь где return оператор отсутствует, функциональное возвращаемое значение неопределенно. Расчеты с этим возвращаемым значением могут привести к непредсказуемым результатам.

Исправление

В большинстве случаев можно зафиксировать этот дефект путем размещения return оператор в конце тела функции. Если ваш код имеет пути к выполнению, которые не возвращают поток выполнения, задают их при помощи атрибута [[noreturn]].

В качестве альтернативы можно идентифицировать, какие пути к выполнению через тело функции не имеют return оператор и добавляет return оператор на тех путях. Часто детали результата (или подсказки исходного кода в Polyspace, когда Вы Кодируете) показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают эту историю события, можно искать предыдущие ссылки переменных, относящихся к дефектному использованию, щелкают правой кнопкой по опциям по исходному коду и находят связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace или Интерпретируют Результаты Bug Finder в Polyspace доступ к веб-интерфейсу.

Смотрите примеры мер ниже.

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

Если анализ отмечает недостающий return оператор на пути, где функция завершения процесса существует, можно сделать анализ, знающий о функции завершения процесса использование опции -termination-functions.

Примеры

развернуть все

int AddSquares(int n)
 {
   int i=0;
   int sum=0;
   
   if(n!=0) 
    {
     for(i=1;i<=n;i++)
        {
         sum+=i^2;
        }
     return(sum);
    }
 } 
/* Defect: No return value if n is not 0*/

Если n равно 0, код не вводит if оператор. Поэтому функциональный AddSquares не возвращает значение если n 0.

Коррекция — помещает оператор возврата в каждый путь к выполнению

Одна возможная коррекция должна возвратить значение в каждой ветви if...else оператор.

 int AddSquares(int n)
 {
   int i=0;
   int sum=0;
   
   if(n!=0) 
    {
     for(i=1;i<=n;i++)
        {
         sum+=i^2;
        }
     return(sum);
    } 
   
   /*Fix: Place a return statement on branches of if-else */
   else 
     return 0;  
  }

Информация о результате

Группа: Поток данных
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: MISSING_RETURN
Удар: низко
Введенный в R2013b