This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Fix tests that are testing obsoleted functionality
- From: Steve Ellcey <sellcey at cavium dot com>
- To: libc-alpha <libc-alpha at sourceware dot org>
- Cc: Florian Weimer <fweimer at redhat dot com>, Joseph Myers <joseph at codesourcery dot com>, nd <nd at arm dot com>, Szabolcs Nagy <szabolcs dot nagy at arm dot com>
- Date: Thu, 24 Aug 2017 15:55:32 -0700
- Subject: [PATCH] Fix tests that are testing obsoleted functionality
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Steve dot Ellcey at cavium dot com;
- Reply-to: sellcey at cavium dot com
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
Here is a patch to fix three tests; malloc/tst-mallocstate.c,
math/test-matherr.c, and math/test-matherr-2.c. These tests
test functionality that is no longer in the latest GLIBC but
should still exist for programs linked with an older GLIBC.
If you have a new ABI (like ILP32 aarch64) which never existed
in the older form, these tests will fail. tst-mallocstate.c
and test-matherr.c give link errors and test-matherr-2.c
compiles and links but exits with status 1.
See https://sourceware.org/ml/libc-alpha/2017-08/msg01127.html
and https://sourceware.org/ml/libc-alpha/2016-12/msg00527.html
for some more discussions on this problem.
This patch fixes the tests so that they will compile and
link and, if on a platform that does not support the functionality
being tested return an UNSUPPORTED return code. They continue
to run and pass as before on other platforms. To do this
I created a new macro TEST_COMPAT, similar to SHLIB_COMPAT
that can be used to check for the abi versions available
when building the test.
Tested on aarch64 with LP64 (where they run) and ILP32 (where
they return unsupported). While I tested this with the aarch64
ILP32 ABI, they changes are not specific to any ABI so I would
like to check them in now and not wait for aarch64 ILP32 or some
other new ABI get checked in first.
Steve Ellcey
sellcey@cavium.com
2017-08-24 Steve Ellcey <sellcey@cavium.com>
* include/shlib-compat.h (TEST_COMPAT): New Macro.
* malloc/tst-mallocstate.c: Convert from test-skeleton
to test-driver. Ifdef code using TEST_COMPAT macro.
* math/test-matherr-2.c: Ifdef test using TEST_COMPAT macro.
* math/test-matherr.c: Likewise.
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index 41eb362..d872afc 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -97,4 +97,14 @@
compat_symbol (libc, name, aliasname, version);
# endif
+/* The TEST_COMPAT macro acts just like the SHLIB_COMPAT macro except
+ that it does not check IS_IN. It is used by tests that are testing
+ functionality that is only available in specific GLIBC versions. */
+
+# define TEST_COMPAT(lib, introduced, obsoleted) \
+ _TEST_COMPAT (lib, introduced, obsoleted)
+# define _TEST_COMPAT(lib, introduced, obsoleted) \
+ (!(ABI_##lib##_##obsoleted - 0) \
+ || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))
+
#endif /* shlib-compat.h */
diff --git a/malloc/tst-mallocstate.c b/malloc/tst-mallocstate.c
index 5cb39c0..53154ae 100644
--- a/malloc/tst-mallocstate.c
+++ b/malloc/tst-mallocstate.c
@@ -23,19 +23,20 @@
#include <string.h>
#include <libc-symbols.h>
#include <shlib-compat.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/test-driver.h>
#include "malloc.h"
+#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_25)
+
/* Make the compatibility symbols availabile to this test case. */
void *malloc_get_state (void);
compat_symbol_reference (libc, malloc_get_state, malloc_get_state, GLIBC_2_0);
int malloc_set_state (void *);
compat_symbol_reference (libc, malloc_set_state, malloc_set_state, GLIBC_2_0);
-static int do_test (void);
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
-
/* Maximum object size in the fake heap. */
enum { max_size = 64 };
@@ -63,9 +64,9 @@ static size_t *next_heap_chunk;
/* Copied from malloc.c and hooks.c. The version is deliberately
lower than the final version of malloc_set_state. */
-#define NBINS 128
-#define MALLOC_STATE_MAGIC 0x444c4541l
-#define MALLOC_STATE_VERSION (0 * 0x100l + 4l)
+# define NBINS 128
+# define MALLOC_STATE_MAGIC 0x444c4541l
+# define MALLOC_STATE_VERSION (0 * 0x100l + 4l)
static struct
{
long magic;
@@ -117,12 +118,7 @@ dumped_heap_alloc (size_t length)
/* Round up the allocation size to the heap alignment. */
chunk_size += heap_alignment_mask;
chunk_size &= ~heap_alignment_mask;
- if ((chunk_size & 3) != 0)
- {
- /* The lower three bits in the chunk size have to be 0. */
- write_message ("error: dumped_heap_alloc computed invalid chunk size\n");
- _exit (1);
- }
+ TEST_VERIFY_EXIT ((chunk_size & 3) == 0);
if (next_heap_chunk == NULL)
/* Initialize the top of the heap. Add one word of zero padding,
to match existing practice. */
@@ -244,11 +240,7 @@ shuffle_allocation_tasks (void)
/* Pick pair in the tail of the array. */
int j = i + (rand_next (&global_seed)
% ((unsigned) (allocation_task_count - i)));
- if (j < 0 || j >= allocation_task_count)
- {
- write_message ("error: test bug in shuffle\n");
- _exit (1);
- }
+ TEST_VERIFY_EXIT (j >= 0 && j < allocation_task_count);
/* Exchange. */
struct allocation_task tmp = allocation_tasks[i];
allocation_tasks[i] = allocation_tasks[j];
@@ -298,7 +290,8 @@ static volatile bool heap_initialized;
static void
init_heap (void)
{
- write_message ("info: performing heap initialization\n");
+ if (test_verbose)
+ printf ("info: performing heap initialization\n");
heap_initialized = true;
/* Populate the dumped heap. */
@@ -312,11 +305,7 @@ init_heap (void)
save_state.av[2] = (void *) (next_heap_chunk - 1);
/* Integrate the dumped heap into the process heap. */
- if (malloc_set_state (&save_state) != 0)
- {
- write_message ("error: malloc_set_state failed\n");
- _exit (1);
- }
+ TEST_VERIFY_EXIT (malloc_set_state (&save_state) == 0);
}
/* Interpose the initialization callback. */
@@ -389,15 +378,12 @@ static int
do_test (void)
{
my_free (malloc (1));
- if (!heap_initialized)
- {
- printf ("error: heap was not initialized by malloc\n");
- return 1;
- }
+ TEST_VERIFY_EXIT (heap_initialized);
/* The first pass performs the randomly generated allocation
tasks. */
- write_message ("info: first pass through allocation tasks\n");
+ if (test_verbose)
+ printf ("info: first pass through allocation tasks\n");
full_heap_check ();
/* Execute the post-undump tasks in a random order. */
@@ -451,14 +437,15 @@ do_test (void)
break;
case action_count:
- abort ();
+ FAIL_EXIT1 ("task->action should never be action_count");
}
full_heap_check ();
}
/* The second pass frees the objects which were allocated during the
first pass. */
- write_message ("info: second pass through allocation tasks\n");
+ if (test_verbose)
+ printf ("info: second pass through allocation tasks\n");
shuffle_allocation_tasks ();
for (int i = 0; i < allocation_task_count; ++i)
@@ -480,7 +467,7 @@ do_test (void)
break;
case action_count:
- abort ();
+ FAIL_EXIT1 ("task->action should never be action_count");
}
full_heap_check ();
}
@@ -503,3 +490,12 @@ do_test (void)
return errors;
}
+#else
+static int
+do_test (void)
+{
+ return 77;
+}
+#endif
+
+#include <support/test-driver.c>
diff --git a/math/test-matherr-2.c b/math/test-matherr-2.c
index c2fc5e6..7b5f49c 100644
--- a/math/test-matherr-2.c
+++ b/math/test-matherr-2.c
@@ -22,8 +22,11 @@
#include <math-svid-compat.h>
#include <shlib-compat.h>
-#undef matherr
-#undef _LIB_VERSION
+
+#if TEST_COMPAT (libm, GLIBC_2_0, GLIBC_2_27)
+
+# undef matherr
+# undef _LIB_VERSION
compat_symbol_reference (libm, matherr, matherr, GLIBC_2_0);
compat_symbol_reference (libm, _LIB_VERSION, _LIB_VERSION, GLIBC_2_0);
@@ -45,5 +48,12 @@ do_test (void)
acos (2.0);
return fail;
}
+#else
+static int
+do_test (void)
+{
+ return 77;
+}
+#endif
#include <support/test-driver.c>
diff --git a/math/test-matherr.c b/math/test-matherr.c
index 34856f1..23521c0 100644
--- a/math/test-matherr.c
+++ b/math/test-matherr.c
@@ -22,8 +22,11 @@
#include <math-svid-compat.h>
#include <shlib-compat.h>
-#undef matherr
-#undef _LIB_VERSION
+
+#if TEST_COMPAT (libm, GLIBC_2_0, GLIBC_2_27)
+
+# undef matherr
+# undef _LIB_VERSION
compat_symbol_reference (libm, matherr, matherr, GLIBC_2_0);
compat_symbol_reference (libm, _LIB_VERSION, _LIB_VERSION, GLIBC_2_0);
@@ -44,5 +47,12 @@ do_test (void)
acos (2.0);
return fail;
}
+#else
+static int
+do_test (void)
+{
+ return 77;
+}
+#endif
#include <support/test-driver.c>