char[] annoyance...

Bruno Medeiros brunodomedeirosATgmail at SPAM.com
Mon Apr 10 05:59:20 PDT 2006


Derek Parnell wrote:
> On Mon, 10 Apr 2006 14:04:35 +1200, Regan Heath wrote:
> 
>> On Mon, 10 Apr 2006 11:58:09 +1000, Derek Parnell <derek at psych.ward> wrote:
>>> On Mon, 10 Apr 2006 12:23:06 +1200, Regan Heath wrote:
>>>
>>>> Take this code:
>>>>
>>>> void main()
>>>> {
>>>> 	//..open a file, read line for line, on each line:
>>>>
>>>> 	for(int i = 0; i < line.length-2; i++) {
>>>> 		if (line[i..i+2] != "||") continue;
>>>> 		//..etc..
>>>> 	}
>>>> }
>>>>
>>>> There is a subtle bug. On all lines with a length of 0 or 1 it will give
>>>> the following error:
>>>>
>>>> Error: ArrayBoundsError line_length.d(6)
>>>>
>>>> The problem is of course the statement "i < line.length-2". line.length  
>>>> is
>>>> unsigned, and when you - 2 from an unsigned value.. well lets just say
>>>> that it's bigger than the actual length of the line - 2.
>>>>
>>>> Of course there are plently of other ways to code this, perhaps using
>>>> foreach, but that's not the point. The point is that this code  _can_ be
>>>> written and on the surface looks fine. Not even -w (warnings) spots the
>>>> signed/unsigned problem. At the very least can we get a warning for  
>>>> this?
>>> I too have tripped up on this 'bug' and it is very annoying and  
>>> surprising.
>>>
>>> However your approach to the problem might need to change...as you state  
>>> -
>>> "On all lines with a length of 0 or 1 it will give the following  
>>> error..."
>>> - and this is because the test that you are performing is only applicable
>>> to lines with two or more characters in them ... so make that condition a
>>> part of the algorithm ...
>>>
>>>   if (line.length >= 2) {
>>>     for(int i = 0; i < line.length-2; i++) {
>>>       if (line[i..i+2] != "||") continue;
>>>       //..etc..
>>>     }
>>>   }
>>>   else {
>>>      // do something for short lines...
>>>   }
>> Thanks Derek, that's exactly what I did.
> 
> Of course; that was obvious. No put-down was implied ;-)
>  
>> The point of this post isn't to get help with one specific problem but  
>> rather to ask whether there is a solution to the underlying problem  
>> behaviour. I suspect this behaviour will be the source of many bugs to  
>> come and I wonder if there is a way to avoid them.
> 
> The point of my reply was that the "solution to the underlying problem
> behaviour" is to properly express (and thus document) the algorithm rather
> than rely on side-effects of the implemented language.
> 
> In this case, as an example of such algorithm documentation, if one
> explicitly states that the search only applies to lines of two or more
> characters, it helps the reader of the code understand your intentions.
> Without that, the code phrase (i < line.length-2) might not trigger the
> reader's thoughts about handling short lines.
> 

I agree with Regan in that the code is "conceptually" well-expressed, it 
is instead a nasty and unexpected language shortcoming that results in 
the bug. I, however, at the moment see no good way to solve this 
language shortcoming, and there may not even be one. :-(

(Also: "char[] annoyance..." is an unfit thread title.)

-- 
Bruno Medeiros - CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list