V591. Non-void function should return a value.


Анализатор обнаружил функцию, которая возвращает случайное значение. Это может являться ошибкой.

Рассмотрим пример:

int main (int argc, char** argv)
{
  ...
  printf("FINISH\r\n");
}

Функция main() возвращает целое число, которое принимает вызывающий процесс. Если main() нe возвращает значение явно, то вызывающий процесс получает формально неопределенное значение. Корректный вариант:

int main (int argc, char** argv)
{
  ...
  printf("FINISH\r\n");
  return retCode;
}

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

BOOL IsInterestingString(char *s)
{
  if (s == NULL)
    return FALSE;
  if (strlen(s) < 4)
    return;
  return (s[0] == '#') ? TRUE : FALSE;
}

В коде допущена опечатка. Если длина строки меньше 4 символов, то функция вернет неопределенное значение. Корректный вариант:

BOOL IsInterestingString(char *s)
{
  if (s == NULL)
    return FALSE;
  if (strlen(s) < 4)
    return FALSE;
  return (s[0] == '#') ? TRUE : FALSE;
}

Примечание. Анализатор старается определить ситуации, когда отсутствие возвращаемого значения не является ошибкой. Пример кода, который анализатор сочтет безопасным:

int Foo()
{
  ...
  exit(10);
}

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-393.

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V591.


Найденные ошибки

Проверено проектов
363
Собрано ошибок
13 495

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;