Мне кажется интересным отметить, что когда Windows была впервые написана, она не выполняла много проверок на наличие недействительных / NULL-указателей. В конце концов, ни один программист не будет настолько глуп, чтобы пропустить NULL там, где нужна правильная строка. А тестирование на NULL только делает код больше и медленнее.
В результате многие ОАЭ произошли из-за ошибок в клиентских программах, но все это досталось Microsoft. С тех пор Microsoft изменила Windows, чтобы в значительной степени проверять каждый аргумент на NULL.
Я думаю, что урок в том, что, если вы не уверены, что аргумент всегда будет действительным, вероятно, стоит проверить, что это так. Конечно, Windows используется многими программистами, в то время как ваша функция может использоваться только вами. Так что это, безусловно, влияет на вероятность неверного аргумента.
В таких языках, как C и C ++, вы можете использовать ASSERT, и я использую их ВСЕ время при использовании этих языков. Это заявления, которые проверяют определенные условия, которые вы никогда не ожидаете. Во время отладки вы можете проверить, что, на самом деле, они никогда не делают. Затем, когда вы делаете сборку релиза, эти операторы не включаются в скомпилированный код. В некотором смысле это кажется мне лучшим из обоих миров.