exponenta event banner

Отсутствует инструкция возврата

Функция не возвращает значение, хотя возвращаемый тип не void

Описание

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

  • Возвращаемый тип функции: void.

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

Риск

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

Зафиксировать

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

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

См. примеры исправлений ниже.

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

Если анализ помечает отсутствующий 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++
По умолчанию: Вкл.
Синтаксис командной строки: MISSING_RETURN
Воздействие: Низкий
Представлен в R2013b