From: Johann Date: Mon, 21 Sep 2015 23:55:28 +0000 (-0700) Subject: Restrict get_msb inputs X-Git-Tag: v1.5.0~130 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=90a109f0eef8bfaaa4869cf7b2873dac5076b582;p=platform%2Fupstream%2Flibvpx.git Restrict get_msb inputs Add a warning and assert that inputs for get_msb must not be zero. Change-Id: I8c6f289ff13248f6e3a8bc24aab3712ed33022a6 --- diff --git a/vpx_ports/bitops.h b/vpx_ports/bitops.h index 0d3223e..84ff365 100644 --- a/vpx_ports/bitops.h +++ b/vpx_ports/bitops.h @@ -11,6 +11,8 @@ #ifndef VPX_PORTS_BITOPS_H_ #define VPX_PORTS_BITOPS_H_ +#include + #include "vpx_ports/msvc.h" #ifdef _MSC_VER @@ -25,10 +27,15 @@ extern "C" { #endif +// These versions of get_msb() are only valid when n != 0 because all +// of the optimized versions are undefined when n == 0: +// https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html + // use GNU builtins where available. #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) static INLINE int get_msb(unsigned int n) { + assert(n != 0); return 31 ^ __builtin_clz(n); } #elif defined(USE_MSC_INTRINSICS) @@ -36,6 +43,7 @@ static INLINE int get_msb(unsigned int n) { static INLINE int get_msb(unsigned int n) { unsigned long first_set_bit; + assert(n != 0); _BitScanReverse(&first_set_bit, n); return first_set_bit; } @@ -47,6 +55,8 @@ static INLINE int get_msb(unsigned int n) { unsigned int value = n; int i; + assert(n != 0); + for (i = 4; i >= 0; --i) { const int shift = (1 << i); const unsigned int x = value >> shift;