aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-06-09 14:08:13 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-06-09 14:08:13 +0200
commit48bd8cda09535e2344a7969755d3fd87013f8f9f (patch)
tree91bf20d327f9f97c0249f4acde91baf8d3dfaf3c
parent6c85cc2852367ea2db91ff6a1fc0f6fc0653788d (diff)
downloadglibc-48bd8cda09535e2344a7969755d3fd87013f8f9f.tar
glibc-48bd8cda09535e2344a7969755d3fd87013f8f9f.tar.gz
glibc-48bd8cda09535e2344a7969755d3fd87013f8f9f.tar.bz2
glibc-48bd8cda09535e2344a7969755d3fd87013f8f9f.zip
support: Expose TEST_VERIFY_EXIT behavior to GCC optimizers
Previously, the implementation would conditionally exit based on the status argument, which GCC did not know about. This leads to false uninitialized variable warnings when data is accessed after a TEST_VERIFY_EXIT failure (from code which would never execute).
-rw-r--r--ChangeLog12
-rw-r--r--support/check.h10
-rw-r--r--support/support_test_verify_impl.c12
3 files changed, 27 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 006e7ac28e..0acbe88f30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2017-06-09 Florian Weimer <fweimer@redhat.com>
+
+ Expose TEST_VERIFY_EXIT process termination to GCC optimizers.
+ * support/support_test_verify_impl.c
+ (support_test_verify_exit_impl): Split from
+ support_test_verify_impl.
+ * support/check.h (TEST_VERIFY): Drop status argument from
+ support_test_verify_impl call.
+ (TEST_VERIFY_EXIT): Call support_test_verify_exit_impl.
+ (support_test_verify_impl): Remove status argument.
+ (support_test_verify_exit_impl): Declare.
+
2017-06-09 Siddhesh Poyarekar <siddhesh@sourceware.org>
* sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h: Remove
diff --git a/support/check.h b/support/check.h
index 1d244a3557..bdcd12952a 100644
--- a/support/check.h
+++ b/support/check.h
@@ -51,7 +51,7 @@ __BEGIN_DECLS
if (expr) \
; \
else \
- support_test_verify_impl (-1, __FILE__, __LINE__, #expr); \
+ support_test_verify_impl (__FILE__, __LINE__, #expr); \
})
/* Record a test failure and exit if EXPR evaluates to false. */
@@ -60,7 +60,8 @@ __BEGIN_DECLS
if (expr) \
; \
else \
- support_test_verify_impl (1, __FILE__, __LINE__, #expr); \
+ support_test_verify_exit_impl \
+ (1, __FILE__, __LINE__, #expr); \
})
int support_print_failure_impl (const char *file, int line,
@@ -70,8 +71,11 @@ void support_exit_failure_impl (int exit_status,
const char *file, int line,
const char *format, ...)
__attribute__ ((noreturn, nonnull (2), format (printf, 4, 5)));
-void support_test_verify_impl (int status, const char *file, int line,
+void support_test_verify_impl (const char *file, int line,
const char *expr);
+void support_test_verify_exit_impl (int status, const char *file, int line,
+ const char *expr)
+ __attribute__ ((noreturn));
/* Record a test failure. This function returns and does not
terminate the process. The failure counter is stored in a shared
diff --git a/support/support_test_verify_impl.c b/support/support_test_verify_impl.c
index 5bae38f8b1..55ab2111b3 100644
--- a/support/support_test_verify_impl.c
+++ b/support/support_test_verify_impl.c
@@ -22,12 +22,16 @@
#include <stdlib.h>
void
-support_test_verify_impl (int status, const char *file, int line,
- const char *expr)
+support_test_verify_impl (const char *file, int line, const char *expr)
{
support_record_failure ();
printf ("error: %s:%d: not true: %s\n", file, line, expr);
- if (status >= 0)
- exit (status);
+}
+void
+support_test_verify_exit_impl (int status, const char *file, int line,
+ const char *expr)
+{
+ support_test_verify_impl (file, line, expr);
+ exit (status);
}