analyzer: testsuite fixes for alloca, getpass, and setjmp (PR 93316)
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 22 Jan 2020 01:45:48 +0000 (02:45 +0100)
committerDavid Malcolm <dmalcolm@redhat.com>
Wed, 22 Jan 2020 19:32:08 +0000 (14:32 -0500)
PR analyzer/93316 reports various testsuite failures where I
accidentally relied on properties of x86_64-pc-linux-gnu.

The following patch fixes them on sparc-sun-solaris2.11 (gcc211 in the
GCC compile farm), and, I hope, the other configurations showing
failures.

There may still be other failures for pattern-test-2.c, which I'm
tracking separately as PR analyzer/93291.

gcc/analyzer/ChangeLog:
PR analyzer/93316
* analyzer.cc (is_setjmp_call_p): Check for "setjmp" as well as
"_setjmp".

gcc/testsuite/ChangeLog:
PR analyzer/93316
* gcc.dg/analyzer/data-model-1.c: Include <alloca.h>.
* gcc.dg/analyzer/malloc-1.c: Likewise.
* gcc.dg/analyzer/malloc-callbacks.c (get_alloca): Return
__builtin_alloca rather than alloca.
* gcc.dg/analyzer/malloc-paths-8.c: Include <alloca.h>.
* gcc.dg/analyzer/sensitive-1.c: Define __EXTENSIONS__ before
including unistd.h.
* gcc.dg/analyzer/setjmp-2.c: Replace include of <setjmp.h>
with "test-setjmp.h" and usage of setjmp with new SETJMP macro.
* gcc.dg/analyzer/setjmp-3.c: Likewise.
* gcc.dg/analyzer/setjmp-4.c: Likewise.
* gcc.dg/analyzer/setjmp-5.c: Likewise.
* gcc.dg/analyzer/setjmp-6.c: Likewise.
* gcc.dg/analyzer/setjmp-7.c: Likewise.
* gcc.dg/analyzer/setjmp-7a.c: Likewise.
* gcc.dg/analyzer/setjmp-8.c: Likewise.
* gcc.dg/analyzer/setjmp-9.c: Likewise.
* gcc.dg/analyzer/test-setjmp.h: New header.

18 files changed:
gcc/analyzer/ChangeLog
gcc/analyzer/analyzer.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/analyzer/data-model-1.c
gcc/testsuite/gcc.dg/analyzer/malloc-1.c
gcc/testsuite/gcc.dg/analyzer/malloc-callbacks.c
gcc/testsuite/gcc.dg/analyzer/malloc-paths-8.c
gcc/testsuite/gcc.dg/analyzer/sensitive-1.c
gcc/testsuite/gcc.dg/analyzer/setjmp-2.c
gcc/testsuite/gcc.dg/analyzer/setjmp-3.c
gcc/testsuite/gcc.dg/analyzer/setjmp-4.c
gcc/testsuite/gcc.dg/analyzer/setjmp-5.c
gcc/testsuite/gcc.dg/analyzer/setjmp-6.c
gcc/testsuite/gcc.dg/analyzer/setjmp-7.c
gcc/testsuite/gcc.dg/analyzer/setjmp-7a.c
gcc/testsuite/gcc.dg/analyzer/setjmp-8.c
gcc/testsuite/gcc.dg/analyzer/setjmp-9.c
gcc/testsuite/gcc.dg/analyzer/test-setjmp.h [new file with mode: 0644]

index 07876a0b4afeb8a6ba8c1b96e8312e1f224e1446..d0a652b4a5776b33bcc252b49aaf1ea124068435 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-22  David Malcolm  <dmalcolm@redhat.com>
+
+       PR analyzer/93316
+       * analyzer.cc (is_setjmp_call_p): Check for "setjmp" as well as
+       "_setjmp".
+
 2020-01-22  David Malcolm  <dmalcolm@redhat.com>
 
        PR analyzer/93307
