[9] RFR(L): 8037816 : Fix for 8036122 breaks build with Xcode5/clang
Christian Thalinger
christian.thalinger at oracle.com
Fri Apr 18 18:27:34 UTC 2014
On Apr 18, 2014, at 7:17 AM, David Chase <david.r.chase at oracle.com> wrote:
>
> On 2014-04-17, at 8:01 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
>>>>> (3) In many cases, the best fix is to replace a call to a method expecting a format with one to a method expecting only a string. That is, replace “print(s)” with “print_raw(s)”. Note that when there is a single parameter this cannot possibly be a mistake.
>>>>
>>>> Yes, it fixes the problem but it will be difficult to remember or know (for new people) that you should use print_raw instead.
>>>
>>> What's the alternative? Once we get our compilers up to decent revisions, the checking will just be there, and
>>> anyone who writes print(s) will get an error.
>>
>> Not sure. Can we make:
>>
>> void print_raw(const char* str) { write(str, strlen(str)); }
>>
>> just
>>
>> void print(const char* str) { write(str, strlen(str)); }
>>
>> ? That would help a lot, I think.
>
> I'm planning to make (and test) the following changes, which I've run past multiple
> compilers already in a test program. Assuming all goes well, there will be a new webrev
> in a while. HOWEVER, I could not figure out how to overload two definitions of "print"
> when one of them is fmt + varargs and the other is just a string. I get ambiguous overloading
> errors like this:
>
> Test print(const char * s) overloading.
> test.cpp:30:3: error: call to 'my_print' is ambiguous
> my_print(s);
> ^~~~~~~~
> test.cpp:12:6: note: candidate function
> void my_print(const char * fmt, ...) {
> ^
> test.cpp:18:6: note: candidate function
> void my_print(const char * s) {
> ^
That’s what I thought. Never mind then.
>
> So unless someone has a better idea, we're stuck with print/print_raw, and it would be
> a good idea to run the compiler with -Wformat-security to avoid mistakes. I'm not quite
> clear on why gcc was not also reporting these errors already in our builds, since it is
> able to do so and it looked like the flag was set that enabled them.
>
> Anyone have a better idea?
Nope.
>
> ---------------------------
> Changes to fix:
> Replace const char * fmt = string with #define fmt string to work around literal-minded format-checking.
>
> Test push/pop with older versions of clang (works).
>
> Add _Pragma("GCC diagnostic ignored \"-Wformat-security\"") for older clang.
>
> P2I inline method.
> static inline intptr_t p2i(void * p) { return (intptr_t) p; }
>
> ---------------------------
>
More information about the hotspot-dev
mailing list