exponenta event banner

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