index 2a3ffaee852fd692bb6e71859d00c035b93c75d9..3884788ee9e88ba15971e57ed23ae187c530f1cb 100644 (file)
@@ -91,7 +91,8 @@ is_setjmp_call_p (const gimple *stmt)
 {
   /* TODO: is there a less hacky way to check for "setjmp"?  */
   if (const gcall *call = dyn_cast <const gcall *> (stmt))
-    if (is_special_named_call_p (call, "_setjmp", 1))
+    if (is_special_named_call_p (call, "setjmp", 1)
+       || is_special_named_call_p (call, "_setjmp", 1))
       return true;
 
   return false;
index 6c5fe273c6423e9ee21d80cdf6a7a2f636f7cb4b..5f07ffec0f9cf2e1825e13562a37175aadf466f1 100644 (file)
@@ -1,3 +1,25 @@
+2020-01-22  David Malcolm  <dmalcolm@redhat.com>
+
+       PR analyzer/93316
+       * gcc.dg/analyzer/data-model-1.c: Include <alloca.h>.
+       * gcc.dg/analyzer/malloc-1.c: Likewise.
+       * gcc.dg/analyzer/malloc-callbacks.c (get_alloca): Return
+       __builtin_alloca rather than alloca.
+       * gcc.dg/analyzer/malloc-paths-8.c: Include <alloca.h>.
+       * gcc.dg/analyzer/sensitive-1.c: Define __EXTENSIONS__ before
+       including unistd.h.
+       * gcc.dg/analyzer/setjmp-2.c: Replace include of <setjmp.h>
+       with "test-setjmp.h" and usage of setjmp with new SETJMP macro.
+       * gcc.dg/analyzer/setjmp-3.c: Likewise.
+       * gcc.dg/analyzer/setjmp-4.c: Likewise.
+       * gcc.dg/analyzer/setjmp-5.c: Likewise.
+       * gcc.dg/analyzer/setjmp-6.c: Likewise.
+       * gcc.dg/analyzer/setjmp-7.c: Likewise.
+       * gcc.dg/analyzer/setjmp-7a.c: Likewise.
+       * gcc.dg/analyzer/setjmp-8.c: Likewise.
+       * gcc.dg/analyzer/setjmp-9.c: Likewise.
+       * gcc.dg/analyzer/test-setjmp.h: New header.
+
 2020-01-22  Marek Polacek  <polacek@redhat.com>
 
        PR c++/92907 - noexcept does not consider "const" in member functions.
index 3a0108d0b8c98079bc52ddb83bfa5e1f8b6d3bac..91685f578a4f7b84adddc38659b379905b03818f 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
+#include <alloca.h>
 #include "analyzer-decls.h"
 
 struct foo
index 6e9a014272e2e027a2f557096c9e3c130194cff8..e2e279bd7fd36b676a2f0759fc86893c4010fd09 100644 (file)
@@ -1,3 +1,4 @@
+#include <alloca.h>
 #include <stdlib.h>
 #include <string.h>
 
index eb5545e5da00bbf412ab3ea141f7652b29b9186a..901ca5c46fd09893d87781a9a5f71602c6742f2f 100644 (file)
@@ -12,7 +12,9 @@ get_malloc (void)
 static allocator_t __attribute__((noinline))
 get_alloca (void)
 {
-  return alloca;
+  /* On e.g. Solaris, alloca is a macro so we can't take its address;
+     use __builtin_alloca instead.  */
+  return __builtin_alloca;
 }
 
 static deallocator_t __attribute__((noinline))
index bf858e04840d49ff49a93727b3c571c02b856265..10b97a054026bd46c230360ac286fbffbcf6c161 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-additional-options "-fanalyzer-transitivity" } */
 
 #include <stddef.h>
+#include <alloca.h>
 #include <stdlib.h>
 
 extern void do_stuff (const void *);
index 8c6b60747840cd9486c73a5876508083e218d47e..81144af620edfd59b72a9ed1fcb06fb894f47ce9 100644 (file)
@@ -1,5 +1,9 @@
 #include <stdio.h>
+
+/* Solaris needs this for <unistd.h> to declare getpass.  */
+#define __EXTENSIONS__
 #include <unistd.h>
+
 #include <string.h>
 
 char test_1 (FILE *logfile)
index f0fd23cf2641eba6922d54af90d8e3e59d8ec306..beaf43684e0bf7e0767ca9142bcd7a30eb246574 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include "analyzer-decls.h"
 
@@ -9,7 +9,7 @@ extern void foo (int);
 
 void test_1 (void)
 {
-  setjmp (NULL);
+  SETJMP (NULL);
 }
 
 void test_2 (void)
