Can't find the bug

Bernd Müller bernd.mueller at ostfalia.de
Thu Jan 5 16:00:09 UTC 2023


Hi Manuel,

also many thanks to you. Helped me a lot.

Kind Regards,

Bernd

Am 04.01.23 um 11:22 schrieb Manuel Bleichenbacher:
> Hi Bernd
> 
> If a native functions returns a pointer (like strcat()), FFM has no idea how long the associated 
> data structure. So it returns a memory segment with length 0. So when getUtf8String() is called, it 
> will inevitably access memory outside the memory segment and you get the described exception.
> 
> In this special case, FFM could at least have known the total length of the allocated memory as it 
> was allocated by FFM in the first place. But usually the memory is allocated by the called method 
> (e.g. by strdup()).
> 
> To fix it, you have at least two options:
> 
> 1. Simply return buf.getUtf8String(0) as strcat() always returns the first parameter.
> 2. Create a new MemorySegment with the correct length like so:
> 
> var res = ((MemorySegment)strcat.invokeExact(buf, other));
> var seg = MemorySegment.ofAddress(res.address(), buf.length(), res.scope());
> return seg.getUtf8String(0);
> 
> This creates a new MemorySegment without allocating new memory. "buf", "res", and "seg" all point to 
> the same memory.
> 
> Note that "s1.length() + s2.length() + 1" isn't the correct way to calculate the required buffer 
> length. The buffer length needs to be specified in bytes, but s1.length() and s2.length() return the 
> length in UTF-16 code units.
> 
> Regards
> Manuel
> 
> 
> Am Mi., 4. Jan. 2023 um 08:53 Uhr schrieb Bernd Müller <bernd.mueller at ostfalia.de 
> <mailto:bernd.mueller at ostfalia.de>>:
> 
>     Dear Gavin,
> 
>     thank you very much for extracting the code.
>     Eventually, it would be much easier to do a "mvn test". To do so
>     please clone:
>     https://github.com/BerndMuller/ffm2 <https://github.com/BerndMuller/ffm2>
> 
>     Error still:
>     StdLibTest.foo:49->strcat:60 » IndexOutOfBounds Out of bound access on segment MemorySegment{
>     array:
>     Optional.empty address:139631472807584 limit: 0 }; new offset = 0; new length = 1
> 
>     looks for me like strcat changes the array size
> 
>     Kind Regards,
> 
>     Bernd
> 
>     Am 04.01.23 um 02:12 schrieb Gavin Ray:
>      > Maurizio, the code I was able to get out of the email is below:
>      >
>      > public class StdLibTest {
>      >
>      > private static MethodHandle strlen; // C's strlen() function
>      > private static MethodHandle strcat; // C's strcat() function
>      >
>      >      @BeforeAll
>      > public static void locateFunctions() {
>      > Linker linker = Linker.nativeLinker();
>      > strlen = linker.downcallHandle(linker.defaultLookup().find("strlen").get(),
>      > FunctionDescriptor.of(JAVA_LONG, ADDRESS));
>      > strcat = linker.downcallHandle(linker.defaultLookup().find("strcat").get(),
>      > FunctionDescriptor.of(ADDRESS, ADDRESS, ADDRESS));
>      >      }
>      >
>      >
>      >      @Test
>      > public void strlen() throws Throwable {
>      > try (Arena arena = Arena.openConfined()) {
>      > MemorySegment segment = arena.allocateUtf8String("Hello");
>      > int length = (int) (long) strlen.invoke(segment);
>      > Assertions.assertSame(5, length);
>      >          }
>      >      }
>      >
>      >      @Test
>      > public void foo() throws Throwable {
>      > String result = strcat("hello", "world");
>      >      }
>      >      /**
>      >       * This is a one to one copy of strcat test taken from  StdLibTest.java test from OpenJDK
>      >       */
>      > String strcat(String s1, String s2) throws Throwable {
>      > try (var arena = Arena.openConfined()) {
>      > MemorySegment buf = arena.allocate(s1.length() + s2.length() + 1);
>      > buf.setUtf8String(0, s1);
>      > MemorySegment other = arena.allocateUtf8String(s2);
>      > return ((MemorySegment)strcat.invokeExact(buf, other)).getUtf8String(0);
>      >          }
>      >      }
>      > }
>      >
>      > On Tue, Jan 3, 2023 at 12:55 PM Maurizio Cimadamore <maurizio.cimadamore at oracle.com
>     <mailto:maurizio.cimadamore at oracle.com>
>      > <mailto:maurizio.cimadamore at oracle.com <mailto:maurizio.cimadamore at oracle.com>>> wrote:
>      >
>      >     Hi Bernd,
>      >     this mailing list truncates attachments. If you want us to look at some
>      >     code you will have to paste it somewhere :-)
>      >
>      >     Cheers
>      >     Maurizio
>      >
>      >     On 03/01/2023 17:14, Bernd Müller wrote:
>      >      > Dear all,
>      >      >
>      >      > I try to train FFM. I even master quick sort but became desperate on
>      >      > strcon.
>      >      >
>      >      > Attached you will find a Maven project with the strcon test copied one
>      >      > to one from
>      >      > OpenJDK 20 sources.
>      >      >
>      >      > "mvn test" results in
>      >      >
>      >      > [ERROR] Errors:
>      >      > [ERROR]   StdLibTest.foo:49->strcat:60 » IndexOutOfBounds Out of bound
>      >      > access on segment MemorySegment{ array: Optional.empty
>      >      > address:139636573277136 limit: 0 }; new offset = 0; new length = 1
>      >      >
>      >      > I am running OpenJDK 64-Bit Server VM (build 20-ea+29-2280, mixed
>      >      > mode, sharing) on Fedora 36.
>      >      >
>      >      > Please, can someone help ?
>      >      >
>      >      > Kind Regards,
>      >      >
>      >      > Bernd
>      >      >
>      >
> 
> 
>     -- 
>     Prof. Dr. Bernd Müller
> 
>     Ostfalia
>     Hochschule für angewandte Wissenschaften
>     - Hochschule Braunschweig/Wolfenbüttel -
>     Fakultät Informatik
>     Salzdahlumer Straße 46/48
>     38302 Wolfenbüttel
> 
>     Tel  +49 5331 939 31160
>     Fax  +49 5331 939 31004
>     Web www.ostfalia.de <http://www.ostfalia.de> / www.pdbm.de <http://www.pdbm.de>
> 


-- 
Prof. Dr. Bernd Müller

Ostfalia
Hochschule für angewandte Wissenschaften
- Hochschule Braunschweig/Wolfenbüttel -
Fakultät Informatik
Salzdahlumer Straße 46/48
38302 Wolfenbüttel

Tel  +49 5331 939 31160
Fax  +49 5331 939 31004
Web  www.ostfalia.de / www.pdbm.de


More information about the panama-dev mailing list