Substantial parts of the C language are not well defined enough to rely on in many circumstances. QA C contains a knowledge base of such issues and helps the user to detect any reliance on them. There is strong evidence from measurement that, without such control, commercially released systems contain many such faults.
There are four types of unsafe behaviour described in Appendix G of the C Standard, ISO/IEC 9899:1990:
The behaviour of legal items which is undefined. This includes such items as any reliance on evaluation order, (the order in which operands are fetched in an expression).
The behaviour of illegal items which is undefined. This includes items like using a returned result from a function of type void.
Behaviour which must be defined but may depend on the implementation. This includes items such as whether plain char is signed or unsigned.
Many of these are statically detectable and should not appear in a safer subset.
Approximately 50 issues have arisen since the standard was released. This low number is indicative of the fundamental agreement which existed about the C definition. Again, many of these are statically detectable.
This tends to be language independent, for example, incomplete logical structures. In C, these appear most often as switch statements without a default clause, and if .. else if clauses with no else. Again, these are statically detectable. All logical structures should be complete, for example completing them with a statement that their execution indicates a requirements error or an unforeseen external condition.