It could be a bug.
Releasing the string, says put it on the list of storage to be garbage
collected. The garbage collection could be a long time after it's been
used, so the storage is still valid.   Or it could have been released, and
put on a list of available storage.  This storage was not reused, so the
data is still valid.
I had a problem where some code abended only when a debugger was used,
because GC came in and freed it before use.

On Mon, 7 Oct 2024 at 18:07, Eric Erickson <[email protected]> wrote:

> I have not done any serious JNI work in about 20+ years and it was on
> another platform (OS/2) rather than z/OS. But I've inherited some code and
> I noticed something that I don't think is right, but would like to get a
> confirmation from anyone with more experience. This is a code fragment as
> written.
>
>  /* --- Get the parm input, and convert to EBCDIC  ---- */
>
>  const char* msg=(*env)->GetStringUTFChars(env,jParm,0);
>
>  /*
>
>  **  Convert string to EBCDIC
>
>  */
>
>  __atoe((char*) msg);
>
>  /*
>
>  **  Release the passed string
>
>  */
>
>  (*env)->ReleaseStringUTFChars(env, jParm, msg);
>
>
>  /* --- Setup 1K Area to pass (leave space for NULL)    */
>
>  passarea = malloc(1024);           /* Get area        */
>
>  memset(passarea, 0, 1024);         /* Clear area      */
>
>  strcpy(passarea,msg);              /* Put parm in     */
>
> Based on what I've read about the GetStringxxxx and ReleaseStringxxx I
> believe that the ReleaseStringxxx should be placed AFTER the strcpy of the
> msg into the passarea. The documentation says to call the ReleastString
> once you are done using the string.
>
> That leads me to believe that the code fragment should look like the
> following.
>
> /* --- Get the parm input, and convert to EBCDIC  ---- */
>
>  const char* msg=(*env)->GetStringUTFChars(env,jParm,0);
>
>  /*
>
>  **  Convert string to EBCDIC
>
>  */
>
>  __atoe((char*) msg);
>
>
>  /* --- Setup 1K Area to pass (leave space for NULL)    */
>
>  passarea = malloc(1024);           /* Get area        */
>
>  memset(passarea, 0, 1024);         /* Clear area      */
>
>  strcpy(passarea,msg);              /* Put parm in     */
>
>  /*
>
>  **  Release the passed string
>
>  */
>
>  (*env)->ReleaseStringUTFChars(env, jParm, msg);
>
> I'm really surprised that this code does not abend or toss some kind of
> error, if the string is getting marked as released before we are done with
> it. I suppose it could be related to when the JVM actually runs the garbage
> collection that recovers the storage, but to my mind this is an error just
> waiting to happen.
>
> Am I right? If not can someone provide clarification as to why the
> original form is correct?
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to [email protected] with the message: INFO IBM-MAIN
>

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to