Fix Coverity #261967, Infinite loop
authorJustin Chadwell <justin.chadwell@arm.com>
Tue, 23 Jul 2019 13:56:48 +0000 (14:56 +0100)
committerJustin Chadwell <justin.chadwell@arm.com>
Tue, 6 Aug 2019 12:06:03 +0000 (13:06 +0100)
Coverity has identified that the __aeabi_imod function will loop forever
if the denominator is not a power of 2, which is probably not the
desired behaviour.

The functions in the rest of the file are compiler implementations of
division if ARMv7 does not implement division which is permitted by the
spec. However, while most of the functions in the file are documented
and referenced in other places online, __aeabi_uimod and __aeabi_imod
are not. For this reason, these functions have been removed from the
code base, which also removes the Coverity error.

Change-Id: I20066d72365329a8b03a5536d865c4acaa2139ae
Signed-off-by: Justin Chadwell <justin.chadwell@arm.com>
lib/aarch32/arm32_aeabi_divmod.c

index 0b36cb6cf43d63a462db210bc18c5ee1faca93e1..ea8e2bbca684c86ac645ed0f2d7727468cf905ea 100644 (file)
@@ -33,13 +33,11 @@ static void uint_div_qr(unsigned int numerator, unsigned int denominator,
 unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator);
 
 unsigned int __aeabi_uidiv(unsigned int numerator, unsigned int denominator);
-unsigned int __aeabi_uimod(unsigned int numerator, unsigned int denominator);
 
 /* returns in R0 and R1 by tail calling an asm function */
 signed int __aeabi_idivmod(signed int numerator, signed int denominator);
 
 signed int __aeabi_idiv(signed int numerator, signed int denominator);
-signed int __aeabi_imod(signed int numerator, signed int denominator);
 
 /*
  * __ste_idivmod_ret_t __aeabi_idivmod(signed numerator, signed denominator)
@@ -106,15 +104,6 @@ unsigned int __aeabi_uidiv(unsigned int numerator, unsigned int denominator)
        return qr.q;
 }
 
-unsigned int __aeabi_uimod(unsigned int numerator, unsigned int denominator)
-{
-       struct qr qr = { .q_n = 0, .r_n = 0 };
-
-       uint_div_qr(numerator, denominator, &qr);
-
-       return qr.r;
-}
-
 unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator)
 {
        struct qr qr = { .q_n = 0, .r_n = 0 };
@@ -145,42 +134,6 @@ signed int __aeabi_idiv(signed int numerator, signed int denominator)
        return qr.q;
 }
 
-signed int __aeabi_imod(signed int numerator, signed int denominator)
-{
-       signed int s;
-       signed int i;
-       signed int j;
-       signed int h;
-       struct qr qr = { .q_n = 0, .r_n = 0 };
-
-       /* in case modulo of a power of 2 */
-       for (i = 0, j = 0, h = 0, s = denominator; (s != 0) || (h > 1); i++) {
-               if (s & 1) {
-                       j = i;
-                       h++;
-               }
-               s = s >> 1;
-       }
-       if (h == 1)
-               return numerator >> j;
-
-       if (((numerator < 0) && (denominator > 0)) ||
-           ((numerator > 0) && (denominator < 0)))
-               qr.q_n = 1;     /* quotient shall be negate */
-
-       if (numerator < 0) {
-               numerator = -numerator;
-               qr.r_n = 1;     /* remainder shall be negate */
-       }
-
-       if (denominator < 0)
-               denominator = -denominator;
-
-       uint_div_qr(numerator, denominator, &qr);
-
-       return qr.r;
-}
-
 signed int __aeabi_idivmod(signed int numerator, signed int denominator)
 {
        struct qr qr = { .q_n = 0, .r_n = 0 };