导致问题的代码行是
char command_tb_temp[][1000]={"gcc -Wall ","-o3 -ftree-ccp -fno-align-jumps "," Scripts/*.c -o output -lm && time -f \"%e\" -o TB.log ./output 1.dat"};
当通过仅提供如下的1个优化选项来编写相同的代码时,它不会返回任何错误。
char command_tb_temp[][1000]={"gcc -Wall ","-o3 -ftree-ccp "," Scripts/*.c -o output -lm && time -f \"%e\" -o TB.log ./output 1.dat"};
请帮我解决这个问题。任何帮助都非常感谢。 三江源。
继承全部功能..
int findtb(int flag)
{
printf("debug -1-1-1");
char command_tb_temp[][1000]={"gcc -Wall ","-o3 -ftree-ccp -fno-align-jumps "," Scripts/*.c -o output -lm && time -f \"%e\" -o TB.log ./output 1.dat"};
char command_tb[]="",line[100];
if(var[initial].exetime>0.00&&flag==1)
{
if(var[initial].rip<0.00)
strcat(finalop,var[initial].name);
else
return 0;
}
strcpy(command_tb_temp[1],finalop);
//strcat(command_tb_temp[1]," -ftree-ccp ");
for(int i=0;i<3;i++)
strcat(command_tb,command_tb_temp[i]);
printf("***** %s ****",command_tb);
system(command_tb);
fp=fopen("TB.log","r");
fscanf(fp,"%s",line);
tb=atof(line);
printf("\nTb=%f\n",tb);
fclose(fp);
return 1;
}
错误是......
*** stack smashing detected ***: ./3 terminated
答案 0 :(得分:3)
char command_tb[] = ""
定义一个大小为1的字符数组,只包含一个终止空字符
strcat(command_tb,command_tb_temp[i]);
然后将数据写入其中
但是它写的数据比它能容纳的数据多,从而破坏了内存的其他部分。
你应该把它做得足够大。
此外,建议不要使用strcat
,strcpy
,因为它们很容易超过缓冲区。最好在其他地方使用strncpy
,这样可以获得缓冲区大小并且不会写更多内容。提供合适的尺寸仍然是您的责任
但要小心strncat
- 其大小参数的含义具有误导性,因此请仔细阅读其文档,或者只是避免使用它。