好的,所以有很多堆栈粉碎检测到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);
}
由于程序流程在返回语句之前到达打印函数,并且在检测到堆栈粉碎之后可能会出现这种情况的原因
我尝试使用gdb调试器,但显示
编程接收信号SIGABRT,已中止。 来自/usr/lib/libc.so.6的raise()中的0x00007ffff7a55860
任何人都可以帮我找出(或任何方法找出)这个错误的原因(我不认为它是因为缓冲区溢出或其他东西,因为它达到了打印功能)
由于
答案 0 :(得分:0)
发现了大错误,strcat没有将T字符串复制到TT但是通过引用做了一些事情。
因为这个指针被引用在函数框架中创建的东西,它在函数结束后销毁它会抛出错误。
由于字符数组基本上是一个指针,只要函数返回指针就会变成垃圾值并出现错误。