Compiler printf format checking

David Simms david.simms at oracle.com
Wed Dec 11 00:38:42 PST 2013


+1

Been caught with printf format related bugs before, that were not easy 
to find.

On 12/11/2013 08:54 AM, Staffan Larsen wrote:
> I think this would still be valuable even if it’s quite a lot of work to get all the casts in there. Any way we can have automatic tools (the compiler in this case) catch error for us is good. Is there a bug for this somewhere?
>
> /Staffan
>
> On 4 dec 2013, at 15:06, Zhengyu Gu <zhengyu.gu at oracle.com> wrote:
>
>> Yes. That is exactly what I saw. We have to cast all pointers for using PRT_FORMAT, etc. or we get compile errors, something like:
>>
>> /java/deployment/zg131198/6967948/hotspot/src/share/vm/utilities/events.hpp:131: error: format '%08x' expects type 'unsigned int', but argument 3 has type 'Thread*'
>>
>> Thanks,
>>
>> -Zhengyu
>>
>>
>> On 12/3/2013 6:50 PM, Mikael Vidstedt wrote:
>>> FWIW - I played around with doing exactly that a year ago or so. The biggest (and only) problem I found is that we have a large number of places where we want to print pointers using various formats (sometimes with "0x" prefix, sometimes using zero padding, etc.). The only valid printf format specifier for pointers is '%p', and the exact output of '%p' is not specified, much less as flexible as we need it to be.
>>>
>>> What that that effectively means is that we'd have to cast any and all pointer arguments to printf-style functions, something like:
>>>
>>> tty->print("The pointer: " PTR_FORMAT, ptr);
>>>
>>> would have to become:
>>>
>>> tty->print("The pointer: " PTR_FORMAT, (uintptr_t)ptr);
>>>
>>> This will obviously pollute the code, but would enable using __attribute__((format...)) & friends. If I remember correctly there are ~1000 or so places where a cast would have to be added. It was unclear to me at the time if that was something we were willing to do.
>>>
>>> (I also investigated if there are ways to (mis-)use templates to work around the cast issue, but as far as I can tell that is not possible)
>>>
>>> Cheers,
>>> Mikael
>>>
>>> On 2013-12-03 11:13, Staffan Larsen wrote:
>>>> Looks good!
>>>>
>>>> (we should use "__attribute__ format" to let the compiler catch these problems)
>>>>
>>>> Thanks,
>>>> /Staffan
>>>>
>>>> On 3 dec 2013, at 19:31, Zhengyu Gu <zhengyu.gu at oracle.com> wrote:
>>>>
>>>>> This is a simple fix in context of nightly failures cleaning up. The fix will go into JDK 9 once the repository is open.
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8026300
>>>>> Webrev:  http://cr.openjdk.java.net/~zgu/8026300/webrev.00/
>>>>>
>>>>> Test:
>>>>>   Tested on reported platform, which is Linux 32 bit.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> -Zhengyu



More information about the hotspot-runtime-dev mailing list