gpt4 book ai didi

c++ - 这在 C++ 中合法吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:48:04 25 4
gpt4 key购买 nike

我创建了一个调用第三方代码的 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;
}
}

确切的错误是:尝试读取或写入 protected 内存。这通常表明其他内存已损坏。

更新:

扫描第三方代码后,它似乎是多维数组,因为它是通过的方式,但我仍然不确定是什么导致了问题:

源函数

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:我在 Debug模式下检查了 dest 和 source 不为空的值。但是,如果我尝试在此代码下快速观看 (*source & masque) dest[i] = (*source & masque)>>(3-i);

我收到这个错误

(*source & masque) 错误:& 不能在 '*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);

这会是问题所在吗?

最佳答案

你显示的代码没有问题,如果通过有效的指针。如果它正在破坏内存,则可能是因为调用者没有传递给它有效的指针。

编辑后:如果调用 S_Box_Calcvect 等于Data_B + 33,如您所示,范围 [vect, vect+48) 是合法,这意味着不应调用 Init_4bit_tab值高于 44。事实上,在您显示的代码中,它永远不会用大于 28 的值调用,所以你不应该能够破坏这里的内存。但是,如果 S1S8 中的任何一个,请执行没有指向有效的内存,你会得到你所说的症状。

关于c++ - 这在 C++ 中合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19023911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com