public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
@ 2023-11-30 21:14 dmalcolm at gcc dot gnu.org
  2023-11-30 21:16 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2023-11-30 21:14 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 112790
           Summary: -Wanalyzer-deref-before-check false positives seen in
                    Linux kernel due to inlining
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: dmalcolm at gcc dot gnu.org
  Target Milestone: ---

https://godbolt.org/z/4fjjcfbPb

False positive on:

typedef unsigned char u8;
struct inode {
  void *i_mapping;
  u8 i_blkbits;
};
struct block_device {
  struct inode *bd_inode;
};
int sync_blockdev(struct block_device *bdev);
int set_blocksize(struct block_device *bdev, u8 size) {
  if (bdev->bd_inode->i_blkbits != size) {
    sync_blockdev(bdev);
  }
  return 0;
}
extern int filemap_write_and_wait(void *);
int sync_blockdev(struct block_device *bdev) {
  if (!bdev)
    return 0;
  return filemap_write_and_wait(bdev->bd_inode->i_mapping);
}

$ xgcc B. -Wall -fno-delete-null-pointer-checks -O2 -fanalyzer -g -S 

False positive:

In function ‘sync_blockdev’,
    inlined from ‘set_blocksize’ at t.c:12:5:
t.c:18:6: warning: check of ‘bdev’ for NULL after already dereferencing it
[-Wanalyzer-deref-before-check]
   18 |   if (!bdev)
      |      ^
  ‘set_blocksize’: events 1-4
    |
    |   11 |   if (bdev->bd_inode->i_blkbits != size) {
    |      |      ~~~~~^~~~~~~~~~
    |      |      |    |
    |      |      |    (1) pointer ‘bdev’ is dereferenced here
    |      |      (2) following ‘true’ branch...
    |   12 |     sync_blockdev(bdev);
    |      |     ~~~~~~~~~~~~~
    |      |     |
    |      |     (3) ...to here
    |      |     (4) inlined call to ‘sync_blockdev’ from ‘set_blocksize’
    |
    +--> ‘sync_blockdev’: event 5
           |
           |   18 |   if (!bdev)
           |      |      ^
           |      |      |
           |      |      (5) pointer ‘bdev’ is checked for NULL here but it was
already dereferenced at (1)
           |

The check from the inlined function shouldn't lead to this warning.

All of "-fno-delete-null-pointer-checks -O2 -fanalyzer -g" seem to be
necessary.

(reduced from block/bdev.c)

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

* [Bug analyzer/112790] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
@ 2023-11-30 21:16 ` dmalcolm at gcc dot gnu.org
  2024-01-04 14:16 ` cvs-commit at gcc dot gnu.org
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2023-11-30 21:16 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2023-11-30
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Also affects gcc 13.2: https://godbolt.org/z/3WTrzGTTc

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

* [Bug analyzer/112790] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
  2023-11-30 21:16 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
@ 2024-01-04 14:16 ` cvs-commit at gcc dot gnu.org
  2024-01-04 14:21 ` cvs-commit at gcc dot gnu.org
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-01-04 14:16 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from GCC 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:5743e1899d596497800f7d6f4273d535ea0abcdd

commit r14-6918-g5743e1899d596497800f7d6f4273d535ea0abcdd
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Thu Jan 4 09:15:18 2024 -0500

    analyzer: fix deref-before-check false positives due to inlining [PR112790]

    gcc/analyzer/ChangeLog:
            PR analyzer/112790
            * checker-event.cc (class inlining_info): Move to...
            * inlining-iterator.h (class inlining_info): ...here.
            * sm-malloc.cc: Include "analyzer/inlining-iterator.h".
            (maybe_complain_about_deref_before_check): Reject stmts that were
            inlined from another function.

    gcc/testsuite/ChangeLog:
            PR analyzer/112790
            * c-c++-common/analyzer/deref-before-check-pr112790.c: New test.

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

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

* [Bug analyzer/112790] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
  2023-11-30 21:16 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
  2024-01-04 14:16 ` cvs-commit at gcc dot gnu.org
@ 2024-01-04 14:21 ` cvs-commit at gcc dot gnu.org
  2024-01-04 15:06 ` dmalcolm at gcc dot gnu.org
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-01-04 14:21 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from GCC 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:05c99b1c7965f46f0ff17d5e8f4020a62c643ae5

commit r14-6919-g05c99b1c7965f46f0ff17d5e8f4020a62c643ae5
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Thu Jan 4 09:19:06 2024 -0500

    analyzer: add sarif properties for checker events

    As another followup to r14-6057-g12b67d1e13b3cf, optionally add SARIF
    property bags to threadFlowLocation objects when writing out diagnostic
    paths, and add analyzer-specific properties to them.

    This was useful for debugging PR analyzer/112790.

    gcc/analyzer/ChangeLog:
            * checker-event.cc: Include "diagnostic-format-sarif.h" and
            "tree-logical-location.h".
            (checker_event::maybe_add_sarif_properties): New.
            (superedge_event::maybe_add_sarif_properties): New.
            (superedge_event::superedge_event): Add comment.
            * checker-event.h (checker_event::maybe_add_sarif_properties): New
            decl.
            (superedge_event::maybe_add_sarif_properties): New decl.

    gcc/ChangeLog:
            * diagnostic-format-sarif.cc
            (sarif_builder::make_logical_location_object): Convert to...
            (make_sarif_logical_location_object): ...this.
            (sarif_builder::set_any_logical_locs_arr): Update for above
            change.
            (sarif_builder::make_thread_flow_location_object): Call
            maybe_add_sarif_properties on each diagnostic_event.
            * diagnostic-format-sarif.h (class logical_location): New forward
            decl.
            (make_sarif_logical_location_object): New decl.
            * diagnostic-path.h (class sarif_object): New forward decl.
            (diagnostic_event::maybe_add_sarif_properties): New vfunc.

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

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

* [Bug analyzer/112790] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
                   ` (2 preceding siblings ...)
  2024-01-04 14:21 ` cvs-commit at gcc dot gnu.org
@ 2024-01-04 15:06 ` dmalcolm at gcc dot gnu.org
  2024-04-14  5:20 ` [Bug analyzer/112790] [13 Regression] " pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2024-01-04 15:06 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED

--- Comment #4 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Should be fixed by the above patch on trunk.

Keeping open as it still affects GCC 13.

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

* [Bug analyzer/112790] [13 Regression] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
                   ` (3 preceding siblings ...)
  2024-01-04 15:06 ` dmalcolm at gcc dot gnu.org
@ 2024-04-14  5:20 ` pinskia at gcc dot gnu.org
  2024-05-09 17:11 ` cvs-commit at gcc dot gnu.org
  2024-05-09 17:52 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-04-14  5:20 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |13.3

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

* [Bug analyzer/112790] [13 Regression] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
                   ` (4 preceding siblings ...)
  2024-04-14  5:20 ` [Bug analyzer/112790] [13 Regression] " pinskia at gcc dot gnu.org
@ 2024-05-09 17:11 ` cvs-commit at gcc dot gnu.org
  2024-05-09 17:52 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-05-09 17:11 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by David Malcolm
<dmalcolm@gcc.gnu.org>:

https://gcc.gnu.org/g:994477c41049d45b60a4d6db7f624fe5c89860fe

commit r13-8751-g994477c41049d45b60a4d6db7f624fe5c89860fe
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Thu May 9 13:09:29 2024 -0400

    analyzer: fix deref-before-check false positives due to inlining [PR112790]

    Backported from commit r14-6918-g5743e1899d5964 (moving testcase from
    c-c++-common to gcc.dg).

    gcc/analyzer/ChangeLog:
            PR analyzer/112790
            * checker-event.cc (class inlining_info): Move to...
            * inlining-iterator.h (class inlining_info): ...here.
            * sm-malloc.cc: Include "analyzer/inlining-iterator.h".
            (maybe_complain_about_deref_before_check): Reject stmts that were
            inlined from another function.

    gcc/testsuite/ChangeLog:
            PR analyzer/112790
            * gcc.dg/analyzer/deref-before-check-pr112790.c: New test.

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

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

* [Bug analyzer/112790] -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining
  2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
                   ` (5 preceding siblings ...)
  2024-05-09 17:11 ` cvs-commit at gcc dot gnu.org
@ 2024-05-09 17:52 ` dmalcolm at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: dmalcolm at gcc dot gnu.org @ 2024-05-09 17:52 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
            Summary|[13 Regression]             |-Wanalyzer-deref-before-che
                   |-Wanalyzer-deref-before-che |ck false positives seen in
                   |ck false positives seen in  |Linux kernel due to
                   |Linux kernel due to         |inlining
                   |inlining                    |
             Status|ASSIGNED                    |RESOLVED

--- Comment #6 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Should be fixed for GCC 13 (for the upcoming GCC 13.3) by the above patch.

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

end of thread, other threads:[~2024-05-09 17:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-30 21:14 [Bug analyzer/112790] New: -Wanalyzer-deref-before-check false positives seen in Linux kernel due to inlining dmalcolm at gcc dot gnu.org
2023-11-30 21:16 ` [Bug analyzer/112790] " dmalcolm at gcc dot gnu.org
2024-01-04 14:16 ` cvs-commit at gcc dot gnu.org
2024-01-04 14:21 ` cvs-commit at gcc dot gnu.org
2024-01-04 15:06 ` dmalcolm at gcc dot gnu.org
2024-04-14  5:20 ` [Bug analyzer/112790] [13 Regression] " pinskia at gcc dot gnu.org
2024-05-09 17:11 ` cvs-commit at gcc dot gnu.org
2024-05-09 17:52 ` [Bug analyzer/112790] " 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).