Liste des Groupes | Revenir à cl c |
On 28/03/2024 22:07, Keith Thompson wrote:Agreed. Its undefined behavior wrt std C, however, _not_ when it comes to POSIX.bart <bc@freeuk.com> writes:I think that the C standards don't forbid the conversion, but the description of pointer conversions (6.3.2.3) does not describe such conversions. That makes it, AFAICS, undefined behaviour rather than "forbidden" (which I would define as something that mandates a diagnostic).On 28/03/2024 19:38, Keith Thompson wrote:>Kaz Kylheku <433-929-6894@kylheku.com> writes:>
[...]Conversions between function pointers and data pointers are anISO C does require a cast. The cast is necessary to avoid a
extension; it is not well-defined behavior in ISO C.
>
Therefore we can neither say that ISO C doesn't require a cast there (it
imposes no requirements at all), nor that the conversion is fine with a
cast.
>
The cast is /likely/ necessary, in order to correctly trigger the
extension.
constraint violation and a mandatory diagnostic. The resulting
behavior is undefined in ISO C, but defined by POSIX. Assigning a
void* value to a pointer-to-function object without a cast violates
the constraint for simple assignment (N1570 6.5.16.1p1).
What would such a cast look like? Since this gives a warning with
-Wpedantic even with a cast:
>
void* p;
void(*q)(void);
>
p=(void*)q;
q=(void(*)(void))p;
The warnings I get from gcc are:
>
warning: ISO C forbids conversion of function pointer to object pointer type [-Wpedantic]
warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
>
With -pedantic-errors, these become fatal errors.
>
I disagree with gcc. ISO C doesn't define the behavior, but it doesn't
forbid the conversion. (Anyone who disagrees is invited to cite the
constraint that it violates.)
>
Dereferencing such converted pointers might be undefined behaviour (if you haven't converted back to the original type), or implementation-dependent behaviour (if the conversions change the bitwise representation of the pointer).
I personally think it's good that gcc has this diagnostic, even if the message text is not strictly accurate.
Note that clang doesn't issue this diagnostic.
>
Les messages affichés proviennent d'usenet.