Mail Archives: djgpp/2004/07/27/09:08:02
> and that should be reason enough for a good compiler to issue a runtime
> warning at this point.
There are some gcc-extension projects that do that, but they're not
part of the official gcc. Why? Because (1) they slow down program
execution, and (2) the C language doesn't make it easy to do bounds
checking reliably.
If you're interested, search the gcc.gnu.org site for "bounds checking
gcc" or something to that effect. It's one of the development
projects.
> > "One of the most coimmon and troublesome errors in C programming
> > occurs when an index value goes out of range for an array - that
> > is, when an index value is less than zero or greater than the size
> > of the array minus one."
>
> if it's such a common error, then why is there apparantly no utility yet
> to convert .c sources into other .c sources which test the array bounds ?
> Can't be so difficult to write such a program.
It's the C language that makes it difficult to get this right. Consider
passing an array as a pointer to a function:
int a[5];
foo(a);
Now, the function has a pointer... but to what? It doesn't have any
bounds information.
> 3rd time in a few days that I hear this ;-)
> C gives me enough rope to hang myself _by accident_ .I'd wish it were
> safer to use C.
Use C++ with class-based lists instead, then you can add all sorts of
safety stuff. Or use Pascal.
> how far am I allowed to go back, before gcc will crash ?
> I tried : int main(){i=9;m1:printf("%i ",i);c=R[i];i++;goto m1;}
> i goes up to about 150000 and down to about -12000 before it crashes
Reading outside an array is far less dangerous that writing outside an
array. You have to get to the extents of your memory region before
you have problems.
> So what is written by the compiler into the area directly
> before the data-area ?
If it's a local array, it's on the stack, so just before the array is
the "top" of your stack - other variables, locals, etc. Go far enough
and you run into your static data. Just after the array is your
function call frame - return address, etc. Write to those and you're
toast.
> >int U[99]; memset(U, 4, sizeof(U));
> >memset fills the memory locations used by U with the value 4.
No, it sets it to 0x04040404.
> I prefer: for(i=0;i<99;i++)U[i]=4;
memset is a lot faster if you want to set it to zero, though.
- Raw text -