Commit e8f56cc4e0c5211d73a127076a2e7318655bde17

Daniel Mendler 2019-04-05T11:37:49

enable -Wconversion and -Wsign-conversion on travis * no changes to the library code * conversion issues in the demo testsuite fixed * add CONV_WARNINGS and enable the warnings only for clang-7 (for now) * disable Wsystem-headers if Wconversion is enabled, to avoid warnings from the system headers

diff --git a/.travis.yml b/.travis.yml
index 5fb6ded..56d4a60 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -112,7 +112,7 @@ matrix:
             - gcc-4.9
 
     # clang for x86-64 architecture (64-bit longs and 64-bit pointers)
-    - env: BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-valgrind'
+    - env: CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-valgrind'
     - env: BUILDOPTIONS='--with-cc=clang-6.0 --with-m64 --with-valgrind'
       addons:
         apt:
diff --git a/demo/opponent.c b/demo/opponent.c
index d701325..7f02252 100644
--- a/demo/opponent.c
+++ b/demo/opponent.c
@@ -79,7 +79,7 @@ int mtest_opponent(void)
          FGETS(buf, 4095, stdin);
          mp_read_radix(&b, buf, 64);
 
-         mp_mul_2d(&a, rr, &a);
+         mp_mul_2d(&a, (int)rr, &a);
          a.sign = b.sign;
          if (mp_cmp(&a, &b) != MP_EQ) {
             printf("mul2d failed, rr == %u\n", rr);
@@ -96,7 +96,7 @@ int mtest_opponent(void)
          FGETS(buf, 4095, stdin);
          mp_read_radix(&b, buf, 64);
 
-         mp_div_2d(&a, rr, &a, &e);
+         mp_div_2d(&a, (int)rr, &a, &e);
          a.sign = b.sign;
          if ((a.used == b.used) && (a.used == 0)) {
             a.sign = b.sign = MP_ZPOS;
@@ -128,10 +128,10 @@ int mtest_opponent(void)
 
          /* test the sign/unsigned storage functions */
 
-         rr = mp_signed_bin_size(&c);
+         rr = (unsigned)mp_signed_bin_size(&c);
          mp_to_signed_bin(&c, (unsigned char *) cmd);
-         memset(cmd + rr, rand() & 0xFFu, sizeof(cmd) - rr);
-         mp_read_signed_bin(&d, (unsigned char *) cmd, rr);
+         memset(cmd + rr, rand() & 0xFF, sizeof(cmd) - rr);
+         mp_read_signed_bin(&d, (unsigned char *) cmd, (int)rr);
          if (mp_cmp(&c, &d) != MP_EQ) {
             printf("mp_signed_bin failure!\n");
             draw(&c);
@@ -140,10 +140,10 @@ int mtest_opponent(void)
          }
 
 
-         rr = mp_unsigned_bin_size(&c);
+         rr = (unsigned)mp_unsigned_bin_size(&c);
          mp_to_unsigned_bin(&c, (unsigned char *) cmd);
-         memset(cmd + rr, rand() & 0xFFu, sizeof(cmd) - rr);
-         mp_read_unsigned_bin(&d, (unsigned char *) cmd, rr);
+         memset(cmd + rr, rand() & 0xFF, sizeof(cmd) - rr);
+         mp_read_unsigned_bin(&d, (unsigned char *) cmd, (int)rr);
          if (mp_cmp_mag(&c, &d) != MP_EQ) {
             printf("mp_unsigned_bin failure!\n");
             draw(&c);
@@ -343,7 +343,7 @@ int mtest_opponent(void)
          sscanf(buf, "%d", &ix);
          FGETS(buf, 4095, stdin);
          mp_read_radix(&b, buf, 64);
-         mp_add_d(&a, ix, &c);
+         mp_add_d(&a, (mp_digit)ix, &c);
          if (mp_cmp(&b, &c) != MP_EQ) {
             printf("add_d %lu failure\n", add_d_n);
             draw(&a);
@@ -360,7 +360,7 @@ int mtest_opponent(void)
          sscanf(buf, "%d", &ix);
          FGETS(buf, 4095, stdin);
          mp_read_radix(&b, buf, 64);
-         mp_sub_d(&a, ix, &c);
+         mp_sub_d(&a, (mp_digit)ix, &c);
          if (mp_cmp(&b, &c) != MP_EQ) {
             printf("sub_d %lu failure\n", sub_d_n);
             draw(&a);
diff --git a/demo/test.c b/demo/test.c
index 3aa1a22..208ab7f 100644
--- a/demo/test.c
+++ b/demo/test.c
@@ -103,7 +103,7 @@ static int test_mp_jacobi(void)
       mp_set_int(&b, jacobi[cnt].n);
       /* only test positive values of a */
       for (n = -5; n <= 10; ++n) {
-         mp_set_int(&a, abs(n));
+         mp_set_int(&a, (unsigned int)abs(n));
          should = MP_OKAY;
          if (n < 0) {
             mp_neg(&a, &a);
@@ -221,14 +221,14 @@ static int test_mp_complement(void)
    }
 
    for (i = 0; i < 1000; ++i) {
-      int l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&a, labs(l));
+      long l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
+      mp_set_long(&a, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&a, &a);
       mp_complement(&a, &b);
 
       l = ~l;
-      mp_set_int(&c, labs(l));
+      mp_set_long(&c, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&c, &c);
 
@@ -255,16 +255,17 @@ static int test_mp_tc_div_2d(void)
    }
 
    for (i = 0; i < 1000; ++i) {
-      int l, em;
+      long l;
+      int em;
 
       l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&a, labs(l));
+      mp_set_long(&a, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&a, &a);
 
       em = rand() % 32;
 
-      mp_set_int(&d, labs(l >> em));
+      mp_set_long(&d, (unsigned long)labs(l >> em));
       if ((l >> em) < 0)
          mp_neg(&d, &d);
 
@@ -296,16 +297,16 @@ static int test_mp_tc_xor(void)
       int l, em;
 
       l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&a, labs(l));
+      mp_set_int(&a, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&a, &a);
 
       em = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&b, labs(em));
+      mp_set_int(&b, (unsigned long)labs(em));
       if (em < 0)
          mp_neg(&b, &b);
 
-      mp_set_int(&d, labs(l ^ em));
+      mp_set_int(&d, (unsigned long)labs(l ^ em));
       if ((l ^ em) < 0)
          mp_neg(&d, &d);
 
@@ -334,19 +335,19 @@ static int test_mp_tc_or(void)
    }
 
    for (i = 0; i < 1000; ++i) {
-      int l, em;
+      long l, em;
 
       l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&a, labs(l));
+      mp_set_long(&a, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&a, &a);
 
       em = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&b, labs(em));
+      mp_set_long(&b, (unsigned long)labs(em));
       if (em < 0)
          mp_neg(&b, &b);
 
-      mp_set_int(&d, labs(l | em));
+      mp_set_long(&d, (unsigned long)labs(l | em));
       if ((l | em) < 0)
          mp_neg(&d, &d);
 
@@ -374,19 +375,19 @@ static int test_mp_tc_and(void)
    }
 
    for (i = 0; i < 1000; ++i) {
-      int l, em;
+      long l, em;
 
       l = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&a, labs(l));
