1

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

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

更新:

扫描第 3 方代码后,由于它的传递方式,它似乎是多维数组,但我仍然不确定是什么导致了问题:

源函数

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 不为空的值。但是,如果我尝试在此代码下快速观看 (*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);

这可能是问题吗?

4

3 回答 3

0

你的溢出检查在哪里?如果有可能溢出,您应该将大小传递给您的函数,以允许您限制对内存的写入。它类似于 BSD 中的 strcpy() 与 strncpy() 或 strlcpy()。也许如果您按照这些思路实现某些东西并在内存写入会溢出的情况下生成错误,您可能会找到内存损坏的原因。

于 2013-09-26T10:11:56.460 回答
0

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

于 2013-09-26T09:11:13.040 回答
0

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

编辑后:如果使用等于 S_Box_Calc调用,如您所示,范围是合法的,这意味着不应使用高于 44 的值调用它。事实上,在您显示的代码中,它永远不会使用值调用大于 28,所以你不应该在这里破坏内存。但是,如果通过中的任何一个不指向有效记忆,您就会得到您所说的症状。vectData_B + 33[vect, vect+48)Init_4bit_tabS1S8

于 2013-09-26T09:30:38.647 回答