0

好的,所以在 stackoverflow 上有很多堆栈粉碎检测到的问题,我查看了其中的 6-7 个,但无法清除我的问题。

我在 C 中有一个名为 encryptor 的 void 函数,它接受一个 char 数组,并更新该数组。

void encryptor(char* m,char* K){
    char T[5] = "1011\0"; // added the last '\0'
    int l = countOnes(K);
    for (int i=0; i<l; i=i+1){
        char TT[33];
        TT[32] = '\0'; // Last character is '\0'
        strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); // 8 times
        string_xor(m,TT,m);
        addOne(T);
    }
    printf("%s\n", m); // <======*** This print is working
    // The output of print is correct encrypted bitstring 
    // of length 32 : 11011101110111011101110111011101
    return;
}

这是相应的 int 主要代码:

int main(){
    char message[33] = "11001100110011001100110011001100";
    message[32]='\0';
    char key[33] = "00100010001000100010001000100011";
    key[32]='\0';
    // encryptor takes a 32 bitstring and uses key to encrypt it
    // All other functions in encryptor are working and even m is being updated 
    encryptor(message,key);
}

由于程序流在 return 语句之前到达 print 函数,并且在检测到堆栈粉碎之后,这可能是什么原因

我尝试使用 gdb 调试器,但它显示

程序收到信号 SIGABRT,已中止。0x00007ffff7a55860 in raise () from /usr/lib/libc.so.6

任何人都可以帮助我找出(或任何方式找出)这个错误的原因(我不认为它是因为缓冲区溢出或到达打印功能的东西)

谢谢

4

1 回答 1

1

发现了大错,strcat 不会将 T 字符串复制到 TT 而是通过引用做一些事情。

并且由于这个指针被引用到在函数框架中创建的东西,它在函数结束后销毁它会引发错误。

由于字符数组基本上是一个指针,所以一旦函数返回,指针就会变成垃圾值并且错误就来了。

于 2018-03-10T10:28:18.543 回答