C++ 这在C+中是否合法+;?

C++ 这在C+中是否合法+;?,c++,c,c++-cli,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++) {

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

这是问题吗?

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

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

编辑后:如果调用
S\u Box\u计算时
vect
等于
Data\u B+33
,如您所示,范围
[vect,vect+48)
为 legal,这意味着不应调用
Init_4bit_选项卡
值大于44。事实上,在您显示的代码中 从未使用大于28的值调用,因此您不能 损坏此处的内存。但是,如果
S1
S8
中的任何一个
如果没有指向有效内存,您将得到您声明的症状。

溢出检查在哪里?您应该向函数传递大小,以便在内存可能溢出时限制对内存的写入。这与strcpy()与strncpy()或strlcpy()类似在BSD中。如果您按照这些行实现某些内容,并在存在写入的内存可能溢出的情况下生成错误,您可能会找到内存损坏的原因。

听起来像是
dest
指向的内存不够有效/大。source=nullptr也会导致崩溃声明是什么
S1
S2
等的定义?@legends2k S1,S2包含无符号字符数组,无符号字符S1[64]@user2817517和
Data\u B
的内容是什么?在该代码中,
vect
既是一个输入变量又是一个输出变量,根据其内容计算
Sn
的索引。(代码在我看来很可疑:它以6步的步骤阅读
vect
,以
4步的步骤编写。但是没有更多的上下文,谁知道呢?“合法的C++”!=“编译C++”“未定义的行为”当你有一个非法程序,它不违反编译器可以检测到的任何规则。@ SEBASTANTILL:从C++标准:C++中的C++代码,静态或外部说明符只能应用于对象或函数的名称。错误。非法只是意味着根据语言语法它是无效的。因此,
未定义的行为
如果它是无效的,就不会发生,因为它从一开始就不会编译。非法实际上并不意味着什么。这是“非法”的唯一用法在标准中,它在非规范性附录C中。@legends2k你为什么这么说。语言语法中无效的程序的术语是格式错误的。格式错误的程序是非法的,但它们不是唯一非法的程序。有些规则不需要诊断。在编辑3时,我试着查看t在std::copy之后,构造函数没有正确地将lSn复制到Sn,相反,它们都变成了0xcd字符
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]);
              }
        }
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);