Software self-checking mechanisms are described for improving software
tamper resistance and/or reliability. Redundant tests are performed to
detect modifications to a program while it is running. Modifications are
recorded or reported. Embodiments of the software self-checking
mechanisms can be implemented such that they are relatively stealthy and
robust, and so that it they are compatible with copy-specific static
watermarking and other tamper-resistance techniques.