RFR (XS) JNI Specification Issue: JDK-6681965 Strings and NULL termination

David Holmes david.holmes at oracle.com
Thu May 15 04:20:17 UTC 2014


Hi David,

This clarification seems fine to me.

Thanks,
David H.

On 14/05/2014 6:46 PM, David Simms wrote:
> Bug/Enhancement: https://bugs.openjdk.java.net/browse/JDK-6681965
> Web review: http://cr.openjdk.java.net/~dsimms/jnispec/6681965/
> HTML version:
> http://cr.openjdk.java.net/~dsimms/jnispec/6681965/JDK-6681965.html
>
> There are number of mail threads asking for clarification surrounding
> string operations, and whether the results should be NULL terminated.
> Functions affected:
>
>   * const jchar * *GetStringChars*(JNIEnv *env, jstring string, jboolean
>     *isCopy);
>   * const char * *GetStringUTFChars*(JNIEnv *env, jstring string,
>     jboolean *isCopy);
>   * void *GetStringRegion*(JNIEnv *env, jstring str, jsize start, jsize
>     len, jchar *buf);
>   * void *GetStringUTFRegion*(JNIEnv *env, jstring str, jsize start,
>     jsize len, char *buf);
>   * const jchar * *GetStringCritical*(JNIEnv *env, jstring string,
>     jboolean *isCopy);
>
> There are two stories here, how the particular JVM implements Java
> Strings internally, and the JNI Specification. I believe these two
> things are separate:
>
>   *  From a HotSpot JVM perspective, null-terminating strings might be
>     seen as "safety first".
>   * There may be other JVM implementations whom, for argument sake, that
>     never garbage collect and always use direct heap pointers. Such
>     implementations have no reason to null-terminate...
>   * ...indeed HotSpot's "GetStringCritical()" implementation does no
>     such thing.
>
> Currently the JNI Specification does not mention null-termination, and
> given we are not dealing with c-strings, but Java Strings, that is
> because it's not required.
>
> "GetStringUTFRegion()" as currently implemented by HotSpot has an issue,
> it is possible to null-terminate past the user specified length (which
> in itself a bit of an issue, its related to the input, not output, being
> UTF-16 length != UT8 encoded length).
>
> I'm not advocating removing the current null-termination where HotSpot
> supplies the buffers. In fact I'm worried will break too much existing
> code. There is no harm in null-termination where the JVM has control
> over the buffer.
>
> Clarify NULL-termination, or rather lack of, for string operations.
> Additional text at the beginning of the "String Operations" section:
>
> ----------------------------------------------------------------------
> String Operations
>
> This specification makes no assumptions on how a JVM represents Java
> strings internally. Strings returned from these operations:
>
>   * GetStringChars()
>   * GetStringUTFChars()
>   * GetStringRegion()
>   * GetStringUTFRegion()
>   * GetStringCritical()
>
> are therefore not required to be NULL terminated. Programmers are
> expected to determine buffer capacity requirements
> via"|GetStringLength()|
> <imap://david%2Esimms@mail.oracle.com:993/fetch%3EUID%3E/jvm_runtime_grp%40oracle.com%3E1521?part=1.2.2&filename=JNI%20Specification%20Issue:%20JDK-6681965%20Strings%20and%20NULL%20termination.html>"
> or "|GetStringUTFLength()|
> <imap://david%2Esimms@mail.oracle.com:993/fetch%3EUID%3E/jvm_runtime_grp%40oracle.com%3E1521?part=1.2.3&filename=JNI%20Specification%20Issue:%20JDK-6681965%20Strings%20and%20NULL%20termination.html>".
>
>
> ----------------------------------------------------------------------
>
> /David Simms


More information about the hotspot-dev mailing list