Пишется ЯДЕРНЫЙ МОДУЛЬ.
Вообщем надо было реализовать склеивание двух строк char*.
Написал пару функций, одна непосредственно для соединения,
вторая оперирует первой в зависимости от параметров.
Запускаю, смотрю вывод, и вижу в нём вместе с исходными
элементами мусор, по типу символо: " ! , и др.
Решил вынести всё это в отдельный сишник и разобраться.
Определился глюк такого плана. Выглядит это так:
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
*** glibc detected *** free(): invalid next size (fast): 0x0804a028 ***
Aborted
Код такой:
#include <stdio.h>
#include <stdlib.h>
char *out = NULL;
char *addstr(char *first, char *second)
{
int i, k, len_first, len_second;
char *ret;
if(!first) return 0;
if(!second) return 0;
k = 0;
len_first = strlen(first);
len_second = strlen(second);
ret = malloc(sizeof(char[len_first + len_second]));
for(i = 0; i < len_first; i++)
{
ret[i] = first[i];
}
for(i = len_first; i < (len_first + len_second); i++)
{
ret[i] = second[k];
k++;
}
printf("%s\n",ret);
return ret;
}
int netfw_add_to_out(char *a, char *b)
{
char *temp;
if(a == 0)
{
temp = addstr(out,b);
if(!temp) return 0;
if(out) free(out);
out = malloc(sizeof(char[strlen(out)+strlen(b)]));
}
else if(a != 0)
{
temp = addstr(a,b);
if(!temp) return 0;
if(out) free(out);
out = malloc(sizeof(char[strlen(a)+strlen(b)]));
}
out = strcpy(out,temp);
free(temp);
return 0;
}
int main(int argc, char *argv[])
{
netfw_add_to_out("1","2");
netfw_add_to_out(0,"3");
netfw_add_to_out(0,"4");
netfw_add_to_out(0,"5");
netfw_add_to_out(0,"6");
netfw_add_to_out(0,"7");
netfw_add_to_out(0,"8");
netfw_add_to_out(0,"9");
netfw_add_to_out(0,"10");
netfw_add_to_out(0,"11");
netfw_add_to_out(0,"3");
netfw_add_to_out(0,"4");
netfw_add_to_out(0,"5");
netfw_add_to_out(0,"6");
netfw_add_to_out(0,"7");
netfw_add_to_out(0,"8");
netfw_add_to_out(0,"9");
netfw_add_to_out(0,"10");
netfw_add_to_out(0,"11");
printf("out = %s\n",out);
return EXIT_SUCCESS;
}
Начал изучать. Одиннадцать вызовов netfw_add_to_out не случайны,
если их меньше, то такой ошибки нет, в модуле ошибка проявляется
в зависании всей системы, видимо сегфолт. И вот что интересно,
если закоментировать if(out) free(out) в этом куске:
if(a == 0)
{
temp = addstr(out,b);
if(!temp) return 0;
// if(out) free(out);
out = malloc(sizeof(char[strlen(out)+strlen(b)]));
}
То глюк пропадает, но при этом, если я правильно понял, будет засорятся
память. Это подтверждается, если вызовов указанной выше функции будет 22.
Вот что выходит:
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
12345678910113
123456789101134
1234567891011345
12345678910113456
123456789101134567
1234567891011345678
12345678910113456789
12345678910113456789!10
12345678910113456789!1011
out = 12345678910113456789!1011
Как видно на последних трёх строчках появились "!", но они ни разу не указывались,
проверял несколько раз поиском :) их нет, значит это ошибка с выделением памяти.
Как я уже сказал, это если указанная выше строчка закоментирована, без комента
будет уже описанная ошибка *** glibc detected ***.
Вот собсно и вопрос - что не так и что делать!?
P.S. КОД ПИШЕТСЯ ДЛЯ МОДУЛЯ ПОЭТОМУ СТОРОННИЕ ЛИБЫ НЕ ПРИМЕНИМЫ!!!
Заранее спасибо!!!