IMHO, writing drivers assumes much more liability than writing applications. Although it's always bad if software crashes, what a difference between a crashing app. vs. a crashing driver: The latter tears down the whole system!

As Michael says, drivers need to protect against race conditions due to resources getting accessed from various asynchronous contexts, including interrupt handlers.

Spin locks, "atomic" access to data and other interlocked operations are sometimes not easy to implement.