_mm_store_si128 上的 SSE 段错误
SSE segfault on _mm_store_si128
当我尝试加载我使用内在函数生成的一些密文时出现段错误。我根本不明白这个错误。代码示例:
unsigned char c[177];
unsigned char m[161];
auth = _mm_setzero_si128();
unsigned char M_star[BLOCKSIZE];
__m128i tag = auth;
for(i=0;i<numblocks_mes;++i)
{
M = _mm_load_si128(m+i*BLOCKSIZE);
idx = _mm_set_epi64x(zero,i); // both inputs are unsigned long long
tmp = encrypt_block(M,idx);
tag = _mm_xor_si128(tag,tmp);
}
if(fin_mes)
{
memcpy(M_star,m+numblocks_mes*BLOCKSIZE,fin_mes);
A_star[fin_mes] = 0x80;
memset(M_star+fin_mes+1,0,BLOCKSIZE-(fin_mes+1));
M = _mm_load_si128(M_star);
idx = _mm_set_epi64x(tag_fin,numblocks_mes); // both inputs are unsigned long long
tmp = encrypt_block(M,idx); // Contains calls to AES
tag = _mm_xor_si128(tag,tmp);
}
// print128_asint(tag);
tag = encrypt_block(tag,nonce);
// Following line causes segfault
_mm_store_si128( (__m128i *)&c[numblocks_mes*BLOCKSIZE+fin_mes], tag ); // numblocks_mes*BLOCKSIZE+fin_mes = 161
我之前曾尝试浏览过其他类似的问题,并进行了尝试,但我还没有找到对我有用的东西。
目的地址需要16字节对齐。由于 c[]
本身没有特定的对齐方式,因此无法保证 c
内任意偏移量的地址(即使这些偏移量是 16 的倍数)。
解决方案:使用_mm_storeu_si128
代替_mm_store_si128
。
请注意,您似乎也很幸运地加载了 m
和 Mstar
- 您几乎肯定应该将它们更改为使用 _mm_loadu_si128
.
当我尝试加载我使用内在函数生成的一些密文时出现段错误。我根本不明白这个错误。代码示例:
unsigned char c[177];
unsigned char m[161];
auth = _mm_setzero_si128();
unsigned char M_star[BLOCKSIZE];
__m128i tag = auth;
for(i=0;i<numblocks_mes;++i)
{
M = _mm_load_si128(m+i*BLOCKSIZE);
idx = _mm_set_epi64x(zero,i); // both inputs are unsigned long long
tmp = encrypt_block(M,idx);
tag = _mm_xor_si128(tag,tmp);
}
if(fin_mes)
{
memcpy(M_star,m+numblocks_mes*BLOCKSIZE,fin_mes);
A_star[fin_mes] = 0x80;
memset(M_star+fin_mes+1,0,BLOCKSIZE-(fin_mes+1));
M = _mm_load_si128(M_star);
idx = _mm_set_epi64x(tag_fin,numblocks_mes); // both inputs are unsigned long long
tmp = encrypt_block(M,idx); // Contains calls to AES
tag = _mm_xor_si128(tag,tmp);
}
// print128_asint(tag);
tag = encrypt_block(tag,nonce);
// Following line causes segfault
_mm_store_si128( (__m128i *)&c[numblocks_mes*BLOCKSIZE+fin_mes], tag ); // numblocks_mes*BLOCKSIZE+fin_mes = 161
我之前曾尝试浏览过其他类似的问题,并进行了尝试,但我还没有找到对我有用的东西。
目的地址需要16字节对齐。由于 c[]
本身没有特定的对齐方式,因此无法保证 c
内任意偏移量的地址(即使这些偏移量是 16 的倍数)。
解决方案:使用_mm_storeu_si128
代替_mm_store_si128
。
请注意,您似乎也很幸运地加载了
m
和 Mstar
- 您几乎肯定应该将它们更改为使用 _mm_loadu_si128
.