On Tue, 22 Mar 2016, David Jenkins wrote:



On 3/22/16 2:01 AM, Michael Van Canneyt wrote:
But you agree that if Find is called on an unsorted list, bogus data will
be returned ? Or, worse, an never-ending loop may occur ?
In short, as you say, an "error condition" can ensue without you knowing it.

That is a bug. So, in my opinion (and of some others), Find is implemented buggy in Delphi.

Consider the buggyness a given in what follows.

If we consider something a bug in Delphi, we do not copy the bug.

You happen to rely on this buggy behaviour. This is of course unfortunate.

I attempted to fix this bug using a not too invasive method.
Originally I simply wanted to raise an exception, but that was deemed too
invasive.

There are now several options:
1. I change the code to raise an exception instead (as was my original plan)
2. I change the code to resort to a linear search if sorted is false.
3. I introduce a boolean property that determines whether Find does any check.
   By default the check will be done, to warn people they're doing
something stupid. If they override the check, we can assume they know what
   they are doing.
4. Combine 1 and 3.

Or,

5. You override sort so it does nothing. It is virtual.
You can then set sorted to True, no sort will occur, and find will do it's job.

6. You use another TStringList where you change find to suit your needs.
All it takes for you is to copy the implementation, you can keep the same name, and insert the unit after the classes unit in places where you need it.

It's your call which of the 5 methods is used.

But one thing is sure: we're not reverting the behaviour back to the buggy behaviour.

Michael.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
#1 is what Zoe Peterson (my coworker) has suggested as well. Without that exception (as the code now is) there is no warning issued just an ambiguous return of False. Which means that the code is still buggy as the user could assume that the Index value points to next insert spot and instead it is out of range and causes a crash. Setting Index value to -1 would be a better indicator of bad usage than just returning False (with raising an exception still being the best warning).

Keep in mind though that being able to call find on a manually sorted list (Sorted <> true) is not buggy behavior (this is the Delphi compatibility that we are interested in maintaining).

Here we disagree.
It IS buggy behavior. Delphi is not sacrosanct, it does contain bugs like
any software. This is one of them.

(*
  This is not idle talk:
  I'm trying to report 2 serious bugs in Delphi Seattle, only to find that the
  bugtracker (ironically called quality :) ) is not working :/

  Well, it can happen to anyone, I guess.
*)

That aside: I will probably go for 1 or 4.

Michael.

PS. And if you allow me to express wonder:
Given that you are apparently the maker of beyond compare, I'm doubly surprised to see you use an all-purpose container class
as TStringlist, instead of writing your own...

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

Reply via email to