“Keep It Simple, Sweetheart“ sounds easy enough to do, but in many ways, this is
not a simple world. I do, however, enjoy simplifying things. (-:
Facing this rotten, ancient C program, having it segfault after a few minor changes for no obvious reason, I began to feel a bit stupid.
So... what happens when “
We believe that we are stupid?”
The curious thing about this belief is that it has been inflicted upon us by somebody else. We would have no concept of stupidity if someone had not told us about it & applied the adjective to us.
So reckons Diana Beaver, an educational researcher.
After discussing life for a bit with someone I seriously value, in which I learned that being “The Crazy Grandpa” is acceptable, but that I am very much
not stupid, I decided to apply KISS.
It wasn’t working. Why not? I’d made only a few changes, so the reason is likely to be simple.
Back to the basics.
I sat down & pored through every line of code I was dealing with, rapidly (by
#if 0-ing out sections temporarily to see if the rest worked) isolated it to within one function that I had barely touched.
In order for a problem to be made simple, one must understand it. Not always in excruciating detail, but it must be understood, So I began reading statement by statement to be sure that I understood it.
One of the local variables was
char *buf[39];, which is an unusually specific value. It turned out that original author had
sprintfed a
%-38.38s into it. If that overflowed, it wrote text onto the next item in memory: the call-return address on the stack. Off to hyperspace in an instant!
One of my additions produced a 40-character (-byte) string. So...
cw80<Esc> then
make (which itself only became possible on Sunday), fixed.
The other problem appeared to be where an early routine called a date-interpreting function (which fetched a date stored as a
string, hand-scrolled the month digits to the beginning of the string, hand-terminated it there, then returned an
atoi ( ) of it).
Careful research discovered that the
if ( ) statement this expression was embedded within first checked a string variable (from the
argv [ ] array) for a specific value. If no value was supplied, the result was
strcmp (NULL, "word"); which of course segfaulted as it attempted to fetch characters from address zero.
Fixed.
Simple can be quite satisfying. (-: