On Tue, 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>
This will need a Signed-off-by from Linda too.

> ---
>  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
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to