EXC_I386_GPFLT fait sûrement référence à "Erreur de protection générale", qui est le moyen pour x86 de vous dire que "vous avez fait quelque chose que vous n'êtes pas autorisé à faire". Cela NE signifie généralement PAS que vous accédez en dehors des limites de la mémoire, mais il se peut que votre code soit hors limites et que le mauvais code / données soit utilisé d'une manière qui entraîne une violation de la protection.
Malheureusement, il peut être difficile de comprendre exactement quel est le problème sans plus de contexte, il y a 27 causes différentes répertoriées dans mon manuel du programmeur AMD64, Vol 2 de 2005 - selon tous les témoignages, il est probable que 8 ans plus tard en auraient ajouté quelques-unes. plus.
S'il s'agit d'un système 64 bits, un scénario plausible est que votre code utilise un "pointeur non canonique" - ce qui signifie qu'une adresse 64 bits est formée de telle manière que les 16 bits supérieurs de l'adresse ne sont pas toutes les copies du haut des 48 bits inférieurs (en d'autres termes, les 16 premiers bits d'une adresse doivent tous être 0 ou tous 1, sur la base du bit juste en dessous de 16 bits). Cette règle est en place pour garantir que l'architecture peut "augmenter en toute sécurité le nombre de bits valides dans la plage d'adresses". Cela indiquerait que le code écrase certaines données de pointeur par d'autres éléments, ou sort des limites lors de la lecture d'une valeur de pointeur.
Une autre cause probable est l'accès non aligné avec un registre SSE - en d'autres termes, la lecture d'un registre SSE de 16 octets à partir d'une adresse qui n'est pas alignée sur 16 octets.
Il y a, comme je l'ai dit, de nombreuses autres raisons possibles, mais la plupart impliquent des choses que le code «normal» ne ferait pas dans un système d'exploitation 32 ou 64 bits (comme le chargement de registres de segment avec un index de sélecteur invalide ou l'écriture dans MSR (registres spécifiques au modèle)).