RFR: 8206454: [8u] os::current_stack_pointer() fails to compile on later Windows compilers (warning C4172: returning address of local variable)

David Holmes david.holmes at oracle.com
Mon Jul 9 02:38:15 UTC 2018


Hi Kevin,

I note we currently never use push/pop on Windows, rather we use the 
pattern:

#pragma warning( disable : NNN )
<code>
#pragma warning( default : NNN )

Do older 8u compilers support the push/pop pragma warning capability?

Thanks,
David

On 7/07/2018 5:22 PM, Kevin Walls wrote:
> No problem!  Thanks for bringing this up for clarification.
> 
> 
> On 06/07/2018 23:32, Kim Barrett wrote:
>>> On Jul 6, 2018, at 4:37 PM, Kevin Walls <kevin.walls at oracle.com> wrote:
>>>
>>> Hi Kim -
>>>
>>> Good question. 8-)  Yes the same code is there in the latest version 
>>> when I looked, but address os::current_stack_pointer() is within an 
>>> #ifndef AMD64, so I suspect have we never built 32-bit with the later 
>>> VS2017 compiler…
>> Oh, you are right.  I mis-read that as #ifdef AMD64.
>>
>> Yeah, we (Oracle) don’t seem to be doing 32bit Windows builds 
>> anymore.  Presumably
>> nobody else is doing so with recent versions of VS and the JDK, else 
>> the problem would
>> have already been known (and probably dealt with).  Since I’m not a 
>> big fan of adding
>> untested code, I’m okay with just addressing this in jdk8u, and 
>> leaving the current code
>> alone until someone complains about it.
>>
>> Unfortunately, while this change looks okay to me, I’m not even a 
>> committer for jdk8,
>> so you still need a Reviewer.
>>
>>> More file context around the 8u suggestion below..
>>>
>>> Thanks
>>> Kevin
>>>
>>> src/os_cpu/windows_x86/vm/os_windows_x86.cpp
>>>
>>>     452
>>>     453  #ifndef AMD64
>>>     454  // Returns an estimate of the current stack pointer. Result 
>>> must be guaranteed
>>>     455  // to point into the calling threads stack, and be no lower 
>>> than the current
>>>     456  // stack pointer.
>>>     457  #if defined(_MSC_VER) && _MSC_VER >= 1900
>>>     458  // warning C4172: returning address of local variable or 
>>> temporary: dummy
>>>     459  #pragma warning( push )
>>>     460  #pragma warning( disable: 4172 )
>>>     461  #endif
>>>     462  address os::current_stack_pointer() {
>>>     463    int dummy;
>>>     464    address sp = (address)&dummy;
>>>     465    return sp;
>>>     466  }
>>>     467  #if defined(_MSC_VER) && _MSC_VER >= 1900
>>>     468  #pragma warning( pop )
>>>     469  #endif
>>>     470  #else
>>>     471  // Returns the current stack pointer. Accurate value needed for
>>>     472  // os::verify_stack_alignment().
>>>     473  address os::current_stack_pointer() {
>>>     474    typedef address get_sp_func();
>>>     475    get_sp_func* func = CAST_TO_FN_PTR(get_sp_func*,
>>>     476 StubRoutines::x86::get_previous_sp_entry());
>>>     477    return (*func)();
>>>     478  }
>>>     479  #endif
>>>     480
>>>
>>>
>>>
>>>
>>> On 06/07/2018 21:09, Kim Barrett wrote:
>>>>> On Jul 6, 2018, at 5:54 AM, Kevin Walls <kevin.walls at oracle.com> 
>>>>> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I'd like to get a review of this change for 8u:
>>>>>
>>>>> 8206454: [8u] os::current_stack_pointer() fails to compile on later 
>>>>> Windows compilers (warning C4172: returning address of local variable)
>>>>> https://bugs.openjdk.java.net/browse/JDK-8206454
>>>>>
>>>>> This is part of getting jdk8u to accept later Windows compilers. 
>>>>> Not changing the code, but adding a conditional  #pragma to let the 
>>>>> compiler accept the code.
>>>> Why is this only being done for jdk8u, and why isn’t it a problem in 
>>>> (say) jdk11 or jdk12?
>>>> The code being patched below is still the same.
>>>>
>>>>> I'll include a diff in text below (can do a webrev if anybody would 
>>>>> like one...).
>>>>>
>>>>> Many thanks!
>>>>> Kevin
>>>>>
>>>>>
>>>>> bash-4.2$ hg diff src/os_cpu/windows_x86/vm/os_windows_x86.cpp
>>>>> diff -r 5792d995ed26 src/os_cpu/windows_x86/vm/os_windows_x86.cpp
>>>>> --- a/src/os_cpu/windows_x86/vm/os_windows_x86.cpp      Wed Jun 27 
>>>>> 03:04:33 2018 -0700
>>>>> +++ b/src/os_cpu/windows_x86/vm/os_windows_x86.cpp      Fri Jul 06 
>>>>> 02:46:48 2018 -0700
>>>>> @@ -454,11 +454,19 @@
>>>>>   // Returns an estimate of the current stack pointer. Result must 
>>>>> be guaranteed
>>>>>   // to point into the calling threads stack, and be no lower than 
>>>>> the current
>>>>>   // stack pointer.
>>>>> +#if defined(_MSC_VER) && _MSC_VER >= 1900
>>>>> +// warning C4172: returning address of local variable or 
>>>>> temporary: dummy
>>>>> +#pragma warning( push )
>>>>> +#pragma warning( disable: 4172 )
>>>>> +#endif
>>>>>   address os::current_stack_pointer() {
>>>>>     int dummy;
>>>>>     address sp = (address)&dummy;
>>>>>     return sp;
>>>>>   }
>>>>> +#if defined(_MSC_VER) && _MSC_VER >= 1900
>>>>> +#pragma warning( pop )
>>>>> +#endif
>>>>>   #else
>>>>>   // Returns the current stack pointer. Accurate value needed for
>>>>>   // os::verify_stack_alignment().
>>
> 


More information about the hotspot-dev mailing list