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

--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> ---
struct S {
    S() { p = new int(); }
    ~S() { delete p; }
    int* p = nullptr;
};

int main() {
    S s;
}


Everything the analyzer says is wrong :-)

dest.C: In function ‘int main()’:
dest.C:9:1: warning: leak of ‘s.S::p’ [CWE-401] [-Wanalyzer-malloc-leak]
    9 | }
      | ^
  ‘int main()’: events 1-2
    |
    |    7 | int main() {
    |      |     ^~~~
    |      |     |
    |      |     (1) entry to ‘main’
    |    8 |     S s;
    |      |       ~
    |      |       |
    |      |       (2) calling ‘S::S’ from ‘main’
    |
    +--> ‘S::S()’: events 3-5
           |
           |    2 |     S() { p = new int(); }
           |      |     ^     ~~~~~~~~~~~~~
           |      |     |       |         |
           |      |     |       |         (4) allocated here
           |      |     |       (5) assuming ‘operator new(4)’ is non-NULL
           |      |     (3) entry to ‘S::S’
           |
    <------+
    |
  ‘int main()’: events 6-7
    |
    |    8 |     S s;
    |      |       ^
    |      |       |
    |      |       (6) returning to ‘main’ from ‘S::S’
    |    9 | }
    |      | ~      
    |      | |
    |      | (7) ‘s.S::p’ leaks here; was allocated at (4)
    |
dest.C: In constructor ‘S::S()’:
dest.C:2:13: warning: dereference of possibly-NULL ‘operator new(4)’ [CWE-690]
[-Wanalyzer-possible-null-dereference]
    2 |     S() { p = new int(); }
      |           ~~^~~~~~~~~~~
  ‘S::S()’: events 1-2
    |
    |    2 |     S() { p = new int(); }
    |      |           ~~~~~~~~~~~~^
    |      |             |         |
    |      |             |         (1) this call could return NULL
    |      |             (2) ‘operator new(4)’ could be NULL: unchecked value
from (1)
    |

As already noted above, new can't return null here, and there is no dereference
anyway. And the pointer isn't leaked, but it seems maybe the analyzer doesn't
know about destructors?

Reply via email to