When my program is disassembled in gdb, I can see the address of buf be pushed onto the stack, but I don’t see the format string pushed onto it. Any reason why this is? Is it a clever compiler optimization?
I’ve tried compiling a few different variations of printf statements to see if I could mimic the “%s” string (or address of it) not being pushed onto the stack, but I couldn’t do it.
This is the program code:
int main(int argc, char **argv) {
char buf[128];
if(argc < 2) return 1;
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
compiled with gcc 4.5.2, 32 bit linux
Yes, it appears that gcc will throw away “printf (“%s\n”, buff)” and substitute “puts()” in its place: