public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug analyzer/108935] New: Incorrect warning for infinite recursion
@ 2023-02-26 19:29 zach-gcc at cs dot stanford.edu
  2023-02-27 23:34 ` [Bug analyzer/108935] " dmalcolm at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: zach-gcc at cs dot stanford.edu @ 2023-02-26 19:29 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 108935
           Summary: Incorrect warning for infinite recursion
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: zach-gcc at cs dot stanford.edu
  Target Milestone: ---

The following code does not have infinite recursion:

```
typedef struct {
    unsigned idx;
    int vals[512];
} foo_t;

int ended(foo_t* f) {
    return f->idx >= 512;
}
unsigned foo(foo_t* f) {
    if (ended(f)) {
        return f->idx;
    }
    do {
        f->idx++;
    } while(!ended(f) && !f->vals[f->idx]);
    return foo(f);
}
```

but -fanalyzer reports infinite recursion (called with `gcc -fanalyzer -c
test.c`). The function always makes progress towards f->idx reaching 512, which
is the termination condition. It is bounded to at most 512 recursive calls. I
can even add `f->idx += 1000` and the warning is still reported.

I've also noticed the following example causes a similar warning, but only when
`foo` is also invoked.

```
typedef struct {
    unsigned done;
} foo_t;

unsigned foo(foo_t* f) {
    if (f->done) {
        return f->done;
    }
    f->done = 1;
    return foo(f);
}

int main() {
    foo_t f = (foo_t){
        .done = 0,
    };
    // must be called to cause warning
    foo(&f);
}
```

Tested on version GCC 13 20230203 (commit hash a37a0cb303d). Thanks.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug analyzer/108935] Incorrect warning for infinite recursion
  2023-02-26 19:29 [Bug analyzer/108935] New: Incorrect warning for infinite recursion zach-gcc at cs dot stanford.edu
@ 2023-02-27 23:34 ` dmalcolm at gcc dot gnu.org
  2023-03-01 13:57 ` cvs-commit at gcc dot gnu.org
  2023-03-01 14:15 ` dmalcolm at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2023-02-27 23:34 UTC (permalink / raw)
  To: gcc-bugs

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

David Malcolm <dmalcolm at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2023-02-27
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #1 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Thanks for filing this bug.  Confirmed; am investigating.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug analyzer/108935] Incorrect warning for infinite recursion
  2023-02-26 19:29 [Bug analyzer/108935] New: Incorrect warning for infinite recursion zach-gcc at cs dot stanford.edu
  2023-02-27 23:34 ` [Bug analyzer/108935] " dmalcolm at gcc dot gnu.org
@ 2023-03-01 13:57 ` cvs-commit at gcc dot gnu.org
  2023-03-01 14:15 ` dmalcolm at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-03-01 13:57 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalcolm@gcc.gnu.org>:

https://gcc.gnu.org/g:070523b9d4c6cfa69060255893006efaf39bf617

commit r13-6393-g070523b9d4c6cfa69060255893006efaf39bf617
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Wed Mar 1 08:54:43 2023 -0500

    analyzer: fix infinite recursion false +ves [PR108935]

    gcc/analyzer/ChangeLog:
            PR analyzer/108935
            * infinite-recursion.cc (contains_unknown_p): New.
            (sufficiently_different_region_binding_p): New function, splitting
            out inner loop from...
            (sufficiently_different_p): ...here.  Extend detection of unknown
            svalues to also include svalues that contain unknown.  Treat
            changes in frames below the entry to the recursion as being
            sufficiently different to reject being an infinite recursion.

    gcc/testsuite/ChangeLog:
            PR analyzer/108935
            * gcc.dg/analyzer/infinite-recursion-pr108935-1.c: New test.
            * gcc.dg/analyzer/infinite-recursion-pr108935-1a.c: New test.
            * gcc.dg/analyzer/infinite-recursion-pr108935-2.c: New test.

    Signed-off-by: David Malcolm <dmalcolm@redhat.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug analyzer/108935] Incorrect warning for infinite recursion
  2023-02-26 19:29 [Bug analyzer/108935] New: Incorrect warning for infinite recursion zach-gcc at cs dot stanford.edu
  2023-02-27 23:34 ` [Bug analyzer/108935] " dmalcolm at gcc dot gnu.org
  2023-03-01 13:57 ` cvs-commit at gcc dot gnu.org
@ 2023-03-01 14:15 ` dmalcolm at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2023-03-01 14:15 UTC (permalink / raw)
  To: gcc-bugs

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

David Malcolm <dmalcolm at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
             Status|ASSIGNED                    |RESOLVED

--- Comment #3 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Should be fixed by the above commit; marking this as resolved.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-03-01 14:15 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-26 19:29 [Bug analyzer/108935] New: Incorrect warning for infinite recursion zach-gcc at cs dot stanford.edu
2023-02-27 23:34 ` [Bug analyzer/108935] " dmalcolm at gcc dot gnu.org
2023-03-01 13:57 ` cvs-commit at gcc dot gnu.org
2023-03-01 14:15 ` dmalcolm at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).