C++ 这在C+中是否合法+;?
我创建了一个调用第三方代码的C++/CLI包装器,该代码恰好以损坏的内存结束。所以我怀疑这个代码在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++) {
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);