[fpc-devel] Valgrind strscan

petr.kristan at epos.cz petr.kristan at epos.cz
Thu Apr 10 14:50:07 CEST 2008


In the morning I was hunting valgrind "Invalid read of size 4" in my
code and finally I found it. Example:

program str;
  p: PChar;
  GetMem(p, 1);
  p^ := #0;
  StrScan(p, 'x');

==14379== Invalid read of size 4
==14379==    at 0x80708F0: SYSUTILS_STRSCAN$PCHAR$CHAR$$PCHAR (strings.inc:439)
==14379==    by 0x804828A: main (str.pas:9)
==14379==  Address 0x416A494 is 4 bytes inside a block of size 5 alloc'd
==14379==    at 0x401D38B: malloc (vg_replace_malloc.c:149)
==14379==    by 0x8063398: CMEM_CGETMEM$LONGWORD$$POINTER (cmem.pp:50)
==14379==    by 0x805AFA6: SYSTEM_GETMEM$POINTER$LONGWORD (heap.inc:235)
==14379==    by 0x8048276: main (str.pas:7)

Problem is in assembler code for i386. rtl/i386/strings.inc.
This routine reads always 4 bytes alligned by 4 regardless string length.

function strscan(p : pchar;c : char) : pchar;assembler;
// load new 4 bytes
        movl     (%edi),%edx   <-here valgrind report Invalid read 

Problem was discovered aleady here http://bugs.freepascal.org/view.php?id=6314

My assembler knowledge is unfortunately not so good yet to effectively repair it.
Besides routine is very sophisticated. :)
But I think that solving this cosmetic error will save many developers
hours during valgrind code checking. And preparing testcases fo fpc


Ing. Petr Kristan
EPOS PRO s.r.o., Bozeny Nemcove 2625, 530 02 Pardubice
tel: +420 466335223    Czech Republic (Eastern Europe) 
fax: +420 466510709

More information about the fpc-devel mailing list