3 ms·
I think what's going on here is that the local variables in a function are directly adjacent in memory to the arguments, so if it wasn't declared to have that m
by enf 17y ago
I think what's going on here is that the local variables in a function are directly adjacent in memory to the arguments, so if it wasn't declared to have that many arguments, the local variables would start at the same location in memory as the first undeclared argument and the undeclared arguments would get clobbered.
- philwelch 17y agoAs it is now, you push all your function arguments to the stack before you push your locals. If you call printf(a1, a2, ... , an), it pushes n arguments, then the instruction pointer, then your locals. No clobbering necessary. Maybe 1972-era C pushed arguments to the stack according to the signature defined in the function definition rather than the function call? (i.e. printf would have 10 pushes no matter how many arguments you actually passed to it). If it pushed according to the function signature, you'd waste memory and have a hard limit to how many arguments you could pass. And you'd waste push instructions. So I don't know why it's written the way it is, but corrupting your locals doesn't seem like a likely explanation. Maybe they're trying to mollify the compiler?
- abecedarius 17y ago1970s C did not have prototypes.
- philwelch 17y agoI meant the function signature as defined in the function definition. Hmm I'll fix that.
- abecedarius 17y agoI think the x2,...x9 were declared just as "documentation". Really early C didn't have any types that would get passed as anything but a single word on the stack, IIRC. (as I was going to add before getting noprocrast-blocked)
- philwelch 17y agoHa, so it doesn't matter how the function is defined! You can call any function with any arguments you want, just shove 'em on the stack and see what happens. And people say ANSI C is too unsafe ;)