https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99391

            Bug ID: 99391
           Summary: Analyzer call summaries don't handle longjmp
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: dmalcolm at gcc dot gnu.org
            Blocks: 99390
  Target Milestone: ---

Consider:

/* Verify that call summaries respect longjmp.  */

/* { dg-additional-options "-fanalyzer-call-summaries
--param=analyzer-min-snodes-for-call-summary=0" } */

#include "test-setjmp.h"
#include "analyzer-decls.h"

static void inner ();

static jmp_buf env;

void outer (void)
{
  if (SETJMP (env))
    __analyzer_dump_path (); /* { dg-message "path" } */
  else
    {
      inner ();
      inner ();
    }
}

static void inner ()
{
  longjmp (env, 42); /* { dg-message "rewinding from 'longjmp' in 'inner'" } */
}


Currently the summary sees the interprocedural edge at the first call to inner,
and treats it as a regular call and thus misses the longjmp, and never reaches
the __analyzer_dump_path.  A correct implementation of summarizing the call
would somehow turn it into an unwind-from-longjmp edge, or not summarize
functions that can call longjmp (or call something that can call longjmp,
transitively)


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99390
[Bug 99390] [meta-bug] tracker bug for call summaries in -fanalyzer

Reply via email to