繁体   English   中英

gcc C ***检测到堆栈粉碎***数组

[英]gcc C ***stack smashing detected*** array

导致问题的代码行是

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 

char command_tb[] = ""定义一个大小为1的字符数组,仅包含一个终止的空字符。
strcat(command_tb,command_tb_temp[i]); 然后向其中写入数据。
但是它写入的数据超出了它的存储能力,从而破坏了内存的其他部分。

您应该使它足够大。

另外,建议不要使用strcatstrcpy ,因为它们很容易超出缓冲区。 最好在其他地方使用strncpy ,这样可以得到缓冲区的大小并且不会写更多。 提供合适的尺寸仍然是您的责任。
但是要注意strncat它的size参数的含义会误导您,因此请strncat阅读其文档,或者只是避免使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM