在 JNI Android 的 C++ 中使用 memset 时检测到堆栈损坏
stack corruption detected when use memset in c++ from JNI Android
我正在使用 C++ 本机代码开发 Android 应用程序。
我有 C++ 代码(C++ 本机中的 XTTEA 算法),它可以与 C++ 编译器完美地在线运行,我可以获得输出,但是当我尝试使用 JNI cpp class 方法时 class,它给我以下错误:
A/libc: stack corruption detected (-fstack-protector)
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 13328 (example.ndkdemo), pid 13328 (example.ndkdemo)
下面是我将数据作为输入传递的 JNI cpp 代码。
extern "C" JNIEXPORT jint JNICALLJava_com_example_ndkdemo_MainActivity_encryptDataInt(JNIEnv *env, jobject thiz /* this */){
// return add(5,3);
int len;
unsigned char input[8] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
sg_xxtea_encrypt (input, 8);
return 1;
}
下面是我从上面的 JNI 代码调用的方法。我调试代码,发现错误发生在第一个 if
条件内的 memset()
函数中。
int
sg_xxtea_encrypt (unsigned char *data, int data_size)
{
int i = 0;
int block_size = ((data_size + 2) / 4 + 1) * 4;
memset (sg_data_buff, 0, ENCRYPT_INT_BUFF * 4);
if (block_size > data_size)
{
memset (&data[data_size], 0, block_size - data_size); // We get error in this line
}
for (i = data_size + 1; i >= 2; i--)
{
data[i] = data[i - 2];
}
data[0] = (data_size >> 8) & 0xff;
data[1] = (data_size >> 0) & 0xff;
for (i = 0; i < block_size / 4; i++)
{
sg_data_buff[i] = bytesTOint (&data[i * 4]);
}
TEA_EncryptCore (block_size, sg_data_buff, sg_key_buff);
for (i = 0; i < block_size / 4; i++)
{
intTobyte (sg_data_buff[i], &data[i * 4]);
}
return block_size;
}
任何人都可以建议可能是什么问题。
您的 input
数组是 8 个字节。 data
参数是指向input
的指针,data_size
参数是8,所以block_size
变量计算为12。你的memset()
写的是4 0x00
字节到 &data[data_size]
,又名 &input[8]
,超出了 input
数组的范围。因此,缓冲区溢出破坏了 input
数组周围的堆栈内存。
memset()
之后的后续 for
循环也在越界访问 input
数组的元素。
input
是固定大小的数组。访问其边界外的元素不会使其变大。
我正在使用 C++ 本机代码开发 Android 应用程序。
我有 C++ 代码(C++ 本机中的 XTTEA 算法),它可以与 C++ 编译器完美地在线运行,我可以获得输出,但是当我尝试使用 JNI cpp class 方法时 class,它给我以下错误:
A/libc: stack corruption detected (-fstack-protector)
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 13328 (example.ndkdemo), pid 13328 (example.ndkdemo)
下面是我将数据作为输入传递的 JNI cpp 代码。
extern "C" JNIEXPORT jint JNICALLJava_com_example_ndkdemo_MainActivity_encryptDataInt(JNIEnv *env, jobject thiz /* this */){
// return add(5,3);
int len;
unsigned char input[8] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };
sg_xxtea_encrypt (input, 8);
return 1;
}
下面是我从上面的 JNI 代码调用的方法。我调试代码,发现错误发生在第一个 if
条件内的 memset()
函数中。
int
sg_xxtea_encrypt (unsigned char *data, int data_size)
{
int i = 0;
int block_size = ((data_size + 2) / 4 + 1) * 4;
memset (sg_data_buff, 0, ENCRYPT_INT_BUFF * 4);
if (block_size > data_size)
{
memset (&data[data_size], 0, block_size - data_size); // We get error in this line
}
for (i = data_size + 1; i >= 2; i--)
{
data[i] = data[i - 2];
}
data[0] = (data_size >> 8) & 0xff;
data[1] = (data_size >> 0) & 0xff;
for (i = 0; i < block_size / 4; i++)
{
sg_data_buff[i] = bytesTOint (&data[i * 4]);
}
TEA_EncryptCore (block_size, sg_data_buff, sg_key_buff);
for (i = 0; i < block_size / 4; i++)
{
intTobyte (sg_data_buff[i], &data[i * 4]);
}
return block_size;
}
任何人都可以建议可能是什么问题。
您的 input
数组是 8 个字节。 data
参数是指向input
的指针,data_size
参数是8,所以block_size
变量计算为12。你的memset()
写的是4 0x00
字节到 &data[data_size]
,又名 &input[8]
,超出了 input
数组的范围。因此,缓冲区溢出破坏了 input
数组周围的堆栈内存。
memset()
之后的后续 for
循环也在越界访问 input
数组的元素。
input
是固定大小的数组。访问其边界外的元素不会使其变大。