We're still playing with 2D barcodes and testing out how well they work with various Android devices. One question that came up from our last test was how well they dealt with errors in the barcode, that is dirt, rips or parts missing entirely in the way.
The answer is pretty darn well. Here's a barcode that still runs despite me scribbling all over it:
But there are vulnerabilities. Specifically on QR codes, they are very sensitive to having one of the position detection patterns destroyed. This QR code, while in much better shape than the one above, refused to read, just because the top left block was filled in.
Note of course that all these results are in the context of using the Barcode Scanner application on an Android phone. There are almost certainly weaknesses in the scanning algorithm, but that's the state of the art for Java based QR Code reading, so it is what is relevant for us.
Also, we tried the same tests with DM codes with similar results. Newer DM codes support the very same Reed Solomon error correction algorithm, and just like QR codes allow for up to 30% of the data being corrupted before failing entirely. Again though, if you start messing with the position markers for DM codes, which are the left and right edges, you run into trouble more quickly.