2014-01-13 35 views
0

所以我想编码一个AESNI库。当我用符号编译我的程序并在GDB中运行它时。我收到以下错误:GDB在报告EXC_BAD_ACCESS时,操纵SSE2寄存器

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: 13 at address: 0x0000000000000000 

代码:(g++ -g aesni.c -o aesni; gdb aesni)

int main (int argc, const char *argv[]) 
{ 

// Nr = 10 (128bit), 12 (192bit), 14 (256bit) 

__attribute__((aligned (16))) unsigned char Key128bit[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c, 0x00 }; 

__attribute__((aligned (16))) unsigned char Key192bit[] = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 
                  0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b, 0x00 }; 

__attribute__((aligned (16))) unsigned char Key256bit[] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 
                  0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4, 0x00 }; 

char Nr = 10; // 128bit/12 for 192bit/14 for 256bit 

//__m128i *KeySchedule = new __m128i[Nr+1]; 
__m128i *KeySchedule = (__m128i*)(Nr+1); 

switch(Nr+1) 
{ 
    case 11: 
    KeySchedule[0] = _mm_load_si128((__m128i*)Key128bit); 
    break; 
    case 13: 
    break; 
    case 15: 
    break; 
} 

} 

所以,我有我的断点设置在第33行

程序编译没有错误,但它卡住了,当我尝试在GDB中逐步完成。

+2

是11真的有效__m128i指针? – molbdnilo

+0

@egur它在键的声明中对齐。就像我说的我没有收到任何编译错误。 – Nocturnal

+0

在这里强制转换:'__m128i * KeySchedule =(__m128i *)(Nr + 1);'掩盖了一个编译器警告,否则将会直接导致您的错误。 –

回答

2

变化:

__m128i *KeySchedule = (__m128i*)(Nr+1); // this declaration is completely broken 

到:

__m128i KeySchedule[Nr+1]; // allocate array of (Nr+1) x __m128i 
+0

如果密钥大小不同,是否有办法声明它更具动态性? – Nocturnal

+1

@Nocturnal你出于某种原因评论你自己的方式。 – molbdnilo

1

KeySchedule指向的地址是11,这是一个无效的地址,您稍后将使用它来存储SSE加载的结果。 。 char Nr = 10; KeySchedule =(__m128i *)(Nr + 1);