char[] annoyance...

Regan Heath regan at netwin.co.nz
Sun Apr 9 17:23:06 PDT 2006


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?

Regan



More information about the Digitalmars-d mailing list