The presence of dead code may reveal either logical errors due to alterations in the program or significant changes in the assumptions and environment of the program (see also software rot); a good compiler should report dead code so a maintainer can think about what it means. Many times dead code is inserted by a defensive programmer for can't happen tests that really can't happen (yet). Other times dead code is inserted by the programmer for debugging purposes but has yet to be removed.