summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-18 08:10:59 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-18 10:14:34 -0700
commit1e35fa11db662e6237e76f800a9294809bcb1660 (patch)
tree9ccd18d3d8e3330e9a3c93ab4fd5a73d431632b7
parent942232043a17025d95619c4414b1146094085734 (diff)
downloadtxr-1e35fa11db662e6237e76f800a9294809bcb1660.tar.gz
txr-1e35fa11db662e6237e76f800a9294809bcb1660.tar.bz2
txr-1e35fa11db662e6237e76f800a9294809bcb1660.zip
mpi: enforce testing of some return values.
Using a feature of GCC, we mark some functions with the warn_unused_result attribute. Specifically, those functions which could return the MP_TOOBIG overflow error. * mpi/mpi.h (mp_nign): New macro. (mp_init_size, mp_add_d, mp_sub_d, mp_mul_d, mp_mul_2, mp_div_d, mp_div_2, mp_expt_d, mp_add, mp_sub, mp_mul, mp_mul_2d, mp_sqr, mp_expt, mp_2expt, mp_sqrt, mp_addmod, mp_submod, mp_mulmod, mp_sqrmod, mp_exptmod, mp_exptmod_d, mp_lcm, mp_xgcd, mp_invmod, mp_trunc_comp, mp_trunc, mp_shift, mp_to_double, mp_read_signed_bin, mp_read_unsigned_bin, mp_read_radix): Functions attributed with unused result warning.
-rw-r--r--mpi/mpi.h70
1 files changed, 38 insertions, 32 deletions
diff --git a/mpi/mpi.h b/mpi/mpi.h
index 7bc705a4..06adc1d4 100644
--- a/mpi/mpi.h
+++ b/mpi/mpi.h
@@ -56,6 +56,12 @@ typedef struct {
#define DIGITS(MP) ((MP)->dp)
#define DIGIT(MP,N) (MP)->dp[(N)]
+#ifdef __GNUC__
+#define mp_nign __attribute__((warn_unused_result))
+#else
+#define mp_nign
+#endif
+
mp_size mp_get_prec(void);
void mp_set_prec(mp_size prec);
@@ -66,7 +72,7 @@ INLINE mp_err mp_init_minimal(mp_int *mp)
return MP_OKAY;
}
mp_err mp_init_array(mp_int mp[], int count);
-mp_err mp_init_size(mp_int *mp, mp_size prec);
+mp_nign mp_err mp_init_size(mp_int *mp, mp_size prec);
mp_err mp_init_copy(mp_int *mp, mp_int *from);
mp_err mp_copy(mp_int *from, mp_int *to);
void mp_exch(mp_int *mp1, mp_int *mp2);
@@ -84,45 +90,45 @@ mp_err mp_set_double_intptr(mp_int *mp, double_intptr_t z);
#endif
mp_err mp_set_word(mp_int *mp, mp_word w, int sign);
-mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b);
-mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b);
-mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b);
-mp_err mp_mul_2(mp_int *a, mp_int *c);
-mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r);
-mp_err mp_div_2(mp_int *a, mp_int *c);
-mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c);
+mp_nign mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b);
+mp_nign mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b);
+mp_nign mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b);
+mp_nign mp_err mp_mul_2(mp_int *a, mp_int *c);
+mp_nign mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r);
+mp_nign mp_err mp_div_2(mp_int *a, mp_int *c);
+mp_nign mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c);
mp_err mp_abs(mp_int *a, mp_int *b);
mp_err mp_neg(mp_int *a, mp_int *b);
-mp_err mp_add(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c);
+mp_nign mp_err mp_add(mp_int *a, mp_int *b, mp_int *c);
+mp_nign mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c);
+mp_nign mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c);
+mp_nign mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c);
#if MP_SQUARE
-mp_err mp_sqr(mp_int *a, mp_int *b);
+mp_nign mp_err mp_sqr(mp_int *a, mp_int *b);
#else
#define mp_sqr(a, b) mp_mul(a, a, b)
#endif
mp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r);
mp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r);
-mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_2expt(mp_int *a, mp_digit k);
-mp_err mp_sqrt(mp_int *a, mp_int *b);
+mp_nign mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c);
+mp_nign mp_err mp_2expt(mp_int *a, mp_digit k);
+mp_nign mp_err mp_sqrt(mp_int *a, mp_int *b);
#if MP_MODARITH
mp_err mp_mod(mp_int *a, mp_int *m, mp_int *c);
mp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c);
-mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
-mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
-mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
+mp_nign mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
+mp_nign mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
+mp_nign mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
#if MP_SQUARE
-mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c);
+mp_nign mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c);
#else
#define mp_sqrmod(a, m, c) mp_mulmod(a, a, m, c)
#endif
-mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
-mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c);
+mp_nign mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
+mp_nign mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c);
#endif
int mp_cmp_z(mp_int *a);
@@ -137,9 +143,9 @@ unsigned long mp_hash(mp_int *a);
#if MP_NUMTH
mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c);
-mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y);
-mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c);
+mp_nign mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c);
+mp_nign mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y);
+mp_nign mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c);
#endif
mp_err mp_2comp(mp_int *a, mp_int *b, mp_size dig); /* peculiar semantics */
@@ -147,12 +153,12 @@ mp_err mp_and(mp_int *a, mp_int *b, mp_int *c);
mp_err mp_or(mp_int *a, mp_int *b, mp_int *c);
mp_err mp_xor(mp_int *a, mp_int *b, mp_int *c);
mp_err mp_comp(mp_int *a, mp_int *b);
-mp_err mp_trunc_comp(mp_int *a, mp_int *b, mp_digit bits);
-mp_err mp_trunc(mp_int *a, mp_int *b, mp_digit bits);
-mp_err mp_shift(mp_int *a, mp_int *b, int bits); /* + left, - right */
+mp_nign mp_err mp_trunc_comp(mp_int *a, mp_int *b, mp_digit bits);
+mp_nign mp_err mp_trunc(mp_int *a, mp_int *b, mp_digit bits);
+mp_nign mp_err mp_shift(mp_int *a, mp_int *b, int bits); /* + left, - right */
mp_err mp_bit(mp_int *a, mp_digit bit);
-mp_err mp_to_double(mp_int *mp, double *d);
+mp_nign mp_err mp_to_double(mp_int *mp, double *d);
#if MP_IOFUNC
void mp_print(mp_int *mp, FILE *ofp);
@@ -161,11 +167,11 @@ void mp_print(mp_int *mp, FILE *ofp);
#define BITS 1
#define BYTES CHAR_BIT
-mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, size_t len);
+mp_nign mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, size_t len);
size_t mp_signed_bin_size(mp_int *mp);
mp_err mp_to_signed_bin(mp_int *mp, unsigned char *str);
-mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, size_t len);
+mp_nign mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, size_t len);
size_t mp_unsigned_bin_size(mp_int *mp);
mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str);
mp_err mp_to_unsigned_buf(mp_int *mp, unsigned char *str, size_t size);
@@ -182,7 +188,7 @@ mp_size mp_is_pow_two(mp_int *mp);
#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str))
#endif
-mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix);
+mp_nign mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix);
mp_size mp_radix_size(mp_int *mp, int radix);
mp_size mp_value_radix_size(mp_size num, mp_size qty, int radix);
mp_err mp_toradix(mp_int *mp, unsigned char *str, int radix);