char[] annoyance...

Derek Parnell derek at psych.ward
Sun Apr 9 18:58:09 PDT 2006


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...
  }



-- 
Derek
(skype: derek.j.parnell)
Melbourne, Australia
"Down with mediocracy!"
10/04/2006 11:54:09 AM



More information about the Digitalmars-d mailing list