Eric Blake <ebl...@redhat.com> writes:

> On 06/22/2015 01:26 PM, Markus Armbruster wrote:
>> qga_vss_fsfreeze() casts error_set_win32() from
>> 
>>     void (*)(Error **, int, ErrorClass, const char *, ...)
>> 
>> to
>> 
>>     void (*)(void **, int, int, const char *, ...)
>> 
>> The result is later called.  Since the two types are not compatible,
>> the call is undefined behavior.  It works in practice anyway.
>
> Better than some other horrid casts we do, like monitor.c playing fast
> and loose with 'Monitor *' vs. 'FILE *' in hmp_info_mtree() and friends.
>  But that's a cleanup for another series.

I wonder why we don't have a warning to flag casts of a function where
calling the result would be undefined behavior.

>> However, there's no real need for trickery here.  Clean it up as
>> follows:
>> 
>> * Declare struct Error, and fix the first parameter.
>> 
>> * Switch to error_setg_win32().  This gets rid of the troublesome
>>   ErrorClass parameter.  Requires converting error_setg_win32() from
>>   macro to function, but that's trivially easy, because this is the
>>   only user of error_set_win32().
>> 
>> Signed-off-by: Markus Armbruster <arm...@redhat.com>
>> ---
>
> Reviewed-by: Eric Blake <ebl...@redhat.com>

Thanks!

Reply via email to