gcc C *** Обнаружено разрушение стека *** массив - PullRequest
0 голосов
/ 09 января 2012

Строка кода, вызывающая проблему:

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_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

1 Ответ

3 голосов
/ 09 января 2012

char command_tb[] = "" определяет массив символов размером 1, содержащий только завершающий нулевой символ.
strcat(command_tb,command_tb_temp[i]); затем записывает данные в него.
Но он записывает больше данных, чем может содержать, что приводит к повреждению других частейпамяти.

Вы должны сделать его достаточно большим.

Также желательно не использовать strcat, strcpy, поскольку они могут легко превысить буфер.Лучше используйте strncpy в других, которые получают размер буфера и больше не пишут.Вы по-прежнему несете ответственность за обеспечение правильного размера.
Но остерегайтесь strncat - значение его параметра размера вводит в заблуждение, поэтому внимательно прочитайте его документацию или просто избегайте его использования.

...