Raymend Chen has probably forgotten more about programming than I'll ever know, but aren't the first two blah() function examples either missing a } or have a superfluous { after the else?
billforsternz 25 minutes ago [-]
Yes. And in the second one he has return c; when he meant return b;
Homer nods.
Onavo 1 hours ago [-]
Post COVID software engineer grads probably won't understand this comment.
camkego 52 minutes ago [-]
Why? Because of LLM vibe coding?
burner420042 39 minutes ago [-]
Instantly finding a missing semicolon or unbalanced parentheses on a screen of text.
Kids these days!
charleslmunger 33 minutes ago [-]
I had fun exploiting this to detect the falling convention used by some code at runtime - there were two different options depending on OS version; one passed a jnienv* as the first param, the other did not. So if I called it with 0, I could tell which was being used based on whether the first argument was NULL or not. Only used for specific architectures with a defined ABI that behaved this way, of course.
_kst_ 56 minutes ago [-]
It's not even possible to pass too few arguments to a function in C unless you go out of your way to write bad code.
You can write a function declaration that's inconsistent with its definition in another translation unit. Declaring the function in a shared header file avoids this.
You can use an old-style declaration that doesn't specify what parameters a function expects. Don't do that. Use prototypes.
You can use a cast to convert a function pointer to an incompatible type, and call through the resulting pointer. Don't do that.
You can call a function with no visible declaration if your compiler overly permissive or is operating in pre-C99 mode. Don't do that.
userbinator 33 minutes ago [-]
This is a site for intellectual curiosity, not pedantic dissmisal.
themafia 20 minutes ago [-]
You could also use inline assembly.
rurban 44 minutes ago [-]
Of which decade is this post? I cannot think of any modern architecture which still passes args on the stack.
Itanium? Stone age
LelouBil 42 minutes ago [-]
Interesting that some CPUs have a calling convention "built-in"
hyperhello 1 hours ago [-]
Do you really not ‘pass’ register parameters? How can anyone tell if you didn’t?
Polizeiposaune 56 minutes ago [-]
Read the post - not all architectures behave the same!
Itanic had variable-sized register windows, plus extra tag bits for NaT ("not a thing") placeholder values. If you didn't set one of the argument registers the callee might trap in unexpected ways when it touches the register garbage.
anitil 2 hours ago [-]
I had never considered the idea of passing too few register params so I didn't immediately think of the reuse problem. And I had no idea about Itanium's Not-a-thing bit! Always a good read from Raymond Chen.
9fwfj9r 47 minutes ago [-]
I regard this yet another unintuitive Itanium quirk that makes it failed.
marlburrow 9 minutes ago [-]
[flagged]
Rendered at 04:11:29 GMT+0000 (Coordinated Universal Time) with Vercel.
Homer nods.
Kids these days!
You can write a function declaration that's inconsistent with its definition in another translation unit. Declaring the function in a shared header file avoids this.
You can use an old-style declaration that doesn't specify what parameters a function expects. Don't do that. Use prototypes.
You can use a cast to convert a function pointer to an incompatible type, and call through the resulting pointer. Don't do that.
You can call a function with no visible declaration if your compiler overly permissive or is operating in pre-C99 mode. Don't do that.
Itanium? Stone age
Itanic had variable-sized register windows, plus extra tag bits for NaT ("not a thing") placeholder values. If you didn't set one of the argument registers the callee might trap in unexpected ways when it touches the register garbage.