这在C ++中是否合法?

时间:2013-09-26 09:08:46

标签: c++ c c++-cli

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

这可能是问题吗?

3 个答案:

答案 0 :(得分:0)

这是完全合法的C ++语法,它编译。检查它是否在语义上正确。唯一可以无意中踏入UB区域的地方是访问dest指针,即它所指向的数组至少应该是指向它的4个字符长。此外,由于错误涉及访问冲突,请确保dest指向可写内存位置。

答案 1 :(得分:0)

您显示的代码没有问题,如果传递它 有效的指针。如果它破坏了记忆,那很可能 因为调用者没有传递有效指针。

修改后:如果调用S_Box_Calcvect等于 Data_B + 33,正如您所示,范围[vect, vect+48)是 合法,这意味着不应该调用Init_4bit_tab 具有超过44的值。实际上,在您展示的代码中,它 从不使用大于28的值调用,因此您不应该这样做 在这里腐蚀记忆。但是,如果S1S8中的任何一个,那么 没有指向有效的记忆,你会得到你说的症状。

答案 2 :(得分:0)

您的溢出检查在哪里?您应该将大小传递给函数,以便在存在溢出的情况下限制对内存的写入。它类似于BSD中的strcpy()与strncpy()或strlcpy()。也许如果你沿着那些行实现某些东西并产生一个错误,其中存在写入的内存否则会溢出的情况,你可能会发现内存损坏的原因。