Загрузка в массив приводит к разрушению стека при наличии достаточного места? - PullRequest
0 голосов
/ 20 мая 2019

При выполнении следующего кода я получаю ошибку Stack Smashing.

const uint size = 62;

...
for (int i=0; i < 10; ++i){
    // mask = elements != zero
    // input = epi32 m512 data containing 1 byte values
    _mm512_mask_compress_epi32(input, mask, input);
    // get just elements != 0 as previous mask. 
    __mmask16 mask1 = _mm512_cmpneq_epi32_mask(compressed, _mm512_setzero_epi32());
    // append the non-zero elements to the uchar* 
    _mm512_mask_cvtusepi32_storeu_epi8((uchar*)str+pos, mask1, compressed); // uncommenting = no error, truncating mask = no error

     // add size of the inserted elements by counting 1's in mask
     pos += sizeOfInsertion;

     // print the position of the pointer AFTER storing
     void* pp = (void*) ((uchar*) str + pos);
     std::cout << pp << std::endl;
}

Чтобы исследовать эту проблему, я проверял положение указателя при вставке элементов. В начале (pointing to str[0]) у меня есть 0x7ffce3468d30, в конце 0x7ffce3468d69. Вычитая эти адреса, я получаю 3E = 62. Так что он должен уместиться в объявленном массиве. Сдвиг маски на 1 (усечение одного элемента) не приводит к ошибке.

1 Ответ

1 голос
/ 20 мая 2019

Ошибка была в сжатии.Я не возражал обнулять значения, не соответствующие маске, поэтому данные не хранились непрерывно, и поэтому стек переполнялся.

Короче:

_mm512_maskz_compress_epi32(mask, input);

заставил его работать.

...