Wednesday, Debtember 16, 2015
“Yeah, integers, pointers. Whatever it takes.”
A request change for a component I wasn't even aware we were using for “Project: Wolowizard” 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 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.