@@ -19,7 +19,7 @@ void test_2 (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   foo (1);
 
@@ -39,7 +39,7 @@ void test_2 (void)
       |       ^~~~~~~~~~~~~~~~~~~~~~~
   'test_2': event 1
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (1) 'setjmp' called here
@@ -59,7 +59,7 @@ void test_2 (void)
     |
   'test_2': event 5
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (5) ...to 'setjmp' (saved at (1))
index 0c082b82a7086c8914f0c07e3482dff618d47c54..5c1d4060c3b532e172e6e541ee376012b171e67b 100644 (file)
@@ -1,8 +1,8 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
 #include <stddef.h>
+#include "test-setjmp.h"
 #include "analyzer-decls.h"
 
 extern int foo (int) __attribute__ ((__pure__));
@@ -20,7 +20,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i != 0)
     {
@@ -47,7 +47,7 @@ void outer (void)
     |
   'outer': event 2
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (2) 'setjmp' called here
@@ -84,7 +84,7 @@ void outer (void)
     |
   'outer': event 8
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (8) ...to 'setjmp' in 'outer' (saved at (2))
index bfac6170d910f12793feb7b260bf9f34896d4a96..f216a456b5933b47c1977237b01f9df896b87d9d 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include "analyzer-decls.h"
 
 extern int foo (int) __attribute__ ((__pure__));
@@ -23,7 +23,7 @@ void outer (int y)
 
 int main (void)
 {   
-  if (!setjmp(buf))
+  if (!SETJMP(buf))
     outer (42);
   else
     __analyzer_dump_path (); /* { dg-message "path" } */
@@ -42,14 +42,14 @@ int main (void)
     |
   'main': event 2
     |
-    |   NN |   if (!setjmp(buf))
+    |   NN |   if (!SETJMP(buf))
     |      |        ^~~~~~
     |      |        |
     |      |        (2) 'setjmp' called here
     |
   'main': events 3-5
     |
-    |   NN |   if (!setjmp(buf))
+    |   NN |   if (!SETJMP(buf))
     |      |      ^
     |      |      |
     |      |      (3) following 'true' branch...
@@ -87,14 +87,14 @@ int main (void)
     |
   'main': event 10
     |
-    |   NN |   if (!setjmp(buf))
+    |   NN |   if (!SETJMP(buf))
     |      |        ^~~~~~
     |      |        |
     |      |        (10) ...to 'setjmp' in 'main' (saved at (2))
     |
   'main': events 11-13
     |
-    |   NN |   if (!setjmp(buf))
+    |   NN |   if (!SETJMP(buf))
     |      |      ^
     |      |      |
     |      |      (11) following 'false' branch...
index 2c41e6dff773ae935b4b0c4d151edde298478c63..3ee02980e572476b838d22fd6cb68a666d176f28 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include "analyzer-decls.h"
 
@@ -9,7 +9,7 @@ static jmp_buf env;
 
 static void inner (void)
 {
-  setjmp (env);
+  SETJMP (env);
 }
 
 void outer (void)
@@ -45,7 +45,7 @@ void outer (void)
            |
          'inner': event 4
            |
-           |   NN |   setjmp (env);
+           |   NN |   SETJMP (env);
            |      |   ^~~~~~
            |      |   |
            |      |   (4) 'setjmp' called here
index d7319129070e2d0d441089e4e48dd49537a3c758..0e0f12f919c960cf66c64c890e09cd2d10a215fb 100644 (file)
@@ -1,4 +1,4 @@
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include <stdlib.h>
 
@@ -19,7 +19,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i == 0)
     {
index 3a14534434d8541827770bdee43219bcbecaa1a2..6cf98247bb65ee02bb97c3d838d438eb3c8008d2 100644 (file)
@@ -1,4 +1,4 @@
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include <stdlib.h>
 
@@ -24,7 +24,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i == 0)
     {
index 1e2c348af3e4c90df2db10166d4dc363e5a612b3..87d35bc88f3c246ce08c39e51d2cd2afeb754cd5 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stdlib.h>
 
 extern int foo (int) __attribute__ ((__pure__));
@@ -26,7 +26,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i == 0)
     {
@@ -49,7 +49,7 @@ void outer (void)
     |
   'outer': event 2
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (2) 'setjmp' called here
@@ -103,7 +103,7 @@ void outer (void)
     |
   'outer': event 12
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (12) ...to 'setjmp' in 'outer' (saved at (2))
index fb93165380392985940562748cd090e42d9d52cb..abbee2d91081eaaace752b3a4651a182742ef659 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include "analyzer-decls.h"
 
@@ -21,7 +21,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i != 0)
     {
@@ -48,7 +48,7 @@ void outer (void)
     |
   'outer': event 2
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (2) 'setjmp' called here
@@ -85,7 +85,7 @@ void outer (void)
     |
   'outer': event 8
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (8) ...to 'setjmp' in 'outer' (saved at (2))
index fa2d3152c27cbeb5e031c3fea20a8c1f0ada1b9a..cf75d3ad896c267d0de6ed196b6e4ff48200febc 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret" } */
 /* { dg-enable-nn-line-numbers "" } */
 
-#include <setjmp.h>
+#include "test-setjmp.h"
 #include <stddef.h>
 #include "analyzer-decls.h"
 
@@ -23,7 +23,7 @@ void outer (void)
 
   foo (0);
 
-  i = setjmp(env);
+  i = SETJMP(env);
 
   if (i != 0)
     {
@@ -50,7 +50,7 @@ void outer (void)
     |
   'outer': event 2
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (2) 'setjmp' called here
@@ -87,7 +87,7 @@ void outer (void)
     |
   'outer': event 8
     |
-    |   NN |   i = setjmp(env);
+    |   NN |   i = SETJMP(env);
     |      |       ^~~~~~
     |      |       |
     |      |       (8) ...to 'setjmp' in 'outer' (saved at (2))
diff --git a/gcc/testsuite/gcc.dg/analyzer/test-setjmp.h b/gcc/testsuite/gcc.dg/analyzer/test-setjmp.h
new file mode 100644 (file)
index 0000000..ee0e1ec
--- /dev/null
@@ -0,0 +1,16 @@
+/* Various integration tests for setjmp-handling expect a precise
+   multiline output.
+   
+   The outputs from -fdiagnostics-path-format=inline-events for such
+   setjmp tests are dependent on whether setjmp is a macro or a function
+   (and whether that macro is defined in a system header).
+
+   setjmp is a function on some systems and a macro on others.
+   This header provides a SETJMP macro in a (fake) system header,
+   for consistency of output across such systems.  */
+
+#include <setjmp.h>
+
+#pragma GCC system_header
+
+#define SETJMP(E) setjmp(E)