+      mp_set_long(&a, (unsigned long)labs(l));
       if (l < 0)
          mp_neg(&a, &a);
 
       em = (rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
-      mp_set_int(&b, labs(em));
+      mp_set_long(&b, (unsigned long)labs(em));
       if (em < 0)
          mp_neg(&b, &b);
 
-      mp_set_int(&d, labs(l & em));
+      mp_set_long(&d, (unsigned long)labs(l & em));
       if ((l & em) < 0)
          mp_neg(&d, &d);
 
@@ -554,9 +555,9 @@ static int test_mp_get_long(void)
    }
 
    for (i = 0; i < ((int)(sizeof(unsigned long)*CHAR_BIT) - 1); ++i) {
-      t = (1ULL << (i+1)) - 1;
+      t = (1UL << (i+1)) - 1;
       if (!t)
-         t = -1;
+         t = ~0UL;
       printf(" t = 0x%lx i = %d\r", t, i);
       do {
          if (mp_set_long(&a, t) != MP_OKAY) {
@@ -592,7 +593,7 @@ static int test_mp_get_long_long(void)
    for (i = 0; i < ((int)(sizeof(unsigned long long)*CHAR_BIT) - 1); ++i) {
       r = (1ULL << (i+1)) - 1;
       if (!r)
-         r = -1;
+         r = ~0ULL;
       printf(" r = 0x%llx i = %d\r", r, i);
       do {
          if (mp_set_long_long(&a, r) != MP_OKAY) {
@@ -1345,7 +1346,7 @@ static int test_mp_ilogb(void)
       }
       /* radix_size includes the memory needed for '\0', too*/
       size -= 2;
-      if (mp_cmp_d(&lb, size) != MP_EQ) {
+      if (mp_cmp_d(&lb, (mp_digit)size) != MP_EQ) {
          goto LBL_ERR;
       }
    }
@@ -1365,7 +1366,7 @@ static int test_mp_ilogb(void)
          goto LBL_ERR;
       }
       size -= 2;
-      if (mp_cmp_d(&lb, size) != MP_EQ) {
+      if (mp_cmp_d(&lb, (mp_digit)size) != MP_EQ) {
          goto LBL_ERR;
       }
    }
diff --git a/makefile_include.mk b/makefile_include.mk
index 1b57833..ccc785f 100644
--- a/makefile_include.mk
+++ b/makefile_include.mk
@@ -51,10 +51,14 @@ CFLAGS += -I./ -Wall -Wsign-compare -Wextra -Wshadow
 
 ifndef NO_ADDTL_WARNINGS
 # additional warnings
-CFLAGS += -Wsystem-headers
 CFLAGS += -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align
 CFLAGS += -Wstrict-prototypes -Wpointer-arith
-#CFLAGS += -Wconversion -Wsign-conversion
+endif
+
+ifdef CONV_WARNINGS
+CFLAGS += -Wconversion -Wsign-conversion
+else
+CFLAGS += -Wsystem-headers
 endif
 
 ifdef COMPILE_DEBUG