Here is a first-ever admission: a real software bug in a real voting system can drop real votes, and has dropped votes. And perhaps has been doing so for years. I wrote earlier about the wrangle between the state of Ohio and Premier Election Systems (formerly Diebold), in which some real vote dropping was blamed on anti-virus software (which wasn't allowed to be in the machines in the first place!).
The latest is that Premeir has admitted that actually, it wasn't the ant-virus, it was a bug in Premier's own software, and a years-old old bug at that, present in systems used across the country. For links to mainstream press and Web coverage of this news (including an angle on how the system was tested and certified for use), I recommend a recent article in John Gideon's voting news on the Brad Blog. Also, for a nice pithy rant, try Premier Continues Proud Tradition of Diebold E-Voting Screw-Ups from the Digital Daily.
Instead, I'll answer two other questions I've heard: how is such a basic error possible? and how has it not been noticed in so many years? The error is basic because counting votes is the entire job the buggy software, which basically reads in data from each of several voting machines, and cretaes vote totals. The answers to both questions start with the underlying technical cause of the problem as recently reported by Premier: importing two or more voting machines' data, at the same time, can cause some data to be lost. This "concurrency error" is not directly observable in the Dielbold code, but occurs via the use of an antique database engine that's part of the Windows OS base of the voting systems. Why hasn't it been noticed? One reason is that unless a county did a post-election audit that included a precinct with some lost votes, then no one could notice the votes being lost! But in Butler County Ohio, that type of post-facto checking did uncover the lost votes in time.
But the interesting lesson here is really about some very high-level poor choices that lead to these types of software errors. Diebold chose to use a large complex Windows system for a simple function. They chose to use an antique database engine conveniently included, despite the fact that Microsoft, at that time, discouraged its use, especially for applications with concurrency, noting the risk of data loss. The result was that despite years of testing and use, the bug wasn't found until now, and we'll never know many elections have been affected by it.