Caveat: Unit tests are running and not complete yet. I’ll reply back once they 
are complete.

thanks,
-- Nithin

> On Feb 10, 2015, at 4:38 PM, Nithin Raju <nit...@vmware.com> wrote:
> 
> _BitScanForward() and friends are part of the Windows API and
> take DWORD as parameter type. DWORD is defined to be 'unsigned long'
> in Windows' header files.
> 
> We call into these functions from within lib/util.h. Currently, we
> pass arguments of type uint32_t which is type defined to
> 'unsigned int'. This incompatiblity causes failures when we compile
> the code as C++ code or with warnings enabled.
> 
> The fix is to use 'unsigned long' rather than fixed size type.
> 
> A simplied version of the problem is illustrated using a sample
> program:
> -------
> $ cat test.c
> 
> void
> init_dword(DWORD *d)
> {
>    *d = 0;
> }
> 
> int main()
> {
>    uint32_t u;
> 
>    init_dword(&u);
> 
>    return 0;
> }
> 
> ===========
> Problem manifests when warnings are enabled, and compiled as 'C' code:
> ===========
> $ cl -WX -W4 test.c
> Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
> Copyright (C) Microsoft Corporation.  All rights reserved.
> 
> test.c
> test.c(14) : error C2220: warning treated as error - no 'object' file 
> generated
> test.c(14) : warning C4057: 'function' : 'DWORD *' differs in indirection to 
> slightly different base types from 'uint32_t *'
> 
> ===========
> Problem manifests when code is compiled as 'C++' code:
> ===========
> $ cl -Tptest.c
> Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
> Copyright (C) Microsoft Corporation.  All rights reserved.
> 
> test.c
> test.c(14) : error C2664: 'void init_dword(DWORD *)' : cannot convert 
> argument 1 from 'uint32_t *' to 'DWORD *'
>        Types pointed to are unrelated; conversion requires reinterpret_cast, 
> C-style cast or function-style cast
> -------
> 
> Signed-off-by: Nithin Raju <nit...@vmware.com>
> Co-Authored-by: Linda Sun <l...@vmware.com>
> ---
> lib/util.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/util.h b/lib/util.h
> index cbaa3ac..276edb5 100644
> --- a/lib/util.h
> +++ b/lib/util.h
> @@ -352,11 +352,11 @@ static inline int
> raw_ctz(uint64_t n)
> {
> #ifdef _WIN64
> -    uint32_t r = 0;
> +    unsigned long r = 0;
>     _BitScanForward64(&r, n);
>     return r;
> #else
> -    uint32_t low = n, high, r = 0;
> +    unsigned long low = n, high, r = 0;
>     if (_BitScanForward(&r, low)) {
>         return r;
>     }
> @@ -370,11 +370,11 @@ static inline int
> raw_clz64(uint64_t n)
> {
> #ifdef _WIN64
> -    uint32_t r = 0;
> +    unsigned long r = 0;
>     _BitScanReverse64(&r, n);
>     return 63 - r;
> #else
> -    uint32_t low, high = n >> 32, r = 0;
> +    unsigned long low, high = n >> 32, r = 0;
>     if (_BitScanReverse(&r, high)) {
>         return 31 - r;
>     }
> -- 
> 1.9.4.msysgit.2
> 

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to