CERT C: Rule MSC37-C

Убедитесь, что управление никогда не достигает конца непустой функции

Описание

Управляйте определением

Убедитесь, что управление никогда не достигает конца непустой функции. [1]

Реализация Polyspace

Это средство проверки проверяет на Пропавших без вести оператора возврата.

Примеры

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

Проблема

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

Риск

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

Фиксация

В большинстве случаев можно зафиксировать этот дефект путем размещения return оператор в конце тела функции.

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

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

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

Пример - Пропавшие без вести или недопустимая ошибка оператора возврата

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;  
  }

Проверяйте информацию

Группа: правило 48. Разное (MSC)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.