[foreign] RFR 8217414: Remove bounds check in BoundedPointer constructor

Jorn Vernee jbvernee at xs4all.nl
Mon Jan 21 15:27:09 UTC 2019


Maurizio Cimadamore schreef op 2019-01-21 16:15:
> On 21/01/2019 14:29, Jorn Vernee wrote:
>> Updated webrev: 
>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217414/webrev.01
>> 
>> I ended up not adding the check for Callbacks since AFAICT there is 
>> currently no public API to create a Callback with an OOB pointer. 
>> Should I add the check any ways?
> 
> That's fine, but I'm pretty sure that the added test will fail with
> the direct invoker.

Ah OK, I guess the direct invoker just side-steps LayoutTypes altogether 
(I have not spent that much time with that code).

> You might want to tweak this method in DirectSignatureShuffler:
> 
> private static long pointerToLong(Pointer<?> value) throws
> IllegalAccessException {
>         return value.addr();
>     }
> 
> Another option, would be to always throw when somebody calls addr()
> and the pointer is out of bounds - this could actually be a better
> solution (which would also subsume the changes in
> References.OfPointer) ?

We need to be able to retrieve the address as part of 
BoundedPointer::equals, which is needed to make the iterate code work, 
so doing the check in `addr()` would still be too early.

I'll have a look at the direct invoker.

Jorn

> Maurizio
> 
>> 
>> Jorn
>> 
>> Jorn Vernee schreef op 2019-01-21 14:54:
>>> Ok, I see your point. Plus, if a user finds the API too restrictive
>>> they could always fall back on native allocation APIs like malloc &
>>> free, or possibly custom LayoutTypes when those are introduced.
>>> 
>>> I think it will be sufficient to move the check to
>>> `References.OfPointer` and `References.OfCallback`. But I will add
>>> some tests to make sure as well.
>>> 
>>> Jorn
>>> 
>>> Maurizio Cimadamore schreef op 2019-01-21 14:42:
>>>> On 21/01/2019 13:12, Jorn Vernee wrote:
>>>>> There is a `checkAlive()` that gets called when a pointer is 
>>>>> unboxed [1], I thought you were talking about that check. But, I 
>>>>> don't think we should do a bounds check before passing a pointer to 
>>>>> native code. The "one past the end of a container" pointer idiom is 
>>>>> common and some APIs might expect to be passed such a pointer. It 
>>>>> seems too restrictive to require that pointers passed to native 
>>>>> code have to be in bounds (tbh I have my doubts about the 
>>>>> liveliness check as well).
>>>> 
>>>> The whole point of the Panama API is to provide enriched safety. 
>>>> Now,
>>>> if users want to opt out of that, we might (in the future) provide
>>>> knobs to do so, but I see no point for passing a pointer that is not
>>>> alive around (given it is known to contain garbage). Similarly, I 
>>>> see
>>>> very little point in passing a pointer that is out of bounds - 
>>>> granted
>>>> there might be few use cases for that (e.g. pass a 'limit' pointer 
>>>> to
>>>> a library), but I'd prefer to stick with stricter semantics and 
>>>> loosen
>>>> that up on a use case by use case basis.
>>>> 
>>>> I think the main point of this patch should be to _delay_ the check
>>>> that is currently done on the constructor, not to remove it
>>>> completely. It is ok if some piece of code temporarily produces an 
>>>> out
>>>> of bound pointers (e.g. when iterating), but I think we should limit
>>>> the exposure of that weird pointer to the rest of the machinery.
>>>> 
>>>> Maurizio
>>>> 
>>>>> 
>>>>> Jorn
>>>>> 
>>>>> [1] : 
>>>>> http://hg.openjdk.java.net/panama/dev/file/tip/src/java.base/share/classes/jdk/internal/foreign/memory/BoundedPointer.java#l75
>>>>> 
>>>>> Maurizio Cimadamore schreef op 2019-01-21 13:56:
>>>>>> I agree that the check should removed from the constructor - but 
>>>>>> we
>>>>>> should make sure that checks happen when the pointer is used.
>>>>>> Dereference is one situation, function call is another. I guess
>>>>>> dereference is already covered (after all, a memory read will fail 
>>>>>> if
>>>>>> outside the boundaries), but I don't think passing an out of bound
>>>>>> pointer to a function is currently being checked, and it should if 
>>>>>> we
>>>>>> remove the constructor eager check
>>>>>> 
>>>>>> Maurizio
>>>>>> 
>>>>>> On 21/01/2019 12:00, Jorn Vernee wrote:
>>>>>>> Hi,
>>>>>>> 
>>>>>>> I have a patch addressing 2 vacuously passing tests 
>>>>>>> (api/PointerTest and api/ArrayTest). The patch fixes the tests, 
>>>>>>> and to make that happen removes the bounds check in 
>>>>>>> BoundedPointer's constructor. As discussed offline; this check is 
>>>>>>> not needed since we already de a check when dereferencing a 
>>>>>>> pointer in BoundedMemoryRegion, and the check in the constructor 
>>>>>>> is overly restrictive since it should be fine to create 
>>>>>>> out-of-bounds pointers as long as it is not dereferenced. This 
>>>>>>> does mean the tests needed to be tweaked since now an access 
>>>>>>> exception is throw at a later point.
>>>>>>> 
>>>>>>> Please review the following.
>>>>>>> 
>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8217414
>>>>>>> Webrev: 
>>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217414/webrev.00
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Jorn


More information about the panama-dev mailing list