Preserving application reliability on unreliable hardware