I have often seen claims that a programming language feature eliminates a whole class of errors.
For example, I have seen claims that:
A strong type system eliminates the class of errors caused by using features that a type does not support.
Automatic memory management eliminates the class of errors relating to allocating the correct amount of memory for an object/structure.
Mandatory variable initialisation eliminates null pointer or null reference errors.
Immutable data structures eliminate the class of errors caused by not understanding the impacts of changing mutable state.
I am not trying to find out whether the claims above are true or not, but rather compile a list of claims of this type that are specific enough for me to research and evaluate myself.
What other specific features are alleged to eliminate a whole class of errors?
Is there a general principle or theory for identifying features that do this, or identifying the absence of such features?
(Note that I do not include obviously vague or subjective claims like these, whether true or not:
Object oriented programming improves reusability.
Dynamic languages are faster to program in.
Meaningful whitespace makes the program cleaner. )
Here are a few off the top of my head: