我创建了一个调用第三方代码的C ++ / CLI包装器,它恰好以损坏的内存结束。所以我怀疑可能代码在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不为null。但是如果我试图在这段代码下快速观察(*源和面具)dest [i] =(* source&amp; masque)&gt;&gt;(3-i);
我收到此错误
(* source&amp; masque)错误:&amp;无法在'* source'和'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);
这可能是问题吗?
答案 0 :(得分:0)
这是完全合法的C ++语法,它编译。检查它是否在语义上正确。唯一可以无意中踏入UB区域的地方是访问dest
指针,即它所指向的数组至少应该是指向它的4个字符长。此外,由于错误涉及访问冲突,请确保dest
指向可写内存位置。
答案 1 :(得分:0)
您显示的代码没有问题,如果传递它 有效的指针。如果它破坏了记忆,那很可能 因为调用者没有传递有效指针。
修改后:如果调用S_Box_Calc
且vect
等于
Data_B + 33
,正如您所示,范围[vect, vect+48)
是
合法,这意味着不应该调用Init_4bit_tab
具有超过44的值。实际上,在您展示的代码中,它
从不使用大于28的值调用,因此您不应该这样做
在这里腐蚀记忆。但是,如果S1
到S8
中的任何一个,那么
没有指向有效的记忆,你会得到你说的症状。
答案 2 :(得分:0)
您的溢出检查在哪里?您应该将大小传递给函数,以便在存在溢出的情况下限制对内存的写入。它类似于BSD中的strcpy()与strncpy()或strlcpy()。也许如果你沿着那些行实现某些东西并产生一个错误,其中存在写入的内存否则会溢出的情况,你可能会发现内存损坏的原因。