Jak powiedzieli inni, nie można niezawodnie wykryć nieprawidłowego wskaźnika. Rozważ kilka form, jakie może przybierać nieprawidłowy wskaźnik:
Możesz mieć pusty wskaźnik. Można to łatwo sprawdzić i coś z tym zrobić.
Możesz mieć wskaźnik do miejsca poza ważną pamięcią. To, co składa się na prawidłową pamięć, różni się w zależności od tego, jak środowisko wykonawcze systemu konfiguruje przestrzeń adresową. W systemach uniksowych jest to zwykle wirtualna przestrzeń adresowa zaczynająca się od 0 i sięgająca dużej liczby megabajtów. W systemach wbudowanych może być dość mały. W każdym razie może nie zaczynać się od 0. Jeśli zdarzy się, że Twoja aplikacja działa w trybie nadzorcy lub równoważnym, wskaźnik może odnosić się do rzeczywistego adresu, który może, ale nie musi, być zarchiwizowany z rzeczywistą pamięcią.
Możesz mieć wskaźnik do jakiegoś miejsca w twojej prawidłowej pamięci, nawet wewnątrz segmentu danych, bss, stosu lub sterty, ale nie wskazujący na prawidłowy obiekt. Wariantem tego jest wskaźnik, który wskazywał na prawidłowy obiekt, zanim coś złego stało się z obiektem. Złe rzeczy w tym kontekście obejmują zwolnienie alokacji, uszkodzenie pamięci lub uszkodzenie wskaźnika.
Możesz mieć płaski, niedozwolony wskaźnik, taki jak wskaźnik z niedozwolonym wyrównaniem dla elementu, do którego się odwołujesz.
Problem staje się jeszcze gorszy, gdy weźmie się pod uwagę architektury oparte na segmentach / przesunięciu i inne dziwne implementacje wskaźników. Takie rzeczy są zwykle ukrywane przed programistą przez dobre kompilatory i rozsądne użycie typów, ale jeśli chcesz przebić zasłonę i spróbować przechytrzyć system operacyjny i programistów kompilatorów, możesz, ale nie ma jednego ogólnego sposobu zrobić to, co rozwiąże wszystkie problemy, z którymi możesz się spotkać.
Najlepsze, co możesz zrobić, to zezwolić na awarię i podać dobre informacje diagnostyczne.