EXC_I386_GPFLT z pewnością odnosi się do „ogólnego błędu ochrony”, który jest sposobem x86, aby powiedzieć ci, że „zrobiłeś coś, czego nie możesz zrobić”. Zwykle NIE oznacza to, że uzyskujesz dostęp poza granicami pamięci, ale może się zdarzyć, że twój kod wykracza poza granice i powoduje, że zły kod / dane są używane w sposób, który powoduje pewnego rodzaju naruszenie ochrony.
Niestety, bez szerszego kontekstu może być trudno ustalić dokładnie, na czym polega problem, jest 27 różnych przyczyn wymienionych w moim Podręczniku programisty AMD64, tom 2 z 2005 r. - według wszystkich relacji jest prawdopodobne, że 8 lat później dodałoby kilka więcej.
Jeśli jest to system 64-bitowy, prawdopodobny scenariusz jest taki, że Twój kod używa „niekanonicznego wskaźnika” - co oznacza, że adres 64-bitowy jest utworzony w taki sposób, że górne 16 bitów adresu nie jest wszystkie kopie górnych 48 niższych bitów (innymi słowy, wszystkie 16 górnych bitów adresu powinno mieć wartość 0 lub wszystkie 1, na podstawie bitu nieco poniżej 16 bitów). Ta reguła ma na celu zagwarantowanie, że architektura może „bezpiecznie rozszerzyć liczbę ważnych bitów w zakresie adresów”. Oznaczałoby to, że kod albo nadpisuje niektóre dane wskaźnika innymi rzeczami, albo wychodzi poza granice podczas odczytywania wartości wskaźnika.
Inną prawdopodobną przyczyną jest dostęp bez wyrównania z rejestrem SSE - innymi słowy, odczyt 16-bajtowego rejestru SSE z adresu, który nie jest wyrównany do 16-bajtów.
Jest, jak powiedziałem, wiele innych możliwych powodów, ale większość z nich dotyczy rzeczy, których „normalny” kod nie wykonywałby w 32- lub 64-bitowym systemie operacyjnym (takich jak ładowanie rejestrów segmentu z nieprawidłowym indeksem selektora lub zapisywanie do MSR (rejestry specyficzne dla modelu)).