On 12/10/2012 07:37 PM, Amine Khaldi wrote:
> This prevents the undefined behavior (null pointer dereference)
> diagnostics (clang with ubsan checks for example).
This is a bug in clang. There is no null pointer dereference.
Afair gcc tried to pull this trick too but got educated about their error.


> 
> ---
>  include/winnt.h | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/include/winnt.h b/include/winnt.h
> index 207adaa..a3b996a 100644
> --- a/include/winnt.h
> +++ b/include/winnt.h
> @@ -746,8 +746,12 @@ typedef struct _MEMORY_BASIC_INFORMATION
>  
>  #define UNICODE_STRING_MAX_CHARS 32767
>  
> +#if defined(__GNUC__) || defined(__clang__)
> +#define FIELD_OFFSET(type, field) offsetof(type, field)
> +#else
>  #define FIELD_OFFSET(type, field) \
>    ((LONG)(INT_PTR)&(((type *)0)->field))
> +#endif
>  
>  #define CONTAINING_RECORD(address, type, field) \
>    ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field)))

bye
        michael


Reply via email to