“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. (-:
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. (-:
Comments
That would be my favourite solution as well, but I have not yet managed to sell the idea to the business concerned.