RFR(XS) 8191852: Null pointer dereference in ciKlass::get_Klass of ciKlass.hpp:58

dean.long at oracle.com dean.long at oracle.com
Fri Dec 22 01:59:49 UTC 2017


New webrev:

http://cr.openjdk.java.net/~dlong/8191852/webrev.2

My experiment to simplify get_instance_klass() and friends failed. 
Parfait failed to identify possible null dereferences, even new ones 
that I introduced as a test, so went with the minimal fix instead. It 
only addresses the following error:

Error: Null pointer dereference
    Null pointer dereference [null-pointer-deref] (CWE 476):
       Read from null pointer ((ciMetadata*)this)
         at line 58 of src/hotspot/share/ci/ciKlass.hpp in function 
'ciKlass::get_Klass'.
           Null pointer introduced at line 207 of 
src/hotspot/share/ci/ciEnv.hpp in function 'ciEnv::get_instance_klass'.
           Constant 'NULL' passed into function ciKlass::get_Klass, 
argument this, from call at line 240 of src/hotspot/share/ci/ciField.cpp 
in function 'ciField::initialize_from'.
           Function ciEnv::get_instance_klass may return constant 'NULL' 
at line 207, called at line 237.

dl


On 12/13/17 4:20 PM, Vladimir Kozlov wrote:
> On 12/13/17 3:09 PM, dean.long at oracle.com wrote:
>> On 12/13/17 1:08 PM, Vladimir Kozlov wrote:
>>
>>> On 12/13/17 12:45 PM, dean.long at oracle.com wrote:
>>>> https://bugs.openjdk.java.net/browse/JDK-8191852
>>>> http://cr.openjdk.java.net/~dlong/8191852/webrev/
>>>>
>>>> Our static analysis tool was complaining about a possible null 
>>>> pointer dereference in ciKlass::get_Klass(), because of this code:
>>>>
>>>> 237.      _holder = 
>>>> CURRENT_ENV->get_instance_klass(fd->field_holder());
>>>> [...]
>>>> 240.      Klass* k = _holder->get_Klass();
>>>>
>>>> so I added NULL checks in get_instance_klass and a few other 
>>>> similar functions.
>>>
>>> No, you don't ;)
>>
>> Yes, you're right.  Sorry about that :-)
>>
>>> You replaced NULL checks which return NULL with asserts. It is not 
>>> the same. Are you sure that in all those cases we will not get NULL?
>>
>> It didn't show up in my testing.  But what I could try is to remove 
>> the asserts and rerun the static analysis.  Then get_instance_klass() 
>> would be:
>>
>>    ciInstanceKlass* get_instance_klass(Klass* o) {
>>      return get_metadata(o)->as_instance_klass();
>>    }
>>
>> In the first example above, static analysis would need to verify that 
>> fd->field_holder() can never return NULL.  If that sounds reasonable, 
>> I'll rerun the static analysis.
>
> Yes, it is reasonable.
>
> Thanks,
> Vladimir
>
>>
>> dl
>>
>>>
>>> Thanks,
>>> Vladimir
>>>
>>>>
>>>> dl
>>



More information about the hotspot-compiler-dev mailing list