Sorry for the provocative title, but I'm too emotional these days.
This code:
#include <stdio.h> #include <string.h> struct tmp { int x, y, z; }; int main() { struct tmp* m_result_original=NULL; struct tmp* m_result_my_version=NULL; // m_result_original=do_something_version_1(); // m_result_my_version=do_something_version_2(); if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) { printf ("Error - test failed!\n"); }; };
There is an unnoticed typo. in memcmp(). I wrote here:
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
But must be (note closing brackets at the end):
if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp))!=0)
Yes, this is a problem of weak static typing of pure C. Pure C is a great tool for some jobs, but here be dragons, as they say.
The problem is that (sizeof(struct ...)!=0)==1, so size=1 always for memcmp(). Instead of comparing two tmp, my code compared only 1 byte of each structs.
And GCC 9.4 was silent, even with -Wall, and so is G++. And MSVC 2017 is silent as well, with /Owall. But Clang 10 warns even without -Wall:
2.c:17:72: warning: size argument in 'memcmp' call is a comparison [-Wmemsize-comparison] if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) ~~~~~~~~~~~~~~~~~~^~~ 2.c:17:7: note: did you mean to compare the result of 'memcmp' instead? if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) ^ ~ ) 2.c:17:54: note: explicitly cast the argument to size_t to silence this warning if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) ^ (size_t)( ) 1 warning generated.
Yes, venerable GCC is a very important and respected tool. And this is my bug, not GCC's flaw.
But that bug in my code ruined one month of my work. I coded without realizing tests don't work at all. OUCH!
I probably should have tried Clang at start. Or try several compilers in parallel, maybe? Or maybe I should stop using pure C...
Comments at lobste.rs, comments at HN, more comments at HN.
Yes, I know about these lousy Disqus ads. Please use adblocker. I would consider to subscribe to 'pro' version of Disqus if the signal/noise ratio in comments would be good enough.