Не устанавливайте правило, чтобы просто проверять нулевое значение и ничего не делать, если вы его найдете.
Если указатель может быть нулевым, то вам нужно подумать о том, что делает ваш код в случае, если он фактически равен нулю. Обычно просто ничего не делать - это неправильный ответ. С осторожностью можно определить API, которые работают подобным образом, но для этого нужно больше, чем просто разбрасывать несколько пустых проверок на месте.
Итак, если указателю разрешено быть нулевым, то вы должны проверить на нулевое значение, и вы должны делать все, что подходит.
Если указатель не может быть нулевым, то вполне разумно написать код, который вызывает неопределенное поведение, если он нулевой. Он ничем не отличается от написания подпрограмм обработки строк, которые вызывают неопределенное поведение, если ввод не завершен с помощью NUL, или от написания подпрограмм, использующих буфер, которые вызывают неопределенное поведение, если вызывающая сторона передает неверное значение для длины, или от написания функции, которая принимает параметр file*
и вызывает неопределенное поведение, если пользователь передает дескриптор файла reinterpret_cast в file*
. В C и C ++ вы просто должны полагаться на то, что говорит вам ваш вызывающий. Мусор в мусор.
Однако вам может понадобиться написать код, который поможет вашему вызывающему абоненту (который, вероятно, в конце концов, вы), когда передаются наиболее вероятные виды мусора. Для этого хороши утверждения и исключения.
Продолжая аналогию с комментарием Фрэнси к вопросу: большинство людей не ищут машины, когда пересекают пешеходную дорожку или перед тем, как сесть на свой диван. Они все еще могут быть сбиты машиной. Такое случается. Но обычно считается параноиком тратить усилия на проверку автомобилей в этих обстоятельствах или указание на банку супа сказать: «сначала проверь машины на своей кухне. Затем нагрей суп».
То же самое относится и к вашему коду. Передать недопустимое значение функции намного проще, чем случайно загнать свой автомобиль на чужую кухню. Но это все-таки вина водителя, если он сделает это и ударит кого-то, а не неспособность повара проявить должную осторожность. Вы не обязательно хотите, чтобы повара (или абоненты) засоряли свои рецепты (код) чеками, которые должны быть излишними.
Существуют и другие способы поиска проблем, такие как модульные тесты и отладчики. В любом случае гораздо безопаснее создать среду, свободную от автомобилей, за исключением случаев, когда это необходимо (дороги), чем управлять машинами повсюду повсеместно и надеяться, что каждый сможет справиться с ними в любое время. Таким образом, если вы проверяете наличие нуля в тех случаях, когда это не разрешено, вы не должны позволять этому дать людям идею, что это разрешено в конце концов.
[Edit - я буквально просто наткнулся на пример ошибки, при которой проверка на нулевое значение не может найти недопустимый указатель. Я собираюсь использовать карту, чтобы держать некоторые объекты. Я буду использовать указатели на эти объекты (для представления графика), что хорошо, потому что map никогда не перемещает свое содержимое. Но я еще не определил порядок для объектов (и это будет немного сложно сделать). Итак, чтобы заставить вещи двигаться и доказать, что какой-то другой код работает, я использовал вектор и линейный поиск вместо карты. Это верно, я не имел в виду вектор, я имел в виду deque. Поэтому после первого изменения размера вектора я не передавал нулевые указатели в функции, а передавал указатели в освобожденную память.
Я делаю глупые ошибки, которые пропускают недействительный мусор примерно так же часто, как я делаю глупые ошибки, которые пропускают нулевые указатели. Поэтому, независимо от того, добавляю ли я проверку на ноль, мне все равно нужно иметь возможность диагностировать проблемы, когда программа просто падает по причинам, которые я не могу проверить. Так как это также будет диагностировать доступ к нулевому указателю, я обычно не беспокоюсь о проверке на нулевое значение, если я не пишу код для проверки предварительных условий при входе в функцию. В этом случае он должен по возможности сделать гораздо больше, чем просто проверить ноль.]