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

Stock Option Debt Income

The 2024 Presidential election has brought out a topic of interest that seems to have been perverted. There is this "Taxing Unrealized Capital Gains" [1] movement that is being falsely attributed to Vice President Harris. Clearly, this is a change in the revenue code that was designed by someone in office long before VP Harris was in office. My money is on Elizabeth Warren and Bernie Sanders. What is this change in the revenue code though? For that you have to understand what Silicon Valley zillionaires are doing with their stock options. Many of these people in this special economic area have huge discounts on stock prices for companies that are not public yet, or are public and can not be sold [2]. To be fair to these holders of equity, banks allow them to finance debt using leverage against those options. If you hold an option that is worth $5M then a bank might lend you a share of that value, thus realizing a debt against the option [3]. This is a fair debt instrument and...

A Self Defeating Race False Narrative

2020 is the year of the pandemic. The SARS-Cov-2 (Covid19) virus has rampaged across the planet infecting 4,893,136 [1] people by May 20, 2020. At this time, of those 4.8M people, 323,256 people have perished from complications that arise from the infection. Arising out of this pandemic has been a narrative about non-white ethnic groups being disproportionately affected by the infection [6,7,8]. A narrative that conditions people to believe that they are perpetually victims only creates a "collective victimhood" [4,5] in that group. This "collective victimhood" costs its members millions in unrealized potential, sends them cowering from social interactions that would otherwise benefit them, and ultimately creates an environment that perpetuates itself. Let's try to dispel that false narrative and deal just with data. I pulled my data from the CDC [9] looking at mortality only. The mortality data from CDC contains per-state mortality rates on a per-infectio...

Number of Primes

Anderson's Theorem (a) The number of primes in [1,n] is no more than 2+floor(n/2). The probability of n being prime when n is not prime is 1/2 - see Dasgupta,Papadimitriou,Vazirani "Algorithms" page 26. Therefore, the E(pi(n)) is n/2. (b) There does not exist another set of adjacent primes other than {1,2,3} 5: 2 + floor(5/2) = 2 + 2 = 4:=> {1,2,3,5} : 4 <= 4 7: 2 + floor(7/2) = 2 + 3 = 5 => {1,2,3,5,7} : 5 <= 5 11: 2 + floor(11/2) = 2 + 5 = 7 => {1,2,3,5,7,11} 6 <= 7 26: 2 + floor(26/2) = 15 => {1,2,3,5,7,11,13,17,19,23} : 10 <= 15 Lagrange's Theorem is Inaccurate Lagrange's theorem about primes states that pi(x) is the number of primes <= x. The pi(x) is approximately x/ln(x). He postulated that the lim of pi(x)/(x/lnx) as x-> infinity was 1. This is incorrect. if the number of primes is bounded by n/2 then refactoring and reducing Lagrange's Theorem results in the lim of ln(x) as x approaches infinity. This is alwa...