按位异或以 SIGSEGV 结束
Bitwise XOR ends in SIGSEGV
我有一个函数可以执行简单的按位异或加密。它看起来像这样:
void maskData(char* data, int length)
{
for(int i = 0; i < length; i++)
{
int j = i % 4;
cout << bitset<8>(data[i]) << endl << bitset<8>(this->maskingKey[j]) << endl;
data[i] ^= this->maskingKey[j];
}
}
应用程序的输出是:
01010100
01001011
然后它就死了。我将 gdb
附加到它并发现引发了 SIGSEGV-Exception。
01010100
01001011
Program received signal SIGSEGV, Segmentation fault.
0x00000000004100ea in WebSocketLayer::WebSocketFrame::maskData (
this=0x7fffffffe190, data=0x423621 "This is a test", length=14)
at ../BoostTransport/WebSocketLayer.h:130
130 data[i] ^= this->maskingKey[j];
我真的不确定为什么会这样,我觉得一切正常。
编辑:更多代码:
void setData(char* data, int length)
{
this->maskData(data, length);
// ... ...
}
wf.setData("This is a test", strlen("This is a test"));
第一个运行直接循环失败,也就是说i
和j
都是0。
我敢打赌 data
指向一个常量。您不能修改常量,这就是使它们成为常量的原因。所以任何类似于 maskData("hello", 5);
的东西都是非法的。这也是非法的:
char *j = "This is a test";
maskData(j, strlen(j));
这里,j
指向一个常量。您不能修改常量。
我有一个函数可以执行简单的按位异或加密。它看起来像这样:
void maskData(char* data, int length)
{
for(int i = 0; i < length; i++)
{
int j = i % 4;
cout << bitset<8>(data[i]) << endl << bitset<8>(this->maskingKey[j]) << endl;
data[i] ^= this->maskingKey[j];
}
}
应用程序的输出是:
01010100
01001011
然后它就死了。我将 gdb
附加到它并发现引发了 SIGSEGV-Exception。
01010100
01001011
Program received signal SIGSEGV, Segmentation fault.
0x00000000004100ea in WebSocketLayer::WebSocketFrame::maskData (
this=0x7fffffffe190, data=0x423621 "This is a test", length=14)
at ../BoostTransport/WebSocketLayer.h:130
130 data[i] ^= this->maskingKey[j];
我真的不确定为什么会这样,我觉得一切正常。
编辑:更多代码:
void setData(char* data, int length)
{
this->maskData(data, length);
// ... ...
}
wf.setData("This is a test", strlen("This is a test"));
第一个运行直接循环失败,也就是说i
和j
都是0。
我敢打赌 data
指向一个常量。您不能修改常量,这就是使它们成为常量的原因。所以任何类似于 maskData("hello", 5);
的东西都是非法的。这也是非法的:
char *j = "This is a test";
maskData(j, strlen(j));
这里,j
指向一个常量。您不能修改常量。