EXC_I386_GPFLT, безусловно, имеет в виду «общую ошибку защиты», которая является способом x86 сказать вам, что «вы сделали то, что вам не разрешено». Обычно это НЕ означает, что вы обращаетесь за пределами памяти, но может случиться так, что ваш код выходит за границы и приводит к использованию плохого кода / данных таким образом, который приводит к некоторому нарушению защиты.
К сожалению, может быть трудно точно определить, в чем проблема, без дополнительного контекста, в моем Руководстве программиста AMD64, том 2 от 2005 года, перечислено 27 различных причин - по всем оценкам, вероятно, что 8 лет спустя добавилось бы несколько Больше.
Если это 64-битная система, вероятным сценарием является то, что ваш код использует «неканонический указатель» - это означает, что 64-битный адрес сформирован таким образом, что старшие 16 бит адреса не все копии верхних 48 нижних битов (другими словами, все верхние 16 бит адреса должны быть 0 или все 1, в зависимости от бита чуть ниже 16 бит). Это правило применяется, чтобы гарантировать, что архитектура может «безопасно увеличить количество действительных битов в диапазоне адресов». Это будет означать, что код либо перезаписывает некоторые данные указателя другим материалом, либо выходит за пределы при чтении некоторого значения указателя.
Другой вероятной причиной является невыровненный доступ к регистру SSE - другими словами, чтение 16-байтового регистра SSE с адреса, который не выровнен по 16 байтам.
Как я уже сказал, существует множество других возможных причин, но большинство из них связаны с вещами, которые «нормальный» код не мог бы делать в 32- или 64-разрядной ОС (например, загрузка регистров сегмента с недопустимым индексом селектора или запись в MSR (регистры конкретной модели)).