Am 03.07.2018 um 22:57 schrieb Ondrej Pokorny:
On 03.07.2018 22:08, Florian Klämpfl wrote:
Am 03.07.2018 um 21:30 schrieb Ondrej Pokorny:
On 03.07.2018 20:54, Florian Klämpfl wrote:
program Project1;
type
   TMyArray = array[0..10] of Integer;
   procedure Init2(var A: TMyArray);
   begin
     A[2] := 1;
   end;
var
   A: TMyArray;
begin
   Init2(A);
end.

should not emit the warning because A is not being read in Init2.

(please note it throws only a hint in this case as A *is* initialized as it is 
a global variable).

FPC has no global data flow analysis (and I do not plan to do so yet), so this 
is warning is currently far out of reach.

Doing it for SetLength/FillChar would be a good start.

For me: Too much effort for very little gain. Global data flow analysis in general is really a difficult topic and its advantages are oversee-able imo.



IMPORTANT: the compiler knows that SetLength and FillChar don't read/use the data so no warning is appropriate there.

SetLength does somehow :), as the examples showed.

Not really. It keeps the "read/used" data within the variable - the possibly uninitialized data is not written or used outside the variable itself.

?



What you achieved with SetLength and FillChar emitting a warning is that you made the compiler more stupid instead of making it more clever.

The compiler has not to be clever, it has to follow rules. And the rules which need to be followed is the meaning of the var parameter. It means: data in/data out.

It's hard to argue like this with all the different hints/warnings/notes being emitted on the notification side and different optimizations being done on the compiler side. To me it looks more like this: "the compiler may be clever only when we want it to be".

---

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.

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to