[Lazarus] SIGSEGV on lclrescache.pas

Mattias Gaertner nc-gaertnma at netcologne.de
Mon Jun 17 12:35:18 CEST 2013


On Mon, 17 Jun 2013 12:17:58 +0200
Dave Coventry <dgcoventry at gmail.com> wrote:

> I have a unit in which I'm parsing a large text file.
> 
> I have around 50 (or more!) IF statements as below:
> 
> if Pos('  Center Point',OdReadstrings.Strings[i])>0 then
>                 val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Custom Scale',OdReadstrings.Strings[i])>0 then
>                 val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Check',OdReadstrings.Strings[i])=1 then
>                 val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Min Extents',OdReadstrings.Strings[i])>0 then
>                 val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos('  Max Extents',OdReadstrings.Strings[i])>0 then  etc, etc.
> 
> No error is generated from this code, per se, but on closing the programme
> there is an External SIGSEVV genterated in lclrescache.pas at line 186.
> 
> The offending line:
> 
> Cache.RemoveItem(Self);

I see no relationship to your code. Probably it is a side effect of a
destroyed heap.
Why do you think that the the above Ifs causes lclrescache to
crash?

 
> Can anyone see what's going on here? Alternatively, is there a better way
> of parsing a large text file for phrases?

Fetch the string only once:
s:=OdReadstrings.Strings[i]
if Pos('  Center Point',s)>0 then
...

Even faster:
Parse the line for tokens and use hash maps.

Mattias




More information about the Lazarus mailing list