Нет, вы не можете точно проверить, является ли адрес недействительным. Даже если вы использовали какую-то функцию операционной системы, чтобы проверить, сопоставлен ли адрес с адресным пространством, вы все равно не можете быть уверены, что адрес содержит какие-либо служебные данные, которые вам не следует читать или изменять.
Один хороший пример. Если ваша программа использует Microsoft RPC для приема вызовов от другой программы, вам необходимо реализовать набор функций обратного вызова для обработки запросов. Эти функции обратного вызова будут выполняться в отдельных потоках, запущенных RPC. Вы не знаете, когда они запускаются и каков их размер стека, поэтому вы не можете определить, происходит ли переполнение буфера, если вы записываете адрес, который должен быть переменной стека, но случайно находится в стеке другого нить.