[foreign-abi] RFR: 8237585: Dismantle ForeignUnsafe

Ty Young youngty1997 at gmail.com
Tue Feb 25 21:20:35 UTC 2020


On 2/25/20 11:50 AM, Maurizio Cimadamore wrote:
>
> On 25/02/2020 17:24, Paul Sandoz wrote:
>> Hi,
>>
>> I don’t think we should be referencing sun.misc.Unsafe in the 
>> documentation of a public API.  It should stand on its own presenting 
>> access to the unsafe address pair for double-register addressing.  
>> Any implication that this information can be consumed by 
>> sun.misc.Unsafe is coincidental :-)
>>
>> How is is the address pair intended to be used by the Java caller 
>> other than pumping the values into Unsafe methods?
>
> The address value is definitively useful for whenever you need to need 
> to break free of MemoryAddress and just get your hands on the raw 
> pointer value (a long) which you can then pass e.g. to some native 
> method. So, not just unsafe.get/putXYZ.
>
> I think the getBase is the one that is more suspicious, and the one 
> that is more linked to the unsafe addressing scheme. I think we could 
> probably just remove it and have a single method for turning a 
> MemoryAddress into a long raw address?


Please do. It's very odd that you can't get the raw long address of a 
MemoryAddress in the current API.


>
>
>>
>> Perhaps with inline types we could model this as an 
>> UnsafeMemoryAddress.  Is that possible to do now by appealing to a 
>> value-based property in the interim?
>> (Internally we don’t need to use that.)
>>
>>>>
>> This is for a longer discussion…. In past times we might have 
>> appealed to a security manager to perform such a permission check.  
>> In current times I think we are more talking about checks to safe 
>> guard the integrity of the program.  (Unwarranted System.exit calls 
>> might also fit into this approach.)
>
> Yep - and note that this is a step gap solution (**); in the long run, 
> we want to have a per-module launcher flag, so that restricted native 
> methods can be allowed on a per module basis. We'd also like to keep 
> track of whether a module made access to restricted methods and record 
> that property in some attribute of the module-info file, so that we 
> can fail early when loading the module graph if:
>
> 1) we are trying to load a module which 'requires native'
> 2) the correct 'allow native to module XYZ' flag is not passed to the 
> command line


No more launcher flags, please. IDEs will either take their sweet time 
to add support for them or might not provide support at all.


This is a project dependency issue and could be handled in module-info 
completely. You could add the ability to declare a module via its 
declaration(module org.foo) as unsafe and/or native and specify which 
package the unsafe and/or native access is from. Any method which uses 
Panama's API will then require an unsafe and/or native annoation which 
will in turn require the package being declared as unsafe and/or native 
in module-info.


(The "unsafe" annoation doesn't even need to be restricted to Panama, it 
could be used for other things too)


>
> Another thing we discussed in this area is as to whether JNI should or 
> not be covered by same treatment; in principle it should, given that 
> an application calling into a JNI native method can break safety in 
> many possible ways, and if your application depends on 200 jars it is 
> not obvious to understand if (or to protect against) any of them is 
> attempting to do something that you have not agreed upon. Yes, 
> security manager would be one way to do these things, but, as you 
> point out, we've been slowing moving to other approaches (and the 
> module system gives us more ammo to check these things, both at 
> compile- and run-time).
>
> (**) - the stop gap solution is needed because some of these 
> restricted methods are interesting and useful when working with 
> bindings, and it is kind of unfortunate that, by restricting access to 
> them by using a non-exported package, there's no way e.g. to get 
> javadoc info about these methods (which impacts API discoverability) - 
> and use of non-exported packages also severely limits adoption as IDEs 
> are not always smart to suggest the --add-export flags.
>
> Maurizio
>
>>
>> Paul.
>>
>>
>>> On Feb 25, 2020, at 7:09 AM, Jorn Vernee <jvernee at openjdk.java.net> 
>>> wrote:
>>>
>>> Removes ForeignUnsafe, moves `getUnsafeBase` and `getUnsafeAccess` 
>>> to `MemoryAddress`, and moves `ofNativeUnchecked` to `MemorySegment`.
>>>
>>> I've added a warning about the safety of these methods to the javadoc.
>>>
>>> Use of the methods is guarded by a check against a system property, 
>>> `jdk.incubator.foreign.permitUnsafeInterop` for the first 2, and 
>>> `jdk.incubator.foreign.permitUncheckedSegments` for the latter. This 
>>> needs to be set to `true` when running an application, or otherwise 
>>> the use of these methods results in an `IllegalAccessError` being 
>>> thrown.
>>>
>>> I've updated the test accordingly, and also remove the FASTPATH 
>>> option from the SysV ABI implementation, since it was not actually 
>>> being used, but still causing the tests to be run multiple times.
>>>
>>> -------------
>>>
>>> Commits:
>>> - 5c58877a: Slightly touch up javadoc
>>> - 6abdd478: Remove ForeignUnsafe.java, and move it's method to 
>>> MemoryAddress and MemorySegment
>>>
>>> Changes: https://git.openjdk.java.net/panama-foreign/pull/31/files
>>> Webrev: https://webrevs.openjdk.java.net/panama-foreign/31/webrev.00
>>>   Issue: https://bugs.openjdk.java.net/browse/JDK-8237585
>>>   Stats: 176 lines in 10 files changed: 78 ins; 91 del; 7 mod
>>>   Patch: https://git.openjdk.java.net/panama-foreign/pull/31.diff
>>>   Fetch: git fetch https://git.openjdk.java.net/panama-foreign 
>>> pull/31/head:pull/31
>>>
>>> PR: https://git.openjdk.java.net/panama-foreign/pull/31


More information about the panama-dev mailing list