This paper presents an analysis of software-based fault tolerance techniques applied at different abstraction levels. Four case-study applications are partially hardened using software-based fault tolerance techniques. Different partial hardened versions of the case-study applications are generated with varying levels of hardening. In the high level programming language, variables are individually hardened, while in the low level programming language, registers are individually hardened. A fault injection campaign is performed. Results show the performance, memory footprint and error coverage of each hardened version. Both approaches are compared and presented in detail.