我创建了一个调用第三方代码的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,请执行
没有有效的记忆,你会得到你所说的症状。

07-24 09:43
查看更多