Поскольку C / C ++ не проверяет границы.
Массивы внутренне указывают на местоположение в памяти. Когда вы вызываете arr[index]
, что он делает, это:
type value = *(arr + index);
Результаты - это большие числа (не обязательно), потому что они являются значениями мусора. Также как неинициализированная переменная.
С помощью исключения для sse можно включить _MM_SET_EXCEPTION_MASK
от xmmintrin.h
. Например, для включения недопустимых (nan) исключений сделать
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
На Mac OS X это умеренно сложно. OS X использует единицу SSE для всей математики FP по умолчанию, не единицу x87 FP. Единица SSE не соблюдает опции прерывания, так, чтобы средства, что в дополнение к включению прерываний, Вы удостоверились, что скомпилировали весь свой код для не использования математики SSE.
Можно отключить математику путем добавления "-mno-sse-mno-sse2-mno-sse3" к CFLAGS. После того как Вы делаете это, можно использовать некоторый встроенный ассемблерный код для конфигурирования исключений FP с в основном теми же флагами как Linux.
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
Одна выгода, которую можно найти, - то, что, так как OS X создается полностью с помощью sse могут быть непойманные ошибки. Я знаю там используемый быть большим с обработчиком сигналов, не пасующим назад надлежащие коды, но это было несколько лет назад, надо надеяться, он фиксируется теперь.