Many of the problems you mention can at least generate a warning at compile time if you put the right compiler options (1, partially 2, partially 9). Some others can be catched with the kernel debugging options (3, 4, 7, 8, 10). I mostly agree with your list, would just add some details. For example, there are more types of addresses than virtual and physical (you have the bus address, user address too). I'd merge also your points 3, 4 and 8.
My list is:
* Mistakes between user, kernel, physical and bus addresses
* Not adapted locking methods: spinlocks instead of mutexes for example
* Race conditions on multicore systems
* Problems in locking user accesses to the driver (locking special file operations for example)
* Use after (k/v)free
* Reference counter problems
* Errors in manual offset calculations
* Different problems when freeing the resources at module unload
* Not checking error codes from called functions
* Not taking into account the errors that may be signalled by the hardware
* Asuming that the hardware will always work correctly
* Not checking data passed by the user application
|