_ptr and _srcptr types

Pedro Gimeno gmpdevel at formauri.es
Tue May 22 02:46:50 UTC 2018


Vincent Lefevre wrote, On 2018-05-22 03:13:
> On 2018-05-20 22:07:36 +0200, Niels Möller wrote:
>> 
>> If that really is the case, most occurences of NULL or (void*)0 in
>> the argument list in the call of a varargs function would be
>> undefined behavior, right?
> 
> Using NULL is never guaranteed to work as it can be defined as the
> integer 0. If (void*)0 is used in place of (char*)0, I assume that
> this is OK sue to the same representation and alignment requirements
> (note 48 mentions that the goal is interchangeability, and as
> I understand it, this necessary condition is also a sufficient
> condition). But if same representation and alignment requirements
> are not satisfied, I assume that this is undefined behavior.

The C11 standard also says:

P.47:

1. A pointer to void may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer.

(Definition of object, p.5 §3.14: "region of data storage in the execution environment, the contents of which can represent values")

[...]

3. An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

4. Conversion of a null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal.

Doesn't that allow using (void *)0 for the suggested purpose?

-- 
Pedro Gimeno


More information about the gmp-devel mailing list