diff options
Diffstat (limited to 'gcc')
16 files changed, 799 insertions, 877 deletions
diff --git a/gcc/diagnostic-path.h b/gcc/diagnostic-path.h index fb7abe8..696991c 100644 --- a/gcc/diagnostic-path.h +++ b/gcc/diagnostic-path.h @@ -41,22 +41,20 @@ class sarif_object; 29 | PyList_Append(list, item); | ^~~~~~~~~~~~~~~~~~~~~~~~~ 'demo': events 1-3 - | - | 25 | list = PyList_New(0); - | | ^~~~~~~~~~~~~ - | | | - | | (1) when 'PyList_New' fails, returning NULL - | 26 | - | 27 | for (i = 0; i < count; i++) { - | | ~~~ - | | | - | | (2) when 'i < count' - | 28 | item = PyLong_FromLong(random()); - | 29 | PyList_Append(list, item); - | | ~~~~~~~~~~~~~~~~~~~~~~~~~ - | | | - | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 - | + 25 | list = PyList_New(0); + | ^~~~~~~~~~~~~ + | | + | (1) when 'PyList_New' fails, returning NULL + 26 | + 27 | for (i = 0; i < count; i++) { + | ~~~ + | | + | (2) when 'i < count' + 28 | item = PyLong_FromLong(random()); + 29 | PyList_Append(list, item); + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + | | + | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 The diagnostic-printing code has consolidated the path into a single run of events, since all the events are near each other and within the same @@ -146,7 +144,7 @@ class diagnostic_event virtual tree get_fndecl () const = 0; - /* Stack depth, so that consumers can visualizes the interprocedural + /* Stack depth, so that consumers can visualize the interprocedural calls, returns, and frame nesting. */ virtual int get_stack_depth () const = 0; diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index cedc1a2..bcf518a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -5598,22 +5598,20 @@ For example, the same events as above might be printed as: @smallexample 'test': events 1-3 - | - | 25 | list = PyList_New(0); - | | ^~~~~~~~~~~~~ - | | | - | | (1) when 'PyList_New' fails, returning NULL - | 26 | - | 27 | for (i = 0; i < count; i++) @{ - | | ~~~ - | | | - | | (2) when 'i < count' - | 28 | item = PyLong_FromLong(random()); - | 29 | PyList_Append(list, item); - | | ~~~~~~~~~~~~~~~~~~~~~~~~~ - | | | - | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 - | + 25 | list = PyList_New(0); + | ^~~~~~~~~~~~~ + | | + | (1) when 'PyList_New' fails, returning NULL + 26 | + 27 | for (i = 0; i < count; i++) @{ + | ~~~ + | | + | (2) when 'i < count' + 28 | item = PyLong_FromLong(random()); + 29 | PyList_Append(list, item); + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + | | + | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 @end smallexample Interprocedural control flow is shown by grouping the events by stack frame, diff --git a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-1.c b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-1.c index de1a49c..bc83194 100644 --- a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-1.c +++ b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-1.c @@ -12,25 +12,21 @@ void test_constant_1 (void) int32_t *ptr = (int32_t *) __builtin_malloc (1); ^~~~~~~~~~~~~~~~~~~~ 'test_constant_1': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (1); - | ^~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 1 byte here - | (2) assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_malloc (1); + ^~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 1 byte here + (2) assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_malloc (1); ~~~~~~~~~~~~~~~~~^~~ 'void test_constant_1()': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (1); - | ~~~~~~~~~~~~~~~~~^~~ - | | - | (1) allocated 1 byte here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_malloc (1); + ~~~~~~~~~~~~~~~~~^~~ + | + (1) allocated 1 byte here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ void test_constant_2 (void) @@ -43,26 +39,22 @@ void test_constant_2 (void) int32_t *ptr = (int32_t *) __builtin_malloc (2); ^~~~~~~~~~~~~~~~~~~~ 'test_constant_2': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (2); - | ^~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 2 bytes here - | (2) assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_malloc (2); + ^~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 2 bytes here + (2) assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_malloc (2); ~~~~~~~~~~~~~~~~~^~~ 'void test_constant_2()': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (2); - | ~~~~~~~~~~~~~~~~~^~~ - | | - | (1) allocated 2 bytes here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_malloc (2); + ~~~~~~~~~~~~~~~~~^~~ + | + (1) allocated 2 bytes here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ void test_symbolic (int n) @@ -75,22 +67,18 @@ void test_symbolic (int n) int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); ^~~~~~~~~~~~~~~~~~~~~~~~ 'test_symbolic': event 1 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); - | ^~~~~~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 'n * 2' bytes and assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); + ^~~~~~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 'n * 2' bytes and assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); ~~~~~~~~~~~~~~~~~^~~~~~~ 'void test_symbolic(int)': event 1 - | - | int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); - | ~~~~~~~~~~~~~~~~~^~~~~~~ - | | - | (1) allocated '(n * 2)' bytes and assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_malloc (n * 2); + ~~~~~~~~~~~~~~~~~^~~~~~~ + | + (1) allocated '(n * 2)' bytes and assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-2.c b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-2.c index a5def27..cfd6b4f 100644 --- a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-2.c +++ b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-2.c @@ -12,25 +12,21 @@ void test_constant_1 (void) int32_t *ptr = (int32_t *) __builtin_alloca (1); ^~~~~~~~~~~~~~~~~~~~ 'test_constant_1': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (1); - | ^~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 1 byte here - | (2) assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_alloca (1); + ^~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 1 byte here + (2) assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_alloca (1); ~~~~~~~~~~~~~~~~~^~~ 'void test_constant_1()': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (1); - | ~~~~~~~~~~~~~~~~~^~~ - | | - | (1) allocated 1 byte here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_alloca (1); + ~~~~~~~~~~~~~~~~~^~~ + | + (1) allocated 1 byte here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ void test_constant_2 (void) @@ -42,25 +38,21 @@ void test_constant_2 (void) int32_t *ptr = (int32_t *) __builtin_alloca (2); ^~~~~~~~~~~~~~~~~~~~ 'test_constant_2': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (2); - | ^~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 2 bytes here - | (2) assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_alloca (2); + ^~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 2 bytes here + (2) assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_alloca (2); ~~~~~~~~~~~~~~~~~^~~ 'void test_constant_2()': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (2); - | ~~~~~~~~~~~~~~~~~^~~ - | | - | (1) allocated 2 bytes here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_alloca (2); + ~~~~~~~~~~~~~~~~~^~~ + | + (1) allocated 2 bytes here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ void test_symbolic (int n) @@ -72,25 +64,21 @@ void test_symbolic (int n) int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); ^~~~~~~~~~~~~~~~~~~~~~~~ 'test_symbolic': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); - | ^~~~~~~~~~~~~~~~~~~~~~~~ - | | - | (1) allocated 'n * 2' bytes here - | (2) assigned to 'int32_t *' - | + int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); + ^~~~~~~~~~~~~~~~~~~~~~~~ + | + (1) allocated 'n * 2' bytes here + (2) assigned to 'int32_t *' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); ~~~~~~~~~~~~~~~~~^~~~~~~ 'void test_symbolic(int)': events 1-2 - | - | int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); - | ~~~~~~~~~~~~~~~~~^~~~~~~ - | | - | (1) allocated '(n * 2)' bytes here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) __builtin_alloca (n * 2); + ~~~~~~~~~~~~~~~~~^~~~~~~ + | + (1) allocated '(n * 2)' bytes here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ /* FIXME: am getting a duplicate warning here for some reason diff --git a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-3.c b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-3.c index 3cf7fb0..eeb5219 100644 --- a/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-3.c +++ b/gcc/testsuite/c-c++-common/analyzer/allocation-size-multiline-3.c @@ -16,25 +16,21 @@ void test_constant_99 (void) int32_t *ptr = (int32_t *) alloca (99); ^~~~~~ 'test_constant_99': events 1-2 - | - | int32_t *ptr = (int32_t *) alloca (99); - | ^~~~~~ - | | - | (1) allocated 99 bytes here - | (2) assigned to 'int32_t *' {aka '{re:long :re?}int *'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) alloca (99); + ^~~~~~ + | + (1) allocated 99 bytes here + (2) assigned to 'int32_t *' {aka '{re:long :re?}int *'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) alloca (99); ^~~~~~ 'void test_constant_99()': events 1-2 - | - | int32_t *ptr = (int32_t *) alloca (99); - | ^~~~~~ - | | - | (1) allocated 99 bytes here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) alloca (99); + ^~~~~~ + | + (1) allocated 99 bytes here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ void test_symbolic (int n) @@ -46,23 +42,19 @@ void test_symbolic (int n) int32_t *ptr = (int32_t *) alloca (n * 2); ^~~~~~ 'test_symbolic': events 1-2 - | - | int32_t *ptr = (int32_t *) alloca (n * 2); - | ^~~~~~ - | | - | (1) allocated 'n * 2' bytes here - | (2) assigned to 'int32_t *' {aka '{re:long :re?}int *'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) alloca (n * 2); + ^~~~~~ + | + (1) allocated 'n * 2' bytes here + (2) assigned to 'int32_t *' {aka '{re:long :re?}int *'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } int32_t *ptr = (int32_t *) alloca (n * 2); ^~~~~~ 'void test_symbolic(int)': events 1-2 - | - | int32_t *ptr = (int32_t *) alloca (n * 2); - | ^~~~~~ - | | - | (1) allocated '(n * 2)' bytes here - | (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' - | + int32_t *ptr = (int32_t *) alloca (n * 2); + ^~~~~~ + | + (1) allocated '(n * 2)' bytes here + (2) assigned to 'int32_t*' {aka '{re:long :re?}int*'} here; 'sizeof (int32_t {aka {re:long :re?}int})' is '4' { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-0.c b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-0.c index 24fe84d..acc4156 100644 --- a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-0.c +++ b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-0.c @@ -227,31 +227,27 @@ void test_3 (void *ptr) NN | free (ptr); | ^~~~~~~~~~ 'test_3': events 1-2 - | - | NN | free (ptr); - | | ^~~~~~~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ^~~~~~~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_3(void*)': events 1-2 - | - | NN | free (ptr); - | | ~~~~~^~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ~~~~~^~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-1.c b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-1.c index e134370..27b885d 100644 --- a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-1.c +++ b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-1.c @@ -285,31 +285,27 @@ void test_3 (void *ptr) NN | free (ptr); | ^~~~~~~~~~ 'test_3': events 1-2 - | - | NN | free (ptr); - | | ^~~~~~~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ^~~~~~~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_3(void*)': events 1-2 - | - | NN | free (ptr); - | | ~~~~~^~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ~~~~~^~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-2.c b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-2.c index 0fd8654..d2dc522 100644 --- a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-2.c +++ b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-2.c @@ -345,31 +345,27 @@ void test_3 (void *ptr) NN | free (ptr); | ^~~~~~~~~~ 'test_3': events 1-2 - | - | NN | free (ptr); - | | ^~~~~~~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ^~~~~~~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_3(void*)': events 1-2 - | - | NN | free (ptr); - | | ~~~~~^~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ~~~~~^~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-3.c b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-3.c index ac699ec..3661f1f 100644 --- a/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-3.c +++ b/gcc/testsuite/c-c++-common/analyzer/analyzer-verbosity-3.c @@ -345,31 +345,27 @@ void test_3 (void *ptr) NN | free (ptr); | ^~~~~~~~~~ 'test_3': events 1-2 - | - | NN | free (ptr); - | | ^~~~~~~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ^~~~~~~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_3(void*)': events 1-2 - | - | NN | free (ptr); - | | ~~~~~^~~~~ - | | | - | | (1) first 'free' here - | NN | called_by_test_3 (); - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | + NN | free (ptr); + | ~~~~~^~~~~ + | | + | (1) first 'free' here + NN | called_by_test_3 (); + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/malloc-macro-inline-events.c b/gcc/testsuite/c-c++-common/analyzer/malloc-macro-inline-events.c index d00d076..8620bc9 100644 --- a/gcc/testsuite/c-c++-common/analyzer/malloc-macro-inline-events.c +++ b/gcc/testsuite/c-c++-common/analyzer/malloc-macro-inline-events.c @@ -17,51 +17,58 @@ void test (void *ptr) | ^~~~~~~~~ NN | WRAPPED_FREE (ptr); | ^~~~~~~~~~~~ - 'test': event 1 - | - | - | NN | #define WRAPPED_FREE(PTR) free(PTR) - | | ^~~~~~~~~ - | | | - | | (1) first 'free' here - | NN | WRAPPED_FREE (ptr); - | | ^~~~~~~~~~~~ - | - 'test': event 2 - | - | - | NN | #define WRAPPED_FREE(PTR) free(PTR) - | | ^~~~~~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | NN | WRAPPED_FREE (ptr); - | | ^~~~~~~~~~~~ - | { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | #define WRAPPED_FREE(PTR) free(PTR) | ~~~~^~~~~ NN | WRAPPED_FREE (ptr); | ^~~~~~~~~~~~ + { dg-end-multiline-output "" { target c++ } } */ + /* { dg-begin-multiline-output "" } + 'test': event 1 + { dg-end-multiline-output "" { target c } } */ + /* { dg-begin-multiline-output "" } 'void test(void*)': event 1 - | - | - | NN | #define WRAPPED_FREE(PTR) free(PTR) - | | ~~~~^~~~~ - | | | - | | (1) first 'free' here - | NN | WRAPPED_FREE (ptr); - | | ^~~~~~~~~~~~ - | + { dg-end-multiline-output "" { target c++ } } */ + /* { dg-prune-output "\[^\n\r\]*malloc-macro.h\[^\n\r\]*" } */ + /* { dg-begin-multiline-output "" } + NN | #define WRAPPED_FREE(PTR) free(PTR) + | ^~~~~~~~~ + | | + | (1) first 'free' here + NN | WRAPPED_FREE (ptr); + | ^~~~~~~~~~~~ + { dg-end-multiline-output "" { target c } } */ + /* { dg-begin-multiline-output "" } + NN | #define WRAPPED_FREE(PTR) free(PTR) + | ~~~~^~~~~ + | | + | (1) first 'free' here + NN | WRAPPED_FREE (ptr); + | ^~~~~~~~~~~~ + { dg-end-multiline-output "" { target c++ } } */ + /* { dg-prune-output "\[^\n\r\]*malloc-macro.h\[^\n\r\]*" } */ + /* { dg-begin-multiline-output "" } + 'test': event 2 + { dg-end-multiline-output "" { target c } } */ + /* { dg-begin-multiline-output "" } 'void test(void*)': event 2 - | - | - | NN | #define WRAPPED_FREE(PTR) free(PTR) - | | ~~~~^~~~~ - | | | - | | (2) second 'free' here; first 'free' was at (1) - | NN | WRAPPED_FREE (ptr); - | | ^~~~~~~~~~~~ - | + { dg-end-multiline-output "" { target c++ } } */ + /* { dg-prune-output "\[^\n\r\]*malloc-macro.h\[^\n\r\]*" } */ + /* { dg-begin-multiline-output "" } + NN | #define WRAPPED_FREE(PTR) free(PTR) + | ^~~~~~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) + NN | WRAPPED_FREE (ptr); + | ^~~~~~~~~~~~ + { dg-end-multiline-output "" { target c } } */ + /* { dg-begin-multiline-output "" } + NN | #define WRAPPED_FREE(PTR) free(PTR) + | ~~~~^~~~~ + | | + | (2) second 'free' here; first 'free' was at (1) + NN | WRAPPED_FREE (ptr); + | ^~~~~~~~~~~~ { dg-end-multiline-output "" { target c++ } } */ } diff --git a/gcc/testsuite/c-c++-common/analyzer/malloc-paths-9-noexcept.c b/gcc/testsuite/c-c++-common/analyzer/malloc-paths-9-noexcept.c index f914ed6..57d25f4 100644 --- a/gcc/testsuite/c-c++-common/analyzer/malloc-paths-9-noexcept.c +++ b/gcc/testsuite/c-c++-common/analyzer/malloc-paths-9-noexcept.c @@ -13,39 +13,35 @@ void test_1 (void) NN | free (ptr); | ^~~~~~~~~~ 'test_1': events 1-3 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) first 'free' here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) second 'free' here; first 'free' was at (2) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) first 'free' here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) second 'free' here; first 'free' was at (2) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_1()': events 1-3 - | - | NN | void *ptr = malloc (1024); - | | ~~~~~~~^~~~~~ - | | | - | | (1) allocated here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) first 'free' here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) second 'free' here; first 'free' was at (2) - | + NN | void *ptr = malloc (1024); + | ~~~~~~~^~~~~~ + | | + | (1) allocated here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) first 'free' here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) second 'free' here; first 'free' was at (2) { dg-end-multiline-output "" { target c++ } } */ void test_2 (int x, int y) @@ -62,59 +58,55 @@ void test_2 (int x, int y) NN | free (ptr); | ^~~~~~~~~~ 'test_2': events 1-7 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~ - | | | - | | (2) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) ...to here - | | (4) first 'free' here - | NN | if (y) - | | ~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) second 'free' here; first 'free' was at (4) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~ + | | + | (2) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) ...to here + | (4) first 'free' here + NN | if (y) + | ~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) second 'free' here; first 'free' was at (4) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | free (ptr); | ~~~~~^~~~~ 'void test_2(int, int)': events 1-7 - | - | NN | void *ptr = malloc (1024); - | | ~~~~~~~^~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~~ - | | | - | | (2) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) ...to here - | | (4) first 'free' here - | NN | if (y) - | | ~~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) second 'free' here; first 'free' was at (4) - | + NN | void *ptr = malloc (1024); + | ~~~~~~~^~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~~ + | | + | (2) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) ...to here + | (4) first 'free' here + NN | if (y) + | ~~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) second 'free' here; first 'free' was at (4) { dg-end-multiline-output "" { target c++ } } */ /* "leak of 'ptr'. */ @@ -122,55 +114,51 @@ void test_2 (int x, int y) NN | } | ^ 'test_2': events 1-6 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~ - | | | - | | (2) following 'false' branch (when 'x == 0')... - | NN | free (ptr); - | NN | if (y) - | | ~ - | | | - | | (3) ...to here - | | (4) following 'false' branch (when 'y == 0')... - | NN | free (ptr); - | NN | } - | | ~ - | | | - | | (5) ...to here - | | (6) 'ptr' leaks here; was allocated at (1) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~ + | | + | (2) following 'false' branch (when 'x == 0')... + NN | free (ptr); + NN | if (y) + | ~ + | | + | (3) ...to here + | (4) following 'false' branch (when 'y == 0')... + NN | free (ptr); + NN | } + | ~ + | | + | (5) ...to here + | (6) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | } | ^ 'void test_2(int, int)': events 1-6 - | - | NN | void *ptr = malloc (1024); - | | ~~~~~~~^~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~~ - | | | - | | (2) following 'false' branch (when 'x == 0')... - | NN | free (ptr); - | NN | if (y) - | | ~~ - | | | - | | (3) ...to here - | | (4) following 'false' branch (when 'y == 0')... - | NN | free (ptr); - | NN | } - | | ~ - | | | - | | (5) ...to here - | | (6) 'ptr' leaks here; was allocated at (1) - | + NN | void *ptr = malloc (1024); + | ~~~~~~~^~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~~ + | | + | (2) following 'false' branch (when 'x == 0')... + NN | free (ptr); + NN | if (y) + | ~~ + | | + | (3) ...to here + | (4) following 'false' branch (when 'y == 0')... + NN | free (ptr); + NN | } + | ~ + | | + | (5) ...to here + | (6) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" { target c++ } } */ int test_3 (int x, int y) @@ -195,31 +183,27 @@ int test_3 (int x, int y) NN | *ptr = 42; | ~~~~~^~~~ 'test_3': events 1-2 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) this call could return NULL - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) 'ptr' could be NULL: unchecked value from (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) this call could return NULL + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) 'ptr' could be NULL: unchecked value from (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | *ptr = 42; | ~~~~~^~~~ 'int test_3(int, int)': events 1-2 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ~~~~~~~^~~~~~~~~~~~~~ - | | | - | | (1) this call could return NULL - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) 'ptr' could be NULL: unchecked value from (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ~~~~~~~^~~~~~~~~~~~~~ + | | + | (1) this call could return NULL + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) 'ptr' could be NULL: unchecked value from (1) { dg-end-multiline-output "" { target c++ } } */ /* "use after 'free' of 'ptr'". */ @@ -227,59 +211,55 @@ int test_3 (int x, int y) NN | *ptr = 19; | ~~~~~^~~~ 'test_3': events 1-6 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (4) ...to here - | | (5) freed here - | NN | - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (6) use after 'free' of 'ptr'; freed at (5) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (4) ...to here + | (5) freed here + NN | + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (6) use after 'free' of 'ptr'; freed at (5) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | *ptr = 19; | ~~~~~^~~~ 'int test_3(int, int)': events 1-6 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ~~~~~~~^~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~~ - | | | - | | (3) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (4) ...to here - | | (5) freed here - | NN | - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (6) use after 'free' of 'ptr'; freed at (5) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ~~~~~~~^~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~~ + | | + | (3) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (4) ...to here + | (5) freed here + NN | + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (6) use after 'free' of 'ptr'; freed at (5) { dg-end-multiline-output "" { target c++ } } */ /* "use after 'free' of 'ptr'". */ @@ -287,79 +267,75 @@ int test_3 (int x, int y) NN | return *ptr; | ^~~~ 'test_3': events 1-8 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) freed here - | NN | - | NN | return *ptr; - | | ~~~~ - | | | - | | (8) use after 'free' of 'ptr'; freed at (7) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) freed here + NN | + NN | return *ptr; + | ~~~~ + | | + | (8) use after 'free' of 'ptr'; freed at (7) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | return *ptr; | ^~~ 'int test_3(int, int)': events 1-8 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ~~~~~~~^~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) freed here - | NN | - | NN | return *ptr; - | | ~~~ - | | | - | | (8) use after 'free' of 'ptr'; freed at (7) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ~~~~~~~^~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) freed here + NN | + NN | return *ptr; + | ~~~ + | | + | (8) use after 'free' of 'ptr'; freed at (7) { dg-end-multiline-output "" { target c++ } } */ /* "leak of 'ptr'". */ @@ -367,69 +343,65 @@ int test_3 (int x, int y) NN | return *ptr; | ^~~~ 'test_3': events 1-7 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~ - | | | - | | (5) following 'false' branch (when 'y == 0')... - |...... - | NN | return *ptr; - | | ~~~~ - | | | - | | (6) ...to here - | | (7) 'ptr' leaks here; was allocated at (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~ + | | + | (5) following 'false' branch (when 'y == 0')... +...... + NN | return *ptr; + | ~~~~ + | | + | (6) ...to here + | (7) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | return *ptr; | ^~~ 'int test_3(int, int)': events 1-7 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ~~~~~~~^~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~~ - | | | - | | (5) following 'false' branch (when 'y == 0')... - |...... - | NN | return *ptr; - | | ~~~ - | | | - | | (6) ...to here - | | (7) 'ptr' leaks here; was allocated at (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ~~~~~~~^~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~~ + | | + | (5) following 'false' branch (when 'y == 0')... +...... + NN | return *ptr; + | ~~~ + | | + | (6) ...to here + | (7) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" { target c++ } } */ diff --git a/gcc/testsuite/c-c++-common/analyzer/setjmp-2.c b/gcc/testsuite/c-c++-common/analyzer/setjmp-2.c index 731a172..2647645 100644 --- a/gcc/testsuite/c-c++-common/analyzer/setjmp-2.c +++ b/gcc/testsuite/c-c++-common/analyzer/setjmp-2.c @@ -39,95 +39,79 @@ void test_2 (void) NN | __analyzer_dump_path (); | ^~~~~~~~~~~~~~~~~~~~~~~ 'test_2': event 1 - | - | NN | i = SETJMP(env); - | | ^~~~~~ - | | | - | | (1) 'setjmp' called here - | + NN | i = SETJMP(env); + | ^~~~~~ + | | + | (1) 'setjmp' called here 'test_2': events 2-4 - | - | NN | if (i != 0) - | | ^ - | | | - | | (2) following 'false' branch (when 'i == 0')... - |...... - | NN | longjmp (env, 1); - | | ~~~~~~~~~~~~~~~~ - | | | - | | (3) ...to here - | | (4) rewinding within 'test_2' from 'longjmp'... - | + NN | if (i != 0) + | ^ + | | + | (2) following 'false' branch (when 'i == 0')... +...... + NN | longjmp (env, 1); + | ~~~~~~~~~~~~~~~~ + | | + | (3) ...to here + | (4) rewinding within 'test_2' from 'longjmp'... 'test_2': event 5 - | - | NN | i = SETJMP(env); - | | ^~~~~~ - | | | - | | (5) ...to 'setjmp' (saved at (1)) - | + NN | i = SETJMP(env); + | ^~~~~~ + | | + | (5) ...to 'setjmp' (saved at (1)) 'test_2': events 6-8 - | - | NN | if (i != 0) - | | ^ - | | | - | | (6) following 'true' branch (when 'i != 0')... - | NN | { - | NN | foo (2); - | | ~~~~~~~ - | | | - | | (7) ...to here - | NN | __analyzer_dump_path (); - | | ~~~~~~~~~~~~~~~~~~~~~~~ - | | | - | | (8) here - | + NN | if (i != 0) + | ^ + | | + | (6) following 'true' branch (when 'i != 0')... + NN | { + NN | foo (2); + | ~~~~~~~ + | | + | (7) ...to here + NN | __analyzer_dump_path (); + | ~~~~~~~~~~~~~~~~~~~~~~~ + | | + | (8) here { dg-end-multiline-output "" { target c } } */ /* { dg-begin-multiline-output "" } NN | __analyzer_dump_path (); | ~~~~~~~~~~~~~~~~~~~~~^~ 'void test_2()': event 1 - | - | NN | i = SETJMP(env); - | | ^~~~~~ - | | | - | | (1) 'setjmp' called here - | + NN | i = SETJMP(env); + | ^~~~~~ + | | + | (1) 'setjmp' called here 'void test_2()': events 2-4 - | - | NN | if (i != 0) - | | ^~ - | | | - | | (2) following 'false' branch (when 'i == 0')... - |...... - | NN | longjmp (env, 1); - | | ~~~~~~~~~~~~~~~~ - | | | - | | (3) ...to here - | | (4) rewinding within 'test_2' from 'longjmp'... - | + NN | if (i != 0) + | ^~ + | | + | (2) following 'false' branch (when 'i == 0')... +...... + NN | longjmp (env, 1); + | ~~~~~~~~~~~~~~~~ + | | + | (3) ...to here + | (4) rewinding within 'test_2' from 'longjmp'... 'void test_2()': event 5 - | - | NN | i = SETJMP(env); - | | ^~~~~~ - | | | - | | (5) ...to 'setjmp' (saved at (1)) - | + NN | i = SETJMP(env); + | ^~~~~~ + | | + | (5) ...to 'setjmp' (saved at (1)) 'void test_2()': events 6-8 - | - | NN | if (i != 0) - | | ^~ - | | | - | | (6) following 'true' branch (when 'i != 0')... - | NN | { - | NN | foo (2); - | | ~~~~~~~ - | | | - | | (7) ...to here - | NN | __analyzer_dump_path (); - | | ~~~~~~~~~~~~~~~~~~~~~~~ - | | | - | | (8) here - | + NN | if (i != 0) + | ^~ + | | + | (6) following 'true' branch (when 'i != 0')... + NN | { + NN | foo (2); + | ~~~~~~~ + | | + | (7) ...to here + NN | __analyzer_dump_path (); + | ~~~~~~~~~~~~~~~~~~~~~~~ + | | + | (8) here { dg-end-multiline-output "" { target c++ } } */ void test_3 (void) diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-paths-9.c b/gcc/testsuite/gcc.dg/analyzer/malloc-paths-9.c index 83eec29..a832b08 100644 --- a/gcc/testsuite/gcc.dg/analyzer/malloc-paths-9.c +++ b/gcc/testsuite/gcc.dg/analyzer/malloc-paths-9.c @@ -15,20 +15,18 @@ void test_1 (void) NN | free (ptr); | ^~~~~~~~~~ 'test_1': events 1-3 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (2) first 'free' here - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) second 'free' here; first 'free' was at (2) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (2) first 'free' here + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) second 'free' here; first 'free' was at (2) { dg-end-multiline-output "" } */ void test_2 (int x, int y) @@ -45,30 +43,28 @@ void test_2 (int x, int y) NN | free (ptr); | ^~~~~~~~~~ 'test_2': events 1-7 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~ - | | | - | | (2) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (3) ...to here - | | (4) first 'free' here - | NN | if (y) - | | ~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) second 'free' here; first 'free' was at (4) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~ + | | + | (2) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (3) ...to here + | (4) first 'free' here + NN | if (y) + | ~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) second 'free' here; first 'free' was at (4) { dg-end-multiline-output "" } */ /* "leak of 'ptr'. */ @@ -76,28 +72,26 @@ void test_2 (int x, int y) NN | } | ^ 'test_2': events 1-6 - | - | NN | void *ptr = malloc (1024); - | | ^~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | if (x) - | | ~ - | | | - | | (2) following 'false' branch (when 'x == 0')... - | NN | free (ptr); - | NN | if (y) - | | ~ - | | | - | | (3) ...to here - | | (4) following 'false' branch (when 'y == 0')... - | NN | free (ptr); - | NN | } - | | ~ - | | | - | | (5) ...to here - | | (6) 'ptr' leaks here; was allocated at (1) - | + NN | void *ptr = malloc (1024); + | ^~~~~~~~~~~~~ + | | + | (1) allocated here + NN | if (x) + | ~ + | | + | (2) following 'false' branch (when 'x == 0')... + NN | free (ptr); + NN | if (y) + | ~ + | | + | (3) ...to here + | (4) following 'false' branch (when 'y == 0')... + NN | free (ptr); + NN | } + | ~ + | | + | (5) ...to here + | (6) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" } */ int test_3 (int x, int y) @@ -122,16 +116,14 @@ int test_3 (int x, int y) NN | *ptr = 42; | ~~~~~^~~~ 'test_3': events 1-2 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) this call could return NULL - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) 'ptr' could be NULL: unchecked value from (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) this call could return NULL + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) 'ptr' could be NULL: unchecked value from (1) { dg-end-multiline-output "" } */ /* "use after 'free' of 'ptr'". */ @@ -139,30 +131,28 @@ int test_3 (int x, int y) NN | *ptr = 19; | ~~~~~^~~~ 'test_3': events 1-6 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'true' branch (when 'x != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (4) ...to here - | | (5) freed here - | NN | - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (6) use after 'free' of 'ptr'; freed at (5) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'true' branch (when 'x != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (4) ...to here + | (5) freed here + NN | + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (6) use after 'free' of 'ptr'; freed at (5) { dg-end-multiline-output "" } */ /* "use after 'free' of 'ptr'". */ @@ -170,40 +160,38 @@ int test_3 (int x, int y) NN | return *ptr; | ^~~~ 'test_3': events 1-8 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~ - | | | - | | (5) following 'true' branch (when 'y != 0')... - | NN | free (ptr); - | | ~~~~~~~~~~ - | | | - | | (6) ...to here - | | (7) freed here - | NN | - | NN | return *ptr; - | | ~~~~ - | | | - | | (8) use after 'free' of 'ptr'; freed at (7) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~ + | | + | (5) following 'true' branch (when 'y != 0')... + NN | free (ptr); + | ~~~~~~~~~~ + | | + | (6) ...to here + | (7) freed here + NN | + NN | return *ptr; + | ~~~~ + | | + | (8) use after 'free' of 'ptr'; freed at (7) { dg-end-multiline-output "" } */ /* "leak of 'ptr'". */ @@ -211,34 +199,32 @@ int test_3 (int x, int y) NN | return *ptr; | ^~~~ 'test_3': events 1-7 - | - | NN | int *ptr = (int *)malloc (sizeof (int)); - | | ^~~~~~~~~~~~~~~~~~~~~ - | | | - | | (1) allocated here - | NN | *ptr = 42; - | | ~~~~~~~~~ - | | | - | | (2) assuming 'ptr' is non-NULL - | NN | if (x) - | | ~ - | | | - | | (3) following 'false' branch (when 'x == 0')... - |...... - | NN | *ptr = 19; - | | ~~~~~~~~~ - | | | - | | (4) ...to here - |...... - | NN | if (y) - | | ~ - | | | - | | (5) following 'false' branch (when 'y == 0')... - |...... - | NN | return *ptr; - | | ~~~~ - | | | - | | (6) ...to here - | | (7) 'ptr' leaks here; was allocated at (1) - | + NN | int *ptr = (int *)malloc (sizeof (int)); + | ^~~~~~~~~~~~~~~~~~~~~ + | | + | (1) allocated here + NN | *ptr = 42; + | ~~~~~~~~~ + | | + | (2) assuming 'ptr' is non-NULL + NN | if (x) + | ~ + | | + | (3) following 'false' branch (when 'x == 0')... +...... + NN | *ptr = 19; + | ~~~~~~~~~ + | | + | (4) ...to here +...... + NN | if (y) + | ~ + | | + | (5) following 'false' branch (when 'y == 0')... +...... + NN | return *ptr; + | ~~~~ + | | + | (6) ...to here + | (7) 'ptr' leaks here; was allocated at (1) { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/gcc.dg/analyzer/out-of-bounds-multiline-2.c b/gcc/testsuite/gcc.dg/analyzer/out-of-bounds-multiline-2.c index 660901a..47f3bcb 100644 --- a/gcc/testsuite/gcc.dg/analyzer/out-of-bounds-multiline-2.c +++ b/gcc/testsuite/gcc.dg/analyzer/out-of-bounds-multiline-2.c @@ -18,15 +18,14 @@ void int_vla_write_element_after_end_off_by_one(int32_t x, size_t n) arr[n] = x; ~~~~~~~^~~ 'int_vla_write_element_after_end_off_by_one': events 1-2 (depth 1) - | - | int32_t arr[n]; - | ^~~ - | | - | (1) capacity: 'n * 4' bytes - | - | arr[n] = x; - | ~~~~~~~~~~ - | | - | (2) write of 4 bytes at offset 'n * 4' exceeds the buffer - | + int32_t arr[n]; + ^~~ + | + (1) capacity: 'n * 4' bytes + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + arr[n] = x; + ~~~~~~~~~~ + | + (2) write of 4 bytes at offset 'n * 4' exceeds the buffer { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c index b2b269a..b8134ae 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c @@ -36,21 +36,19 @@ make_a_list_of_random_ints_badly(PyObject *self, 29 | PyList_Append(list, item); | ^~~~~~~~~~~~~~~~~~~~~~~~~ 'make_a_list_of_random_ints_badly': events 1-3 - | - | 25 | list = PyList_New(0); - | | ^~~~~~~~~~~~~ - | | | - | | (1) when 'PyList_New' fails, returning NULL - | 26 | - | 27 | for (i = 0; i < count; i++) { - | | ~~~~~~~~~ - | | | - | | (2) when 'i < count' - | 28 | item = PyLong_FromLong(random()); - | 29 | PyList_Append(list, item); - | | ~~~~~~~~~~~~~~~~~~~~~~~~~ - | | | - | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 - | + 25 | list = PyList_New(0); + | ^~~~~~~~~~~~~ + | | + | (1) when 'PyList_New' fails, returning NULL + 26 | + 27 | for (i = 0; i < count; i++) { + | ~~~~~~~~~ + | | + | (2) when 'i < count' + 28 | item = PyLong_FromLong(random()); + 29 | PyList_Append(list, item); + | ~~~~~~~~~~~~~~~~~~~~~~~~~ + | | + | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1 { dg-end-multiline-output "" } */ } diff --git a/gcc/tree-diagnostic-path.cc b/gcc/tree-diagnostic-path.cc index 8247192..33389ef 100644 --- a/gcc/tree-diagnostic-path.cc +++ b/gcc/tree-diagnostic-path.cc @@ -141,6 +141,8 @@ public: const char *get_name () const { return m_name.get (); } unsigned get_swimlane_index () const { return m_swimlane_idx; } + bool interprocedural_p () const; + private: friend struct path_summary; friend class thread_event_printer; @@ -293,6 +295,26 @@ private: } }; +/* Return true iff there is more than one stack frame used by the events + of this thread. */ + +bool +per_thread_summary::interprocedural_p () const +{ + if (m_event_ranges.is_empty ()) + return false; + tree first_fndecl = m_event_ranges[0]->m_fndecl; + int first_stack_depth = m_event_ranges[0]->m_stack_depth; + for (auto range : m_event_ranges) + { + if (range->m_fndecl != first_fndecl) + return true; + if (range->m_stack_depth != first_stack_depth) + return true; + } + return false; +} + /* path_summary's ctor. */ path_summary::path_summary (const diagnostic_path &path, @@ -391,11 +413,14 @@ public: = colorize_start (pp_show_color (pp), line_color); const char *end_line_color = colorize_stop (pp_show_color (pp)); + const bool interprocedural_p = m_per_thread_summary.interprocedural_p (); + write_indent (pp, m_cur_indent); if (const event_range *prev_range = get_any_prev_range ()) { if (range->m_stack_depth > prev_range->m_stack_depth) { + gcc_assert (interprocedural_p); /* Show pushed stack frame(s). */ const char *push_prefix = "+--> "; pp_string (pp, start_line_color); @@ -420,34 +445,37 @@ public: pp_newline (pp); /* Print a run of events. */ - { - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_string (pp, "|"); - pp_string (pp, end_line_color); - pp_newline (pp); - - char *saved_prefix = pp_take_prefix (pp); - char *prefix; + if (interprocedural_p) { - pretty_printer tmp_pp; - write_indent (&tmp_pp, m_cur_indent + per_frame_indent); - pp_string (&tmp_pp, start_line_color); - pp_string (&tmp_pp, "|"); - pp_string (&tmp_pp, end_line_color); - prefix = xstrdup (pp_formatted_text (&tmp_pp)); + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_string (pp, "|"); + pp_string (pp, end_line_color); + pp_newline (pp); + + char *saved_prefix = pp_take_prefix (pp); + char *prefix; + { + pretty_printer tmp_pp; + write_indent (&tmp_pp, m_cur_indent + per_frame_indent); + pp_string (&tmp_pp, start_line_color); + pp_string (&tmp_pp, "|"); + pp_string (&tmp_pp, end_line_color); + prefix = xstrdup (pp_formatted_text (&tmp_pp)); + } + pp_set_prefix (pp, prefix); + pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + range->print (dc, pp); + pp_set_prefix (pp, saved_prefix); + + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_string (pp, "|"); + pp_string (pp, end_line_color); + pp_newline (pp); } - pp_set_prefix (pp, prefix); - pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + else range->print (dc, pp); - pp_set_prefix (pp, saved_prefix); - - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_string (pp, "|"); - pp_string (pp, end_line_color); - pp_newline (pp); - } if (const event_range *next_range = get_any_next_range ()) { @@ -460,6 +488,7 @@ public: " |\n" " <------------ +\n" " |\n". */ + gcc_assert (interprocedural_p); int vbar_for_next_frame = *m_vbar_column_for_depth.get (next_range->m_stack_depth); @@ -492,6 +521,7 @@ public: else if (range->m_stack_depth < next_range->m_stack_depth) { /* Prepare to show pushed stack frame. */ + gcc_assert (interprocedural_p); gcc_assert (range->m_stack_depth != EMPTY); gcc_assert (range->m_stack_depth != DELETED); m_vbar_column_for_depth.put (range->m_stack_depth, @@ -766,10 +796,8 @@ test_intraprocedural_path (pretty_printer *event_pp) test_diagnostic_context dc; print_path_summary_as_text (&summary, &dc, true); ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n" - " |\n" - " | (1): first `free'\n" - " | (2): double `free'\n" - " |\n", + " (1): first `free'\n" + " (2): double `free'\n", pp_formatted_text (dc.printer)); } |