为什么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足够大的时候就会溢出."