C
Der Wert eines Zeigerobjekts verweist entweder auf ein Objekt, ist ein Nullzeiger oder ist singulär (== verweist nicht auf ein Objekt oder ist Null). Der Zugriff auf den Wert eines singlären Zeigers ist undefiniert. Undefiniert bedeutet gerade, dass es keine (durch C++ definierte) Möglichkeit gibt, diesen etwas mit diesem Wert anzufangen. Das schließt dann logischerweise die Überprüfung auf Gültigkeit (was eigentlich schon in sich widersprüchlich ist) ein, denn das Werfen einer Exception (das kommt im Übrigen noch aus anderen Gründen nicht in Frage) ist alles andere als etwas, mit dem man nichts anfangen kann.
Es wird auch gerne übersehen, dass dieses Undefiniert-Sein nicht nur eine Einschränkung hinsichtlich der Verwendung von Zeigern darstellt (es geht gerade nicht - oder nicht nur - um irgendwelche exotischen Systeme, die vielleicht wegen Traps aussteigen), vielmehr ist das auch eine Voraussetzung für viele Formen der Optimierung. z.B. (sinnfrei):
void foo();
int bar()
{
int x = 42;
foo();
return x;
}
int main()
{
cout << bar();
}
x ist hier eine lokale Variable, die nie Aliase hat, daher muss dieses Programm stets 42 ausgeben. Das wäre nicht gegeben, wenn foo auf irgendwelche undefinierte Weise (es gibt mit Sicherheit keine wohldefinierte Möglichkeit) per wilder Zeigermanipulationen auf x zugreifen würde (nat. kann die Plattform zusätzliche Möglichkeiten bieten, in denen dieses konkrete Beispiel versagen würde).