<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Request: add attribute to annotate function as "always returns X""
   href="http://llvm.org/bugs/show_bug.cgi?id=19208">19208</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Request: add attribute to annotate function as "always returns X"
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Static Analyzer
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>kremenek@apple.com
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>icculus@icculus.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>(This is tested against checker-276.)

Is there a way to annotate a function, so that Clang knows it always returns a
specific value?

Here's our use case:

We used to have a bunch of code like this...

    void SDL_SetError(const char *errmsg);

    // ...

    if (bad_thing_happened) {
        SDL_SetError("Uh no!");
        return -1;
    }

...but to unclutter things, we do this now...

    int SDL_SetError(const char *errmsg);

    // ...

    if (bad_thing_happened) {
        return SDL_SetError("Uh no!");
    }


SDL_SetError() always returns -1, it's just that way to clean up the code a
little, as this is a common idiom for us.

The problem is that Clang doesn't know this, so it produces false positives in
static analysis like this one:

<a href="https://buildbot.libsdl.org/sdl-static-analysis/sdl-macosx-static-analysis/sdl-macosx-static-analysis-8/report-1470c3.html#EndPath">https://buildbot.libsdl.org/sdl-static-analysis/sdl-macosx-static-analysis/sdl-macosx-static-analysis-8/report-1470c3.html#EndPath</a>

The simple fix for this on our end is to initialize that variable--and we
will--but it would be nice if we could tell Clang that Step #10 in that report
can't ever take the false branch, because when we returned SDL_SetError() in
Step #8, it would always force the true branch in Step #10.

But at the moment, Clang just understands that some unavailable function
returns an int of any possible value.

We don't want to litter every one of these cases with asserts, as it defeats
the purpose of the idiom (and would be ugly in any case, as we use this all
over the codebase).

I'm thinking of something like this:

    int SDL_SetError(const char *errmsg) __attribute__((always_returns(-1)));

Where "-1" can be a comma separated list of possible values that must be
literal, POD values. Extra credit if the compiler throws an error if
SDL_SetError() tries to return something other than one of the literal values.

(This is related to <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Allow to annotate a function that has a restricted set of output values."
   href="show_bug.cgi?id=17404">Bug #17404</a>, but I'm not sure it's the same problem. Feel
free to mark this as a duplicate if that's that case, though.)

Thanks!

--ryan.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>