Skip to main content

Assert This!

Long ago we all went to college and learned about the assert() function in C and later, C++. At the time, assert() was a great little tool for quickly bailing out of your program when you thought it could not finish.  I used it when my calls to malloc() would fail.  Lately, though, I’ve seen commercial software vendors proclaiming their use of assert() as a way of writing safer code.  This is madness.

First of all, the assert() function is just a print and exit macro.  Your assertion message is printed to the tty, and then your application exits with an error code.  That’s it, no segmentation fault, no core dump, nothing else, just exit.

Imagine your surprise when your favorite game all of a sudden just exits back to shell right in the middle of fighting the super.  You would likely not play that game again.  When there’s a GUI, the tty is redirected to the /dev/null device, which means there is no output.  So much for that assert message getting to your users.

Now let’s imagine a more sinister scenario that is commonplace today.  You are using a library in your web application that performs something like PDF generation.  It works just great until one day all of your web sites crash for no reason.  If you’re like me, you have them programmed to send you email when they fail, and now you’ve got a thousand emails in your inbox and more waiting at the server.  Plus, your client is calling you asking why your crappy software doesn’t work.  Crap!

No logs are generated, nothing written to the web server’s error log, nada.  Only when you find the system log (or the Event Viewer in Windows), do you see a lone message from your library proclaiming “assert() at line XX in a/b/c/d.c raised.”  Wonderfully descriptive and helpful in diagnosing why the assert() was triggered.

Worst of all, you have to restart the entire web server, kick out what could be thousands of users to your site, and hope that it won’t happen again. To rub salt in your wound, your client has lost what could be thousands of dollars in business.

When this happened to me, I contacted the software vendor about their assert().  They only responded with “give us a sample program that demonstrates the problem.”  Uh, hello? Either they are completely clueless about when to use assert(), or else I am missing something.  The purpose of the assert() is to catch instances where your program can not continue.  That should be less than 0.001% of the processing time.  It would be impossible for me, or anyone for that fact, to reproduce a sample program that exemplifies the assert!  So I pressed them further and made them actually investigate the problem.  In this case, their library could not handle multiple objects with the same name in the PDF catalog.  Instead of throwing an exception, they just asserted!  Yeah, asserted an ERROR condition.

Too many times, young programmers who are fresh out of college think that what they learned can be directly translated to a commercial product. We all know that this is not the way to produce commercial software.  So, bad on me for paying for that software, but bad on them for not knowing better.  The Internet has made it far too easy for mediocre programmers to produce even more mediocre software at a price that is comparable to that paid to exceptional programmers.  The next time you are in the market for a PDF library, stay clear of ABCpdf from WebSupergoo.  They use asserts when they should be using exceptions.  That misunderstanding will cost you more than the $500 they charge for their software.

Popular posts from this blog

Clustered Foolishness

I had morning coffee with a well respected friend of mine recently. Aside from chatting about the usual wifery and family, we touched on the subject of clustered indices and SQL Server performance. A common misconception in the software industry is that a clustered index will make your database queries faster. In fact, most cases will demonstrate the polar opposite of this assumption. The reason for this misconception is a misunderstanding of how the clustered index works in any database server. A clustered index is a node clustering of records that share a common index value. When you decide on an index strategy for your data, you must consider the range of data to be indexed. Remember back to your data structures classes and what you were taught about hashtable optimizations. A hashtable, which is another way of saying a database index, is just a table of N values that organizes a set of M records in quickly accessible lists that are of order L, where L is significantly less than M. ...

Deadly Information

Remember back to 2006 when a young girl killed herself [1] , [4] after being tricked and harassed by a faux boy she found on the Web using MySpace. The trial against the faux boy, an adult woman (Lori Drew), did not result in prosecution for the death of Megan, much to the dismay of many.  Yet, today we read about another trial where someone is being accused of second degree murder because they may have mentioned something slanderous about another person who was later killed by a hit man [2] . In this case, though, the person on trial is a former FBI agent who was working deep cover to infiltrate organized crime. In both cases, someone released information to third parties that resulted in the death of another person.  Neither defendant in either of these cases actually committed the act of murder, though. In the case of the FBI agent, though, the murder charge is being taken seriously. Yet, in the MySpace slander case, the murder charge was not taken seriously. How are t...

Faster Climate Change

CNN reports that a WWF study has found that global climate change is happening faster than predicted in 2007 and that there will not be any arctic ice by 2013, or 2040. [1] Then it goes on to say that global sea level will increase by 1.08 meters by the end of the century, which is 2100, 92 years from now. Quite honestly, nobody really cares what is going to happen to the planet in 98 years. Why? Because in 98 years we (as humans) will either: (1) Obliterate ourselves because God told us to do it. (2) Eat eachother because there will no longer be any land available to grow crops and sustain living quarters for our 50 billion people. (3) Suffocate because our planet will no longer smell nice thanks to 50 billion people producing lots of solid waste in our oceans. (4) Leave the planet because there will no longer be enough fresh water to sustain our lives. Wait a minute. Consider (4) for a moment. Where can we get an abundance of fresh water TODAY? Anyone? Yeah, the arctic! It's goin...