qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-trivial] [Qemu-devel] [PATCH 5/6] Remove warning in printf due


From: Alexandre Raymond
Subject: Re: [Qemu-trivial] [Qemu-devel] [PATCH 5/6] Remove warning in printf due to type mismatch
Date: Fri, 27 May 2011 18:10:58 -0400

Hi Stefan and Markus,

Thanks for your feedback :)

"%td" doesn't generate warnings on Linux nor on OSX.

Alexandre

On Fri, May 27, 2011 at 4:44 PM, Stefan Weil <address@hidden> wrote:
> Am 27.05.2011 21:11, schrieb Markus Armbruster:
>>
>> Stefan Weil <address@hidden> writes:
>>
>>> Am 27.05.2011 19:22, schrieb Alexandre Raymond:
>>>>
>>>> ----8<----
>>>> qemu/target-lm32/translate.c: In function
>>>> ‘gen_intermediate_code_internal’:
>>>> qemu/target-lm32/translate.c:1135: warning: format ‘%zd’ expects
>>>> type ‘signed size_t’, but argument 4 has type ‘int’
>>>> ----8<----
>>>>
>>>> Both gen_opc_ptr and gen_opc_buf are "uint16_t *", so a simple '%d'
>>>> should
>>>> be able to describe their relative difference.
>>>>
>>>> Signed-off-by: Alexandre Raymond <address@hidden>
>>>> ---
>>>> target-lm32/translate.c | 2 +-
>>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>>
>>>> diff --git a/target-lm32/translate.c b/target-lm32/translate.c
>>>> index eb21158..0f69f27 100644
>>>> --- a/target-lm32/translate.c
>>>> +++ b/target-lm32/translate.c
>>>> @@ -1132,7 +1132,7 @@ static void
>>>> gen_intermediate_code_internal(CPUState *env,
>>>> if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
>>>> qemu_log("\n");
>>>> log_target_disas(pc_start, dc->pc - pc_start, 0);
>>>> - qemu_log("\nisize=%d osize=%zd\n",
>>>> + qemu_log("\nisize=%d osize=%d\n",
>>>> dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
>>>> }
>>>> #endif
>>>
>>> Nack.
>>>
>>> The original code is correct, because the difference of two pointers
>>> is always of type ssize_t (well, obviously not with your compiler,
>>> but then I assume that your compiler is broken).
>>
>> ISO/IEC 9899:1999 §6.5.6 on pointer subtraction:
>>
>> The size of the result is implementation-defined, and its type (a
>> signed integer type) is ptrdiff_t defined in the <stddef.h> header.
>>
>> The pedantically correct way to print a pointer difference is the 't'
>> type modifier. Ibid. §7.19.6.1 on fprintf():
>>
>> t Specifies that a following d, i, o, u, x, or X conversion
>> specifier applies to a ptrdiff_t or the corresponding unsigned
>> integer type argument; or that a following n conversion
>> specifier applies to a pointer to a ptrdiff_t argument.
>>
>> ssize_t is POSIX, not ISO C. It can differ from ptrdiff_t only if
>> ptrdiff_t has a different size than size_t, which would be kind of sick.
>> ISO C permits all kinds of sickness. Whether tolerating a particular
>> sickness is worth our while is another question.
>>
>> [...]
>
> That's correct. And ptrdiff_t needs %td.
>
> Alexandre, could you please try %td instead of %zd?
>
> Cheers,
> Stefan W.
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]