* * * * *
“Yeah, integers, pointers. Whatever it takes.”
A request change for a component I wasn't even aware we were using for
“Project: Wolowizard [1]” came across my desk a few days ago. I managed to
locate the codebase and the project build for this component and I was going
through the code to enact the changes. It's a third party piece of code to
which we have the source code (it's an open source component) and as I'm
going through it, I find the following wonderful bit of code:
> static void run_smppbox(void *arg)
> {
> int fd;
> Boxc *newconn;
> long sender;
>
> fd = (int)arg;
> newconn = accept_smpp(fd, 0);
> /* ... */
> }
>
> static void wait_for_connections(int fd, void (*function) (void *arg),
> List *waited)
> {
> /* ... */
> gwthread_create(function, (void *)fd);
> /* ... */
> }
>
> static void smppboxc_run(void *arg)
> {
> int fd;
> int port;
>
> port = (int)arg;
>
> /* ... */
> wait_for_connections(fd, run_smppbox, NULL);
> /* ... */
> }
>
> static long smppbox_port;
>
> int main(int argc,char **argv[])
> {
> /* .. */
> smppboxc_run((void *)smppbox_port);
> /* ... */
> }
>
Why yes, let's cast a long integer into a void pointer (of course that's okay
because a long integer is the same as a void pointer, right?) then cast that
pointer into an integer (because, of course, an integer is the same as a void
pointer) and then do it again, only this time an integer to a void pointer to
an integer.
It's kosher.
Especially on a 64-bit system!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!
More amazingly, the compiler (GCC (GNU's Not Unix Compiler Collection) [2] in
this case) gave dire warnings about this—even though the makefile (which
compiles everything) didn't even specify any compiler warnings! Yeah, it's
considered that bad.
Sigh.
It's crap like this that gives C a bad name.
[1]
gopher://gopher.conman.org/0Phlog:2010/10/11.1
[2]
https://gcc.gnu.org/
Email author at
[email protected]