# V779. Unreachable code was detected. It is possible that an error is present.

The analyzer detected code that will never be executed. It may signal the presence of a logic error.

This diagnostic is designed to find blocks of code that will never get control.

Consider the following example:

    void Error()
    {
      ....
      exit(1);
    }

    FILE* OpenFile(const char *filename)
    {
      FILE *f = fopen(filename, "w");
      if (f == nullptr)
      {
        Error();
        printf("No such file: %s", filename);
      }
      return f;
    }

The 'printf(....)' function will never print the error message, as the 'Error()' function does not return control. The exact way of fixing this error depends on the logic intended by the programmer. The function could be meant to return control, or maybe the expressions are executed in the wrong order and the code was actually meant to look like this:

    FILE* OpenFile(const char *filename)
    {
      FILE *f = fopen(filename, "w");
      if (f == nullptr)
      {
        printf("No such file: %s", filename);
        Error();
      }
      return f;
    }

Here is another example:

    void f(char *s, size_t n)
    {
      for (size_t i = 0; i < n; ++i)
      {
        if (s[i] == '\0')
          break;
        else
          return;

        s[i] = toupper(s[i]);
      }
    }

The code after the 'if' statement will be skipped, since neither of the branches returns control. A possible solution is to enclose the code in one of the branches or delete the noreturn expression.

Here is an example of how the code above could be fixed:

    void f(char *s, size_t n)
    {
      for (size_t i = 0; i < n; ++i)
      {
        if (s[i] == '\0')
          break;

        s[i] = toupper(s[i]);
      }
    }

When a function implementation is stored in another file, the analyzer needs a clue to understand that the function always terminates the program. Otherwise, it could miss the error. You can use annotations when declaring the function to give the analyzer that clue:

    [[noreturn]] void my_abort(); // C++11
    __declspec(noreturn) void my_abort(); // MSVC
    __attribute__((noreturn)) void my_abort(); // GCC

The analyzer does not output the warning in certain cases even though there is formally an error. For example:

    int test()
    {
      throw 0;
      return 0;
    }

The reason why it skips code like this is that programmers often use it to suppress compiler warnings or messages from other analyzers.

This diagnostic is classified as:

CWE-561 CERT-MSC12-C

You can look at examples of errors detected by the V779 diagnostic.