为什么vs2019在函数执行结束的时候还提示:运行 time check failure # - stack around the variable 'binR' was corrupted
Why do vs2019 still prompt at the end of function execution: run time check failure # - stack around the variable 'binR' was corrupted
我的程序使用套接字通信进行无意的传输。希望得到128个无意中同时传输的随机字符串。如何选择 0 和 1 是由输入字符串的每一位的 0 和 1 值决定的。基于以上想法,我做了这个程序。
对于函数get_reuse_rule(),我要输入一个16位的字符串(包括'\0'17位)和return上述128个ot字符串的异或值之和。
不幸的是,出现了运行时错误,但我仍然可以得到最终的异或。
这里我展示代码
int main(){
socket_conn();
char *rule1="networkingjjjjjj";//小于16 (10)
char re_rule[17];
memset(re_rule, 0, sizeof(re_rule));
get_reuse_rule(rule1, re_rule);
socket_clean();
system("pause");
return 0;
}
误差函数
void get_reuse_rule(char *rule,char *re_rule) {
int binR[128];
memset(binR, 0, sizeof(binR));
get_arraized_rule(rule, binR);
//根据规则进行ot确认key_array
char ki[128][17];
memset(ki, 0, sizeof(ki));
for (int i = 0; i < 128; i++) printf("%d", binR[i]);
printf("\n");
ot_128_get(ki, binR);
for (int i = 0; i < 128; i++) {
printf("%s\n", ki[i]);
}
printf("%d\n", strlen(ki[127]));
//得到了对应的一组ki与规则进行异或加密规则
char Irule[17];//可重用的规则
memset(Irule, 0, sizeof(Irule));
for (int i = 0; i < 128; i++) {
for (int j = 0; j < 16; j++) {
Irule[j] = Irule[j] ^ ki[i][j];
}
}
printf("\n%s\n", Irule);
memcpy(re_rule, Irule, sizeof(Irule));
//memset(ki, 0, sizeof(ki));
}
另一个叫Ki的函数,我在main函数里测试没问题
void ot_128_get(char (*choose_ki)[17],int *bin_rule) {
for (int i = 0; i < 128; i++) {
ot_get_msg(choose_ki[i], bin_rule[i]);
printf("%d\n", i);
}
printf("\not all is ok!\n");
}
ot_get_msg(choose_ki[i], bin_rule[i]):
根据第二个参数为0或1来接收无心传输,第一个参数为return值
我通过搜索引擎搜索了一下,提到这个问题可能是数组越界引起的,但我认为我的程序中没有数组越界。如果你知道如何解决这个问题,请给我留言。感谢您的阅读。
------------------------新更新---------------- --------------
我写了一个几乎一样的功能。我把可能出错的局部变量放到了main函数中。其他一切都没有改变。当我不关闭程序时,我不会报错。关闭程序也会出现同样的错误,不过这次错误报告是在main函数的最后。
----------------ot_get_msg------------------------
void ot_get_msg(char *get_msg,int choose) {
//int choose = 1;//先写死选择1
int r;
char buf[1024];
memset(buf, 0, sizeof(buf));
r= recv(clientSocket1, buf, 1023, NULL);
//printf("%s", buf);//n/e/rmsg1/rmsg2
char* p[4];
p[0] = strtok(buf, "/");
p[1] = strtok(NULL, "/");
p[2] = strtok(NULL, "/");
p[3] = strtok(NULL, "/");
//strtok(NULL, "/");
char v[100];
char k[100];
memset(v, 0, sizeof(v));
memset(k, 0, sizeof(k));
ot_recv_compute_v(v, k, p[0], p[1], p[2], p[3],choose);
//printf("V:%s\n", v);
//printf("K:%s\n", k);
//把v发送给client
send(clientSocket1, v, strlen(v), NULL);
char buf2[1024];
memset(buf2, 0, sizeof(buf2));
recv(clientSocket1, buf2, 1023, NULL);
char* enmsg[2];
enmsg[0] = strtok(buf2, "/");
enmsg[1] = strtok(NULL, "/");
//解密
char demsg1[100];
char demsg2[100];
memset(demsg1, 0, sizeof(demsg1));
memset(demsg2, 0, sizeof(demsg2));
ot_decode_msg(demsg1, demsg2, enmsg[0], enmsg[1], k);
//printf("%s\n", demsg1);
//printf("%s\n", demsg2);
if (choose == 0) {
memcpy(get_msg, demsg1,sizeof(demsg1));
}
else {
memcpy(get_msg, demsg2,sizeof(demsg2));
}
//closesocket(servSOCKET);
}
错误代码Run-Time Check Failure #2 - Stack around the variable 'ki' was corrupted.
我想我已经找到了使程序 运行 没有错误的方法。中文版如下here.
set:project > Configuration Properties > C/C++ -> code generation > Basic 运行时间检查为默认值
原来的猜测是:“当项目达到一定规模时,程序员会占用大量的堆栈。我也深有体会。因为我本来写了一个class,没有运行时出错,但是在添加成员属性的时候,用其他方式很容易出现这样的错误,所以我猜测是vs内部限制了栈的大小,当item足够大的时候就会溢出."
我的程序使用套接字通信进行无意的传输。希望得到128个无意中同时传输的随机字符串。如何选择 0 和 1 是由输入字符串的每一位的 0 和 1 值决定的。基于以上想法,我做了这个程序。
对于函数get_reuse_rule(),我要输入一个16位的字符串(包括'\0'17位)和return上述128个ot字符串的异或值之和。
不幸的是,出现了运行时错误,但我仍然可以得到最终的异或。
这里我展示代码
int main(){
socket_conn();
char *rule1="networkingjjjjjj";//小于16 (10)
char re_rule[17];
memset(re_rule, 0, sizeof(re_rule));
get_reuse_rule(rule1, re_rule);
socket_clean();
system("pause");
return 0;
}
误差函数
void get_reuse_rule(char *rule,char *re_rule) {
int binR[128];
memset(binR, 0, sizeof(binR));
get_arraized_rule(rule, binR);
//根据规则进行ot确认key_array
char ki[128][17];
memset(ki, 0, sizeof(ki));
for (int i = 0; i < 128; i++) printf("%d", binR[i]);
printf("\n");
ot_128_get(ki, binR);
for (int i = 0; i < 128; i++) {
printf("%s\n", ki[i]);
}
printf("%d\n", strlen(ki[127]));
//得到了对应的一组ki与规则进行异或加密规则
char Irule[17];//可重用的规则
memset(Irule, 0, sizeof(Irule));
for (int i = 0; i < 128; i++) {
for (int j = 0; j < 16; j++) {
Irule[j] = Irule[j] ^ ki[i][j];
}
}
printf("\n%s\n", Irule);
memcpy(re_rule, Irule, sizeof(Irule));
//memset(ki, 0, sizeof(ki));
}
另一个叫Ki的函数,我在main函数里测试没问题
void ot_128_get(char (*choose_ki)[17],int *bin_rule) {
for (int i = 0; i < 128; i++) {
ot_get_msg(choose_ki[i], bin_rule[i]);
printf("%d\n", i);
}
printf("\not all is ok!\n");
}
ot_get_msg(choose_ki[i], bin_rule[i]):
根据第二个参数为0或1来接收无心传输,第一个参数为return值
我通过搜索引擎搜索了一下,提到这个问题可能是数组越界引起的,但我认为我的程序中没有数组越界。如果你知道如何解决这个问题,请给我留言。感谢您的阅读。
------------------------新更新---------------- --------------
我写了一个几乎一样的功能。我把可能出错的局部变量放到了main函数中。其他一切都没有改变。当我不关闭程序时,我不会报错。关闭程序也会出现同样的错误,不过这次错误报告是在main函数的最后。
----------------ot_get_msg------------------------
void ot_get_msg(char *get_msg,int choose) {
//int choose = 1;//先写死选择1
int r;
char buf[1024];
memset(buf, 0, sizeof(buf));
r= recv(clientSocket1, buf, 1023, NULL);
//printf("%s", buf);//n/e/rmsg1/rmsg2
char* p[4];
p[0] = strtok(buf, "/");
p[1] = strtok(NULL, "/");
p[2] = strtok(NULL, "/");
p[3] = strtok(NULL, "/");
//strtok(NULL, "/");
char v[100];
char k[100];
memset(v, 0, sizeof(v));
memset(k, 0, sizeof(k));
ot_recv_compute_v(v, k, p[0], p[1], p[2], p[3],choose);
//printf("V:%s\n", v);
//printf("K:%s\n", k);
//把v发送给client
send(clientSocket1, v, strlen(v), NULL);
char buf2[1024];
memset(buf2, 0, sizeof(buf2));
recv(clientSocket1, buf2, 1023, NULL);
char* enmsg[2];
enmsg[0] = strtok(buf2, "/");
enmsg[1] = strtok(NULL, "/");
//解密
char demsg1[100];
char demsg2[100];
memset(demsg1, 0, sizeof(demsg1));
memset(demsg2, 0, sizeof(demsg2));
ot_decode_msg(demsg1, demsg2, enmsg[0], enmsg[1], k);
//printf("%s\n", demsg1);
//printf("%s\n", demsg2);
if (choose == 0) {
memcpy(get_msg, demsg1,sizeof(demsg1));
}
else {
memcpy(get_msg, demsg2,sizeof(demsg2));
}
//closesocket(servSOCKET);
}
错误代码Run-Time Check Failure #2 - Stack around the variable 'ki' was corrupted.
我想我已经找到了使程序 运行 没有错误的方法。中文版如下here.
set:project > Configuration Properties > C/C++ -> code generation > Basic 运行时间检查为默认值
原来的猜测是:“当项目达到一定规模时,程序员会占用大量的堆栈。我也深有体会。因为我本来写了一个class,没有运行时出错,但是在添加成员属性的时候,用其他方式很容易出现这样的错误,所以我猜测是vs内部限制了栈的大小,当item足够大的时候就会溢出."