- Array implicit decay into pointers instead of requiring an explicit "address of" operator
- No bounds checking
- Implicit conversion between enumerations and numeric types
- Implicit conversions between numeric types
- Null terminated strings
Every time I had code in straight C, I made it look like Pascal by validating all the parameters, compiling with all warnings enabled, warnings as errors, using ADTs with no field access to structs.
A static analyzer is also compulsory.
The amount of money caused by bug fixing in developer time, creation of C memory corruption detection tools and paying for them is just endless.