So… Just now, all of a sudden, my game wouldn’t run anymore. I though it was weird, since I shouldn’t have modified anything that would make things explode at random times… Well, since gdb wasn’t helping a lot, I tried to see how much free memory I still had… Just… look at the print screen:

gfm_ld33_0003

125 MBs free…

Since it was the first I was streaming, chronolapse was on, two browsers were open, a few GIMP windows were also open and was coding my game, I blamed all the softwares (and not the stupid person that started ’em all) for the lack of memory. No big deal, after restarting the computer everything should be normal again…

Or not…

My game still wouldn’t run and gdb was still breaking in random places. Now I had to admit it was something on my code that was causing it. After trying to make in run again and fixing a unrelated bug, I noticed the it started to happen after I added a new “object”.

When I looked into its initialization function, it was quite clear what was wrong. This is how it looked at the time:

gfmRV mob_getNew(mob **ppMob) {
 gfmRV rv;
 
 ASSERT(ppMob, GFMRV_ARGUMENTS_BAD);
 ASSERT(!(*ppMob), GFMRV_ARGUMENTS_BAD);
 
 *ppMob = (mob*)malloc(sizeof(ppMob)); // <---- pay attention to this line
 ASSERT(*ppMob, GFMRV_ALLOC_FAILED);
 
 rv = GFMRV_OK;
 __ret:
 return rv;
 }

Instead of alloc’ing enough memory for the object, I was only alloc’ing enough for the object’s pointer. So, when the game tried to update it, it would modify random places in the memory. This was the cause to the random crashes.

Well, lesson learned (once again). Coding in C can be *fun*.

 

Comments

22. Aug 2015 · 17:04 UTC
“Guys! Look what you’re doing here! You’re dereferencing a null pointer! Open your eyes!”

–Bret ‘the Hitman’ hart
22. Aug 2015 · 18:58 UTC
Are you using valgrind? Use valgrind!