From 9ec5bf12136008acd61d87f56567718583a4f310 Mon Sep 17 00:00:00 2001 From: Daniel Mendler Date: Fri, 5 Apr 2019 11:37:49 +0200 Subject: [PATCH] enable -Wconversion and -Wsign-conversion by default * no changes to the library code * conversion issues in the demo testsuite fixed * disable warnings in mtest since we do not want to touch mpi code * add NO_CONV_WARNINGS and disable the warnings for 8 and 16bit limbs (many warnings due to int promotion if mp_word is smaller than int) * disable Wsystem-headers if Wconversion is enabled, to avoid warnings from the system headers --- .travis.yml | 12 ++++++------ demo/opponent.c | 20 ++++++++++---------- demo/test.c | 43 ++++++++++++++++++++++--------------------- makefile_include.mk | 8 ++++++-- mtest/logtab.h | 2 +- mtest/mtest.c | 5 +++++ 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/.travis.yml b/.travis.yml index 047939dd9..28f0255d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,14 +102,14 @@ matrix: # GCC for the x86-64 architecture with restricted limb sizes # formerly started with the option "--with-low-mp" to testme.sh # but testing all three in one run took to long and timed out. - - env: BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_8BIT --with-valgrind' - - env: BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_16BIT --with-valgrind' - - env: BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_32BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_8BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_16BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_32BIT --with-valgrind' # clang for the x86-64 architecture with restricted limb sizes - - env: BUILDOPTIONS='--with-cc=clang --cflags=-DMP_8BIT --with-valgrind' - - env: BUILDOPTIONS='--with-cc=clang --cflags=-DMP_16BIT --with-valgrind' - - env: BUILDOPTIONS='--with-cc=clang --cflags=-DMP_32BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=clang --cflags=-DMP_8BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=clang --cflags=-DMP_16BIT --with-valgrind' + - env: NO_CONV_WARNINGS=1 BUILDOPTIONS='--with-cc=clang --cflags=-DMP_32BIT --with-valgrind' # GCC for the x86-64 architecture testing against a different Bigint-implementation # with 333333 different inputs. diff --git a/demo/opponent.c b/demo/opponent.c index d7013250c..7f0225213 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 d7208023b..a34da8efa 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) { diff --git a/makefile_include.mk b/makefile_include.mk index 1b5783314..d6f5eb0f1 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 NO_CONV_WARNINGS +CFLAGS += -Wsystem-headers +else +CFLAGS += -Wconversion -Wsign-conversion endif ifdef COMPILE_DEBUG diff --git a/mtest/logtab.h b/mtest/logtab.h index dae3344d6..2e98fbdb0 100644 --- a/mtest/logtab.h +++ b/mtest/logtab.h @@ -1,4 +1,4 @@ -const float s_logv_2[] = { +const double s_logv_2[] = { 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* 0 1 2 3 */ 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ diff --git a/mtest/mtest.c b/mtest/mtest.c index 06c9afb1f..e05596e82 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -1,3 +1,8 @@ +#if defined(__GNUC__) || defined(__clang__) +# pragma GCC diagnostic ignored "-Wconversion" +# pragma GCC diagnostic ignored "-Wsign-conversion" +#endif + /* makes a bignum test harness with NUM tests per operation * * the output is made in the following format [one parameter per line]