我创建了一个调用第三方代码的C++包装器,它碰巧以损坏的内存结束。所以我怀疑C++中的代码可能不是合法的
下面是崩溃的代码:
void Init_4bit_tab(unsigned char *dest,unsigned char *source)
{
unsigned char masque,i;
masque=0x08;
for(i=0; i<4; i++) {
dest[i] = (*source & masque)>>(3-i);
masque >>= 1;
}
}
准确的错误是:
试图读取或写入受保护的内存。这通常表示其他内存已损坏。
更新:
扫描第三方代码后,由于传递的方式,它看起来是多维数组,但我仍然不确定是什么导致了问题:
源函数
unsigned char Data_B[81];
...
S_Box_Calc(&Data_B[33]);
void S_Box_Calc(unsigned char *vect)
{
unsigned char *S_Box[8];
unsigned lig,col,i;
S_Box[0]=S1;
S_Box[1]=S2;
S_Box[2]=S3;
S_Box[3]=S4;
S_Box[4]=S5;
S_Box[5]=S6;
S_Box[6]=S7;
S_Box[7]=S8;
for(i=0;i<8;i++) {
col= 8*vect[1+6*i] + 4*vect[2+6*i] + 2*vect[3+6*i] + vect[4+6*i];
lig= 2*vect[6*i] + vect[5+6*i];
Init_4bit_tab(&vect[4*i],&S_Box[i][col+lig*16]);
}
}
更新2:
我检查了调试模式下的值dest和source不为空。但是,如果我试图在这个代码dest[I]=(*source&masque)>>(3-I)下快速查看(*source&masque);
我知道这个错误
(*source&masque)错误:&cannot be performed on'*source'and'masque'
更新3:
S1…Sn最初是在文件的全局作用域上定义的,但是当我保持原样时得到一个错误,所以我以这种方式在构造函数中初始化它们:
unsigned char lS1[64] = {
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
};
std::copy(S1, S1 + 64, lS1);
这可能是问题所在吗?
最佳答案
你显示的代码没有问题,如果它通过了
有效指针。如果它破坏了记忆,可能是
因为调用方没有传递有效的指针。
编辑后:如果用等于S_Box_Calc
,如您所示,范围vect
是
合法,这意味着Data_B + 33
不应该被调用
其值高于44。事实上,在你展示的代码中
从不使用大于28的值调用,因此您不应该
破坏这里的记忆。但是,如果有任何[vect, vect+48)
到Init_4bit_tab
,请执行
没有有效的记忆,你会得到你所说的症状。