Prevent optimization of zero-ed memory.
Code:
#include <stdio.h>
#include <string.h>
#define BUFFLENGTH 100
int main() {
char buffer[BUFFLENGTH+1];
memset(buffer,0,BUFFLENGTH+1);
fgets(buffer,BUFFLENGTH,stdin);
buffer[strcspn(buffer,"\n")] = 0;
printf("%s.\n",buffer);
return 0;
}
This snippet of code should demonstrate my problem. GCC's optimization level of 0 will make this perform as expected: that is, any trailing newlines get removed. But at any higher optimization levels, GCC seems to decide that the assignment to zero is unnecessary, and vanishes it away.
I can, of course, make "buffer" a volatile char array, but in my real code (this is just a simplified version for clarity), GCC complains with a warning whenever I try to use "buffer" for anything else; e.g. passing it to a function, unless I re-cast it to a char * or const char *. I know of no reason why I shouldn't cast like this (to my understanding, a volatile char is the same size as a char, just treated differently by the compiler), but doing this for each invocation of "buffer" seems both annoying and ugly.
Is there any other way I can hint to GCC not to optimize this specific statement?