"Huh. I'm pretty sure Rust would have picked me up on that bug."
Here's an example. I accidentally wrote this:
while (getLine(pc, buffer, sizeof(buffer) > 0))
Which compiles fine. Stricter languages could detect this bug."Huh. I'm pretty sure Rust would have picked me up on that bug."
Here's an example. I accidentally wrote this:
while (getLine(pc, buffer, sizeof(buffer) > 0))
Which compiles fine. Stricter languages could detect this bug.Of course warnings work until you have source from something external that throws lots of warnings that you can't reliably turn off (possibly due to completely broken and ignored warning bugs in ICC for example).
The second one could only arise with unsafe pointers in Rust, as safe code uses slices, combining the base pointer and the element count in a single value.
OTOH the point here is to pass a preallocated but "uninitialised" buffer to the callee, which Rust wouldn't allow with slices, unless you created a slice from a raw allocation (I don't know if that's defined behaviour, though I guess you could do that safely by passing in a Write rather than the slice itself, but then you're Write-ing to a slice which has… interesting behaviour)
#include <stdio.h>
static char buffer[80];
static char *bufferp=buffer;
int main(int argc, char *argv[] )
{
char localbuffer[80];
char *localbufferp=localbuffer;
printf("buffer: %ld\n",sizeof buffer);
printf("bufferp: %ld\n",sizeof bufferp);
printf("localbuffer: %ld\n",sizeof localbuffer);
printf("localbufferp: %ld\n",sizeof localbufferp);
}
Output: marcel@sarek[tmp]./a.out
buffer: 80
bufferp: 8
localbuffer: 80
localbufferp: 8
As you can see, it depends entirely on whether you give sizeof the array or the pointer.