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

            Bug ID: 106441
           Summary: Analyzer has some issues with nested functions
                    extension to C
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: dmalcolm at gcc dot gnu.org
  Target Milestone: ---

See: https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

Given:

#include "analyzer-decls.h"

static int __attribute__((noinline))
__analyzer_callee_test_1 (int a, int b)
{
  int square (int z) { return z * z; }

  return square (a) + square (b);
}

void test_1 (void)
{
  __analyzer_describe (0, __analyzer_callee_test_1 (3, 4)); /* { dg-warning
"'\\(int\\)25'" } */
}

void test_2 (void *p)
{
  void call_free ()
  {
    __builtin_free (p); /* { dg-warning "double-'free'" } */
  }
  call_free (p);
  call_free (p);
}

static int __attribute__((noinline))
__analyzer_callee_test_3 (int a, int b, int (**out_fn) (int))
{
  int square (int z) { return z * z; }

  *out_fn = square;

  return square (a) + square (b);
}

void test_3 (void)
{
  int (*nested_fn) (int);
  __analyzer_describe (0, __analyzer_callee_test_3 (3, 4, &nested_fn)); /* {
dg-warning "'\\(int\\)25'" } */

  __analyzer_describe (0, nested_fn (4));  /* { dg-warning "'\\(int\\)16'" "" {
xfail *-*-* } } */
}

...it kind of works, but there are some issues.

The double-free is reported as:
nested-fn-1.c:20:5: warning: double-‘free’ of ‘*CHAIN.p’ [CWE-415]
[-Wanalyzer-double-free]
   20 |     __builtin_free (p);
      |     ^~~~~~~~~~~~~~~~~~
where the "CHAIN" implementation detail leaks through.


The square of 4 via a function pointer is reported as:
nested-fn-1.c:41:3: warning: svalue: ‘CONJURED(_3 = nested_fn.6_2 (4);, _3)’
   41 |   __analyzer_describe (0, nested_fn (4));

rather than as 16.

Looking at the gimple dump I see uses of __builtin_dwarf_cfa,
__builtin_init_trampoline, __builtin_adjust_trampoline, and references to a
"static-chain" at calls.  The analyzer doesn't know anything about any of this
(and neither do I, right now :) )

Reply via email to