bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

libgmp tests: Add some safety checks


From: Bruno Haible
Subject: libgmp tests: Add some safety checks
Date: Sun, 12 Jul 2020 22:57:42 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-179-generic; KDE/5.18.0; x86_64; ; )

It's useful to verify two things regarding the linked GMP:

  * That the GMP_NUMB_BITS value matches the current ABI.
    This is useful because on bi-arch systems, the GMP configuration
    often compiles binaries for a different ABI than what has been
    requested [1][2][3].
  * That gmp.h and libgmp versions match. This is useful for any
    library, but for GMP in particular, because gmp.h contains some
    inline functions and macros that look like they could cause binary
    compatibility issues.

The idea for both verifications comes from the MPFR configure.ac.


2020-07-12  Bruno Haible  <bruno@clisp.org>

        libgmp tests: Add some safety checks.
        * modules/libgmp-tests (Depends-on): Add verify.
        * tests/test-libgmp.c: Verify GMP_NUMB_BITS value.
        (main): Verify that gmp.h and libgmp versions match.

diff --git a/modules/libgmp-tests b/modules/libgmp-tests
index 50a1801..c01b876 100644
--- a/modules/libgmp-tests
+++ b/modules/libgmp-tests
@@ -3,6 +3,7 @@ tests/macros.h
 tests/test-libgmp.c
 
 Depends-on:
+verify
 
 configure.ac:
 
diff --git a/tests/test-libgmp.c b/tests/test-libgmp.c
index f72a74c..58ccc66 100644
--- a/tests/test-libgmp.c
+++ b/tests/test-libgmp.c
@@ -16,13 +16,49 @@
 
 #include <config.h>
 
+/* Specification.  */
 #include <gmp.h>
 
+#include <limits.h>
+#include <string.h>
+
+#include "verify.h"
+
 #include "macros.h"
 
+#ifndef MINI_GMP_LIMB_TYPE
+/* Verify that the gmp.h header file was generated for the same
+   machine word size as we are using.  */
+verify (GMP_NUMB_BITS == sizeof (mp_limb_t) * CHAR_BIT);
+#endif
+
 int
 main ()
 {
+#ifndef MINI_GMP_LIMB_TYPE
+  /* Verify that the gmp.h header file and the libgmp library come from
+     the same GMP version.  */
+  {
+    char gmp_header_version[32];
+    sprintf (gmp_header_version, "%d.%d.%d", __GNU_MP_VERSION,
+             __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL);
+    if (strcmp (gmp_version, gmp_header_version) != 0)
+      {
+        char gmp_header_version2[32];
+        if (__GNU_MP_VERSION_PATCHLEVEL > 0
+            || (sprintf (gmp_header_version2, "%d.%d", __GNU_MP_VERSION,
+                         __GNU_MP_VERSION_MINOR),
+                strcmp (gmp_version, gmp_header_version2) != 0))
+          {
+            fprintf (stderr,
+                     "gmp header version (%s) does not match gmp library 
version (%s).\n",
+                     gmp_header_version, gmp_version);
+            exit (1);
+          }
+      }
+  }
+#endif
+
   /* A simple sanity check that 2 + 2 = 4.  */
   static mp_limb_t const twobody[] = { 2 };
   static mpz_t const two = MPZ_ROINIT_N ((mp_limb_t *) twobody, 1);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]