RFR: JDK-8221851: Use of THIS_FILE in hotspot invalidates precompiled header on Linux/GCC

David Holmes david.holmes at oracle.com
Fri Apr 5 05:08:06 UTC 2019


Adding back build-dev

On 5/04/2019 2:41 pm, Ioi Lam wrote:
> #define THIS_FILE (__FILE__ + FILE_MACRO_OFFSET)
> 
> This make me a little uneasy, as it could potential point past the end 
> of the string.

The intent of course is that that is impossible:
- _FILE_ is an absolute file path within the repo: /something/repo/file
- FILE_MACRO_OFFSET gets you from / to the top-level repo directory 
leaving "file"

so it has to be in bounds.

> For safety, Is it possible to get some sort of assert to make sure that 
> __FILE__ always has more than FILE_MACRO_OFFSET characters?
> 
> Maybe we can add a static object in macros.hpp with a constructor that 
> puts __FILE__ into a list, and then we can walk the list when the VM 
> starts up? E.g.
> 
>      ...
> 
>      #ifdef ASSERT
>      static ThisFileChecker __this_file_checker(__FILE__);
>      #endif
> 
>      #endif // SHARE_UTILITIES_MACROS_HPP

So basically you're not trusting the compiler and build system to be 
correct here. :)

Would it suffice to put a static assert in a common header, like 
macros.hpp, that verifies the length of _FILE_ or is that not available 
statically?

Cheers,
David

> 
> Thanks
> - Ioi
> 
> 
> On 4/4/19 9:04 PM, David Holmes wrote:
>> Hi Erik,
>>
>> Build and hotspot changes seem okay.
>>
>> Thanks,
>> David
>>
>> On 5/04/2019 8:03 am, Erik Joelsson wrote:
>>>
>>> On 2019-04-04 14:26, Kim Barrett wrote:
>>>>
>>>> OK, I can do that.
>>>>
>>>> ------------------------------------------------------------------------------ 
>>>>
>>>> src/hotspot/share/utilities/macros.hpp
>>>>   645 #if FILE_MACRO_OFFSET
>>>>   646 #define THIS_FILE (__FILE__ + FILE_MACRO_OFFSET)
>>>>   647 #else
>>>>   648 #define THIS_FILE __FILE__
>>>>   649 #endif
>>>>
>>>> Is the "#if FILE_MACRO_OFFSET" an intentional test for 0, or is this
>>>> an implicit test for "defined"?
>>>>
>>>> If the former, e.g. we're assuming it will always be defined but might
>>>> have a 0 value, then I'd skip it and just unconditionally define
>>>> THIS_FILE as (__FILE__ + FILE_MACRO_OFFSET).
>>>
>>> Right, that makes sense. I was sort of hedging for all possibilities 
>>> here, but as the build logic is currently structured, it will always 
>>> be defined, just sometimes 0.
>>>
>>> New webrev: http://cr.openjdk.java.net/~erikj/8221851/webrev.02/
>>>
>>> /Erik
>>>
>>>> If the latter, some compilers will (with some warning levels or
>>>> options, such as gcc -Wundef) complain about the (specified by the
>>>> standard) implicit conversion to 0 for an unrecognized identifier in
>>>> an #if expression, and an #ifdef should be used to protect against
>>>> that.
>>>>
>>>> ------------------------------------------------------------------------------ 
>>>>
>>>>
>>>>
> 


More information about the build-dev mailing list