[fpc-devel] Wrong docs: not initialized global variables
Thorsten Engler
thorsten.engler at gmx.net
Wed Jul 4 06:18:08 CEST 2018
> > Probably I am the only one who thinks that the code below is
> ridiculous...
> >
> > procedure TExternalAssemblerOutputFile.AsmWriteFiltered(p:
> pchar;
> > len: longint);
> > var
> > s: ansistring;
> > begin
> > MaybeAddLinePrefix;
> > s:=''; // <<< ????
> > setlength(s,len);
> > move(p^,s[1],len);
> > AsmWriteAnsiStringUnfiltered(decorator.LineFilter(s));
> > end;
> >
> > ---
> >
> > I have split feelings: I really like to get the warning/hint at
> places
> > where it makes sense so I don't want to disable it globally. But
> the
> > amount of false positives increased significantly :/
>
> The compiler is ~400k lines and I had to fix maybe 40 locations, so I
> wouldn't call this significantly and there are situations where it
> matters, see the result case.
To get a well defined string of a specific length in a single statement:
s := StringOfChar(#0, len);
I'm not sure if SetLength is a special case in the compiler (like it is in Delphi) or just a plain function call that's normally resolved, but if it is a special case:
To get rid of unnecessary warnings for SetLength(x, 0) maybe the compiler could rewrite that into x := nil early on? That should also improve performance.
In fact, instead of generating the warning the compiler may even be able to just rewrite non-zero length calls into that StringOfChar statement.
More information about the fpc-devel
mailing list