LINUX.ORG.RU

То ли лыжи не едут, то ли malloc еб...й


0

0

вот такая проблемка:
определяю тип - структуру TUser ( c помощью typedef )

далее фрагмент кода:

void main()
{
TUser *user; /* а это и есть тот самый грёбаный указатель */
int i; /* счётчик */
...
...
...
printf("выделяем память...\n ");
user=malloc(sizeof(TUser)*i);
printf("Malloc Ok!\n");
}

ну дак вот проблема в седущем: когда i<=20
(приблизительно около 20+/-) тогда всё прокатывает!
т.е. вывод программы:

выделяем память...
Malloc Ok!

но если i>30 тогда вывод программы следущий:

выделяем память...
Segmentation fault

вот таки пироги ....
p.s. sizeof(TUser)==70 байт
простая арифметика- 70*30 == 2100 байт (а это не очень большой обём)

p.p.s Помогите есля можете


anonymous

Определённо пора запретить пионэрам на Цэ писать. Есть же
хорошие языки, которые не позволят так грязно ошибаться...

Тут явно где-то выход за пределы выделенной памяти, или
удаление невыделенного куска, или ещё что-то из типично сишного
дерьма. При чём - в любом месте программы, искать такие
баги очень сложно. Проявляется оно не сразу, а где попало,
и весьма часто - в потрохах у malloc(). В общем, настоятельно
рекомендую на дурацком язычке Цэ больше никогда не писать,
по крайней мере до тех пор, пока руки не выпрямишь.

Antichrist
()

Несколько маловато приведенного кода.

anonymous
()
Ответ на: комментарий от justme

2 justme & Antichrist:

>Тем не менее, он прав, и наезды от анонимусов этого не изменят.
You know when someone needs help, and you read the message there are only two things that are correct:
1) Try to help
2) Shut the fuck up and move to the next message

If you choose other options that means your reading this for the wrong reasons, to mock people, make em feel uncomfortable
etc. Than your place is with the flamers discussing Lin vs Win 
postings...

anonymous
()
Ответ на: комментарий от anonymous

А ты, ламо, типа не впилил, что лучшая помощь во всех таких случаях - совет не связываться с Си и подобными ему недоязычками? Ну поможешь ты ему, выискав ошибку с памятью или утечку - так ведь он на следующий день ещё с десяток таких багов насажает. Не зная засад недоязыков, и не представляя, как устроены правильные языки, за лабательство на Си браться не стоит. Ну а когда таки научишься программировать - то уже просто не захочется об Си пачкаться.

Antichrist
()

Дык ему Антихрист ясно сказал, какая тут скорее всего ошибка, и что она, вероятно, где-то в другом месте. Как ещё можно помочь, при условии, что мы не телепаты? Причём, это действительно типичная ошибка при программировании именно на С, в других языках она либо не возникает вообще, либо возникает намного реже.

А вот первый человек, который не сказал ничего конструктивного, а просто наехал, да ещё и анонимно, - это как раз были Вы.

justme
()

2 Antichrist:
А об корявый лисп хочется?

Havoc ★★★★
()

2Antichrist: Ты негони мужик. Любым инструментом (С например) нужно уметь пользоваться. Есть инструменты более опасные (плоскогубци в руках стоматолога) и менее.

Видимо С не для тебя.

На счет кода, то его маловато, чтобы разобраться. Давай больше.

Banshee
()

Вот только не надо аргументов типа "любой *знающий* программист". Ошибки делают все, и зачем я (или ты) должен тратить свои мозги и время на отлов ошибок, которые в других языках вообще бы не возникли или обнаружились бы гораздо раньше?

2OP: остальной код давай, тебя уже три человека попросили :)

justme
()

2Havoc: ты ламер. Завязывай выпендрёжь.

2Banshee: зачем пользоваться двухпудовой кувалдой для забивания гвоздей? Сволочной язычок Цэ - слишком неудобен для практического применения. Только ламер станет им пользоваться там, где можно взять что-то получше.

Antichrist
()

я ничего не имею против Си не считаю этот язык программирования "недоязыком", я так же не считаю себя ламером (это не бровада) , и пусть господа кул хацкеры простят меня за это, приведу часть программы:

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include"html.h"
#include"cgi_tools.h"
#include"global.h"
#include"my_date.h"
int t_pkts,t_bytes,t_port;
char t_ip[20];

int timer_wait=3;
int net_ci=0; //T╕╕-+╕ L+L╕T
char name_of_prog[30];
int quota_ci;
Tuser_quota *user_quota;
Tnet *user_net;
Tuser *user;
char tmp[256],tmp2[256];


char ip_stat1[80];
char ip_stat2[80];


FILE *quota,*nets,*setup,*ip_c,*f_users;
FILE *sync_i,*html;
int i=0,j=0,ci,c=0;
//time_t *times1;

void open_ip(int n)
{
char open_s[100];
if (n>quota_ci) return ;
sprintf(open_s,"ipchains -D %s -p tcp -s 0/0 %d -d %s -j DENY 2>> ./error_log",name_of_chanal2,user_quota[n].port,user_quota[n].ip);
system(open_s);
sprintf(open_s,"ipchains -I %s -p tcp -s 0/0 %d -d %s 2>> ./error_log",name_of_chanal1,user_quota[n].port,user_quota[n].ip);
system(open_s);
user_quota[n].flag=1;
printf("<--- (%d:%d) Open access for %s %d\n",get_data(HOUR),get_data(MINUTE),user_quota[n].ip,user_quota[n].port);
user_quota[n].download=0;
user_quota[n].today=0;

}

void close_ip(int n)
{
FILE *otchet;
char close_s[100];
if (n>quota_ci) return ;

sprintf(close_s,"ipchains -I %s -p tcp -s 0/0 %d -d %s -j DENY 2>> ./error_log",name_of_chanal2,user_quota[n].port,user_quota[n].ip);
system(close_s);
sprintf(close_s,"ipchains -D %s -p tcp -s 0/0 %d -d %s 2>> ./error_log ",name_of_chanal1,user_quota[n].port,user_quota[n].ip);
system(close_s);
if ((otchet=fopen("/etc/tcc/tmp/otchet","a"))!=NULL)
{
fprintf(otchet,"day=%d&month=%d&year=%d&ip=%s&port=%d& download=%d\n",get_data(DAY),get_data(MONTH),get_data(YEAR),user_quota[n].i p,user_quota[n].port,user_quota[n].download+user_quota[n].today);
fclose(otchet);
}

printf("<--- (%2d:%2d) Close access for %s port %d download %d bytes\n",get_data(HOUR),get_data(MINUTE),user_quota[n].ip,user_quota[n].por t,user_quota[n].download+user_quota[n].today);
user_quota[n].flag=0;

}

void sync_info()
{
int n;
printf("<--- sync download info\n");
/******************************************************************/
printf("<--- Flush && delete a chains %s... ",name_of_chanal1);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -F %s",name_of_chanal1);
system(tmp2);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -X %s",name_of_chanal1);
system(tmp2);
printf("Done\n");
printf("<--- Flush && delete a chains %s... ",name_of_chanal2);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -F %s",name_of_chanal2);
system(tmp2);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -X %s",name_of_chanal2);
system(tmp2);


sprintf(path_to_today,"/etc/tcc/tmp/%d_%d_%d.day",get_data(DAY),get_da ta(MONTH),get_data(YEAR));
if ((sync_i=fopen(path_to_today,"w"))!=NULL)
{
for(n=0;n<quota_ci;n++)
fprintf(sync_i,"ip=%s&port=%d&download=%d&\n",user_quota[n ].ip,user_quota[n].port,user_quota[n].download+user_quota[n].today);

fclose(sync_i);
}

printf("Done\n");
/******************************************************************/

}

void int_sig(int sig_num)
{
//time_t *times1;
sync_info();

printf("<--- Stop a truffic control center (INT) \n");

exit(0);
}
void hup_sig(int sig_num)
{
sync_info();
printf("<--- Stop a truffic control center (HUP) \n");
system(name_of_prog);
exit(0);
}


int main(int argv,char *args[])
{
char work[256];
strcpy(name_of_prog,args[0]);
printf("%s\n",name_of_prog);


printf("<--- Loading a truffic control center\n<---Read config files\n");

if ((setup=fopen(path_to_setup_inf,"r"))==NULL)
{
printf("error opening file %s\n",path_to_setup_inf);
exit(1);
}

while(!feof(setup))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,setup);
if (tmp[0]=='+')
{
grep_arg(name_of_chanal1,tmp+1,"chanal1");
grep_arg(name_of_chanal2,tmp+1,"chanal2");

printf(" ---> Chanal #1 name is #%s\n",name_of_chanal1);
printf(" ---> Chanal #2 name is #%s\n",name_of_chanal2);


bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"alarm");

if (strlen(tmp2)) timer_wait=atoi(tmp2);
printf(" ---> Timer tick #%d sec\n",timer_wait);
break;
}
}

i=0;
if ((quota=fopen(path_to_quota_inf,"r"))==NULL)
{
printf("error opening file %s\n",path_to_quota_inf);
exit(1);
}

while(!feof(quota))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,quota);
if (tmp[0]=='+')
i++;
}
fseek(quota,0x00,SEEK_SET);
// +--+╕T+= ╕+=TL+ ╕╕- ╕╕гL++г+ L+L+╕
user_quota = (Tuser_quota *) malloc(sizeof(Tuser_quota) * i+1);
quota_ci=i;

ci=0;
while(!feof(quota))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,quota);
if (tmp[0]=='+')
{
printf(" ---> Loading rule #%d\n",ci);
grep_arg(user_quota[ci].ip,tmp+1,"ip");
printf(" IP %s",user_quota[ci].ip);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"quota");
user_quota[ci].quota=atoi(tmp2);
printf(" quota %d Kb ",user_quota[ci].quota);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"port");
user_quota[ci].port=atoi(tmp2);
printf("on port %d ",user_quota[ci].port);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"time_l");
user_quota[ci].time_l=atoi(tmp2);
printf("work [%d..",user_quota[ci].time_l);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"time_h");
user_quota[ci].time_h=atoi(tmp2);
printf("%d]\n",user_quota[ci].time_h);
user_quota[ci].flag=1; // ╕╕+╕ +TLг++╕LLг ++ -+++-╕ =╕=++L
user_quota[ci].today=0;
user_quota[ci].download=0;
ci++;
}
}

i=0;
if ((nets=fopen(path_to_network_inf,"r"))==NULL)
{
printf("error opening file %s\n",path_to_network_inf);
exit(1);
}
while(!feof(nets))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,nets);
if (tmp[0]=='+')
i++;
}
fseek(nets,0x00,SEEK_SET);
user_net = (Tnet *) malloc(sizeof(Tnet) * i+1);
net_ci=i;

ci=0;
while(!feof(nets))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,nets);
if (tmp[0]=='+')
{
printf(" ---> Loading net #%d\n",ci);
grep_arg(user_net[ci].name,tmp+1,"net");
printf(" IP %s.0/255.255.255.",user_net[ci].name);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"maska");
user_net[ci].maska=atoi(tmp2);
printf("%d ",user_net[ci].maska);

bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp+1,"port");
user_net[ci].port=atoi(tmp2);
printf(" port %d\n",user_net[ci].port);
ci++;
}
}
sprintf(path_to_today,"/etc/tcc/tmp/%d_%d_%d.day",get_data(DAY),get_da ta(MONTH),get_data(YEAR));
if ((sync_i=fopen(path_to_today,"r"))!=NULL)
{
printf("<--- Read save info\n");
while(!feof(sync_i))
{
fgets(tmp,255,sync_i);
if (strlen(tmp)<10) continue;

grep_arg(t_ip,tmp,"ip");
grep_arg(tmp2,tmp,"port");
t_port=atoi(tmp2);
grep_arg(tmp2,tmp,"download");
t_bytes=atoi(tmp2);

for(i=0;i<quota_ci;i++)
if ((!strcmp(user_quota[i].ip,t_ip))*(t_port==user_quota[i].port))
{
user_quota[i].today=t_bytes;
}

}
fclose(sync_i);
}


if ((f_users=fopen(path_to_users_inf,"r"))==NULL)
{
printf("error opening file %s\n",path_to_users_inf);
exit(1);
}
while(!feof(f_users))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,f_users);
if (tmp[0]=='+')
i++;
}
fseek(f_users,0x00,SEEK_SET);

//// ГОСПОДА ХАКЕРЫ!

//// Место ошибки !!!!!!!!!!!!!!!!!!!
user = (Tuser *) malloc(sizeof(Tuser) * i);
////
i=0;
while(!feof(f_users))
{
bzero(&tmp,sizeof(tmp));
fgets(tmp,255,f_users);
if (strlen(tmp)<10) continue;

if (tmp[0]=='+')
{
grep_arg(user[i].ip,tmp+1,"ip");
grep_arg(user[i].name,tmp+1,"username");
i++;
}
}
fclose(f_users);

printf("<--- Done read config files\n");


printf("<--- Creating a chains %s... ",name_of_chanal1);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -N %s 2> ./error_log",name_of_chanal1);
system(tmp2);
printf("Done\n");
printf("<--- Creating a chains %s... ",name_of_chanal2);
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -N %s 2>> ./error_log",name_of_chanal2);
system(tmp2);
printf("Done\n");

printf("<--- Add a new rule\n");
printf(" Step 1: Close all ports ...");
for (i=0;i<=net_ci;i++)
for(j=1;j<user_net[i].maska;j++)
{
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -I %s -p tcp -s 0/0 %d -d %s.%d -j DENY 2>> ./error_log",name_of_chanal2,user_net[i].port,user_net[i].name,j);
system(tmp2);
}
printf(" Done\n");

printf(" Step 2: Open a some ports (for some users) ...");
for (i=0;i<quota_ci;i++)
{
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -D %s -p tcp -s 0/0 %d -d %s -j DENY 2>> ./error_log",name_of_chanal2,user_quota[i].port,user_quota[i].ip);
system(tmp2);
}
printf(" Done\n");

printf(" Step 3: add rules on ipchains control ...");
for (i=0;i<quota_ci;i++)
{
bzero (&tmp2,sizeof(tmp2));
sprintf(tmp2,"ipchains -I %s -p tcp -s 0/0 %d -d %s 2>> ./error_log",name_of_chanal1,user_quota[i].port,user_quota[i].ip);
system(tmp2);
}
printf(" Done\n");

printf("<--- Loading Done\n");
/*
╒-+╕-гL ++LLT╕╕Tг
*/
if ((html=fopen(path_to_par_html,"w"))!=NULL)
{
fprintf(html,"%s",par_head);

for (c=0;c<quota_ci;c++)
{
fprintf(html,par_format,user_quota[c].ip,user_quota[c].port,user_quota[c].quota ,user_quota[c].time_l,user_quota[c].time_h);
}
fprintf(html,"%s",par_end);
fclose(html);
}else {printf("<--- Error write to %s\n",path_to_par_html);}




//fclose(quota);fclose(nets);fclose(setup);
bzero(&ip_stat1,sizeof(ip_stat1));
bzero(&ip_stat2,sizeof(ip_stat2));

signal(SIGHUP,hup_sig);
signal(SIGINT,int_sig);

ci=0;
while(1)
{
sprintf(ip_stat1,"ipchains -n -x -v -L %s | awk '{print \"pkts=\"$1\"&bytes=\"$2\"&dest=\"$10\&quo t;&port=\"$11\"&\"}' > /tmp/ip_ch1",name_of_chanal1);
//printf("%s\n",ip_stat1);
sprintf(ip_stat2,"ipchains -n -x -v -L %s > /tmp/ip_ch2 2>> ./error_log",name_of_chanal2);

system(ip_stat1);
system(ip_stat2);

if ((ip_c=fopen("/tmp/ip_ch1","r+"))!=NULL)
{
// -TгT++= L╕+=
if (!feof(ip_c)) fgets(tmp,255,ip_c);
if (!feof(ip_c)) fgets(tmp,255,ip_c);
while(!feof(ip_c))
{

bzero(&tmp,sizeof(tmp));
bzero(&tmp2,sizeof(tmp2));
fgets(tmp,255,ip_c);
if (strlen(tmp)<10) continue;

grep_arg(tmp2,tmp,"pkts");
t_pkts=atoi(tmp2);
bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp,"bytes");
t_bytes=atoi(tmp2);
bzero(&tmp2,sizeof(tmp2));
grep_arg(tmp2,tmp,"port");
t_port=atoi(tmp2);
grep_arg(t_ip,tmp,"dest");

for (c=0;c<quota_ci;c++)
if ((!strcmp(t_ip,user_quota[c].ip))*
(t_port==user_quota[c].port))
{
// printf("!%s %d %d\n",user_quota[c].ip,user_quota[c].quota,t_bytes);
user_quota[c].download=t_bytes;
break;
}

}
fseek(ip_c,0x00,SEEK_SET);

fclose(ip_c);
} else {printf("<--- Error opening file ./tmp/ip_ch1\n"); perror("while");}
for (c=0;c<quota_ci;c++)
{
// printf("/%d %d/ ",user_quota[c].download+user_quota[c].today,user_quota[c].quota*1024);
if ((user_quota[c].quota)*(user_quota[c].flag))
if ((user_quota[c].download+user_quota[c].today)>=(user_quota[c].quota*1024))
close_ip(c);
if (user_quota[c].flag)
if ((get_data(HOUR)<user_quota[c].time_l)||
(get_data(HOUR)>=user_quota[c].time_h))
close_ip(c);
if (!user_quota[c].flag)
if (get_data(HOUR)==user_quota[c].time_l)
open_ip(c);
}
if ((html=fopen(path_to_html,"w"))!=NULL)
{
fprintf(html,"%s",stat_head);

for (c=0;c<quota_ci;c++)
{
fprintf(html,stat_format,user_quota[c].ip,"name",user_quota[c].port,u ser_quota[c].quota,(int)(user_quota[c].download+user_quota[c].today)/1024,user_q uota[c].flag);
}
fprintf(html,"%s",stat_end);
fclose(html);
}else {printf("<--- Error write to %s\n",path_to_html);}


sleep(timer_wait);

}

free(user_net);
}

Bulash-OFF
()

это пояснения :

char path_to_network_inf[]="/etc/tcc/network.inf";
char path_to_quota_inf[]="/etc/tcc/quota.inf";
char path_to_setup_inf[]="/etc/tcc/setup.inf";
char path_to_users_inf[]="/etc/tcc/users.inf";

char path_to_today[100];
char path_to_html[]="/home/goga/public/tcc/stat.html";
char path_to_par_html[]="/home/goga/public/tcc/par.html";

char name_of_chanal1[10];
char name_of_chanal2[10];

typedef struct {
int port;
char name[16];
int maska;
} Tnet;

typedef struct {
char name[50];
char ip[20];
} Tuser;

typedef struct {
char ip[20];
int port;
int quota;
int download;
int today;
int time_l,time_h; int flag;
} Tuser_quota;

Bulash-OFF
()
Ответ на: комментарий от Bulash-OFF

Странно, как тебя всё происходящее в убожестве Цэ не убеждает...

Ошибку сейчас пошугаю, а для начала укажу на основные нелепости
в твоём коде:
- постоянное использование грязных функций вроде sprintf, strcpy. Надо
юзать snprintf и strncpy.
- слишком много неуместных глобальных переменных.
- полностью отсутствуют ассерты.
- malloc() использован там, где хватило бы alloca()
- странно как-то входной файл парсится. Зачем читать по два
раза, сначала определяя размеры, когда проще хотя бы по-кускам-растущий
массив использовать, а лучше - список. Вот, кстати, один
из примеров убожества недоязычка Цэ - нет приличных контейнеров.
- как определён grep_arg? А, как бы ни был определён, но он - дерьмо.
По той же причине, что и sprintf. Вполне вероятное место ошибки.
- то, что ты отметил как "место ошибки", таковым не является.
Скорее уж ошибка в заполнении user_net или даже user_quota. Портятся
некие используемые malloc-ом метаданные, в результате
чего следующий malloc и летит с треском. Проверить это очень просто -
предыдущими malloc-и выделить по до-фига памяти. Если глюка
пропадёт, или в другое место переедет - то тут собака и порылась.
Если же нет, то ошибка в заполнении статически выделенной памяти.

 Короче, раз уж ты пишешь такой грязный код, то лучше тебе
использовать языки с динамической проверкой выхода за границы и
сборкой мосора. Если ты конченный императивщик, пользуй Питон.
Если же готов учиться и развиваться - то попробуй Scheme, ML, Haskell.
Там тебе так наошибаться никто не даст, и там тебе даже в голову
не придёт так по тупому файлы читать. Послушай хорошего совета -
или же всю оставшуюся жизнь проведёшь в отлове таких вот багов.

Antichrist
()
Ответ на: комментарий от Bulash-OFF

Мне непонятны в этой программе два фрагмента. Во-первых, почему у тебя один цикл - for (i=0;i<=net_ci;i++) - почему здесь "<=", а не "<"? Во-вторых, user_net = (Tnet *) malloc(sizeof(Tnet) * i+1); - приоритет операторов такой, что сложение выполняется после умножения, хоть пробелы и внушают другой порядок. Это всё ошибки или так и должно быть?

justme
()

Попробуй gdb или ddd. Он сразу носом тыкнет туда где ошибка.

2justme: Согласен, ошибка скорее всего здесь и в другом такмом же куске. (Tuser_quota *) malloc(sizeof(Tuser_quota) * i+1);

Banshee
()

возможно в этом ошибка. но я думаю там всё оки - доки.
попробую дебагкры...

Bulash-OFF
()

я разобрался \
дело было так:
rm -Rf /
setup

потом компилирую - всё ОК. Вот так , наверно gcc глюки были??? а
может и нет..

Bulash-OFF
()
Ответ на: комментарий от Banshee

Я же тебе уже сказал - ты ламер. Так что воздержись от идиотских советов. Дебаггер тут абсолютно никак не поможет, он покажет то место, где ошибка ПРОЯВЛЯЕТСЯ, а не где она возникает.

По поводу найденных ляпов - они не есть причина ошибки, так как в цикле с <= только чтение, записи в запределы не идёт. В остальных местах так же выхода за пределы быть не может, кроме как в заполнении самих полей структурок. Туда и надо копать.

Antichrist
()
Ответ на: комментарий от Bulash-OFF

Зря ты это сделал. Если ошибка перестала проявляться, ещё не значит, что она пропала. Проявится в другом месте. Ты слишком грязно пишешь. Лучше избавься от sprintf, strcpy, и этого твоего дурного grep_arg (напомню - ты там не специфицируешь максимальный размер буфера, куда результат пишешь). И про ассерты не забывай. Короче, учись три раза, как завещал великий Ленин. Он умный мужик был, плохого не посоветует, в отличии от Banshee.

Antichrist
()

КАРОЧЕ!

В коде мне копаться откровенно лениво, но сказать чего -- имею. C -- конечно сосет, но способ, приложив голову, найти багу -- есть. Имя ему -- export MALLOC_CHECK_=2 и затем -- gdb -core по дампу. Это ежели во всяких левый efence-ах разбираться лениво (как мне, например).

P.S. а языки с gc вообще, и схема в частности -- рулят.

dmiceman ★★★★★
()

Подавляющее большинство ошибок в С/С++ линии -- выход за границу отведенной памяти. Было бы логично сгруппировать все коды обработки выделения/уничтожения оной в одно место -- так будет проще ловить. Конечно, легко посоветовать перейти на другой язык -- необязательно на Питон, можно расширить С до С++, там контейнеры STL большинство таких вещей решают походя. Но тон, которым Antichrist кидается направо и налево -- типичный тон Сети. Оффланй я бы его уже бил. С некоторой долей уважения -- КоТ.

anonymous
()
Ответ на: комментарий от anonymous

Ну очень умный онанимус, блин. Насоветовал. Прикинь - вынес ты все выделения/удаления памяти в отдельный модуль, обвешал ассертами со всех сторон, а дальше что? Ошибка то будет при ИСПОЛЬЗОВАНИИ этой памяти (кстати, вовсе не обязательно выделенной динамически, с тем же треском можно вылететь и за пределы статически выделенного массива). Ну и особенно смешно твой сравнение убогого STL с Питоновскими контейнерами. Как раз за такие наглые заявления и надо с ноги в хлебальник давать, а вовсе не за тон (или ты, тупица, в интеллигенцию записался? Ну так вам, снобам поиметым, тут не место. Тут о деле говорят, а не расшаркиваются да приседают. Усёк, очкарик?).

Antichrist
()

А почему ты пишешь bzero(&tmp,sizeof(tmp)) а не bzero(tmp,sizeof(tmp)) tmp уже указатель как и другие твои массивы.

anonymous
()

2 Antichrist: сам дурак.

Кривости Цэ я и без тебя знаю. Но ты ни разу не предложил нормальной альтернативы. Скриптовые языки не в счет. По крайней мере мне они не подходят.

Если б ты был настолько крут, настколько пытаешься себя изобразить, ты бы уже сделал революцию в производстве софта и зарабатывал не одну сотню килобаксов в год, может даже не один миллион.
А пока это выпендреж с твоей стороны.

Havoc ★★★★
()
Ответ на: комментарий от Havoc

Нет, это ты дурак. По одному только нелепому термину "скриптовые языки" это видно. По твоему, Java - "скриптовый язык"? Или Scheme, которая Bigloo? Или Common Lisp, который GCL или CLISP? Или Haskell, который GHC? Ну очень скриптовые компиляторы, я просто тащусь какие скриптовые.

Как раз те, кто пишет на правильных языках, зарабатывают на порядки больше C++-ных ламерочков вроде тебя. Мне, кстати, тоже на хлеб с маслом хватает, хоть я и не как программист работаю - я всё же физик, для меня программирование - побочное занятие. От тебя же кроме ебанутого гуманитарного пиздобольства я ничего не слышал. Никаких реальных претензий к предложенным мною альтернативам не было, кроме сволочного "это мало кто использует". То есть, блядский аргумент "1000000 of lemmings can't be wrong", за применение коего уже столько народу было жестоко отпизжено...

Antichrist
()

Если ты физик, то может тебе в этой обласли свои идеи толкать. А то получается, как кухарка, свинарка, ткачиха, ... в правительство.

anonymous
()

Похоже, что это клиника...
Жабу не везде воткнешь, а хаскел и лисп просто корявы и абсолютно некрасивы.
Тебе бы с R00Tом в реале встретиться, два любителя пиздить.
Я бы на это зрелище даже в Москву бы слетал :)

Havoc ★★★★
()
Ответ на: комментарий от Havoc

Послушай, мудило отсосое, ты так и не сказал, в чём проблемы Лиспа, Схемы, ML, Хаскелля, кроме того, что тебе не хватает IQ и образования их понять. Так что сдохни, гнойный пидор. R00T зассал, я бы давно его отпиздил, надеюсь, что ты не настолько трус. Тебе бы я печень вырезал, не сомневайся.

Antichrist
()
Ответ на: комментарий от anonymous

А ты, шавка, зассал найти конкретно, в чём я не прав? Тебе просто так вспиздануть захотелось? Ну так сдохни, мразь.

P.S. 2Havoc: с дебагерами ты тут уже облажался как последнее уёбище. Хочешь, чтоб тебя ещё раз натянули? Ну точно пидар. Ловишь кайф, когда тебя ебалом в говнище возят.

Antichrist
()

> с дебагерами ты тут уже облажался как последнее уёбище

Когда и где? Я за дебагеры нигде здесь не спорил.

>ты так и не сказал, в чём проблемы Лиспа, Схемы, ML, Хаскелля,

Они мне не подходят. В том числе из-за отсутствие арифметики указателей, которая в моих проектах помогает выиграть в скорости.
Жабовские реализации в частности все же проигрывали в скорости даже сишному варианту, который не юзал арифметику указателей.
Задачи у меня весьма специфические.

Ты что, много умных слов выучил?

Havoc ★★★★
()
Ответ на: комментарий от Havoc

>> с дебагерами ты тут уже облажался как последнее уёбище 

> Когда и где? Я за дебагеры нигде здесь не спорил. 

 Ты тут советовал искать ЭТУ ошибку дебаггером. Как будто
не знаешь, что никакие дебаггеры в этом случае не помогут.

>>ты так и не сказал, в чём проблемы Лиспа, Схемы, ML, Хаскелля, 

> Они мне не подходят. В том числе из-за отсутствие арифметики
> указателей, которая в моих проектах помогает
> выиграть в скорости. 

 Ню ню. А прокладки с крылышками тебе помогают выиграть в сухости.
Ты в курсе, что, к примеру, в Objective Caml на x86 выделение
тупла занимает меньше десятка операций (около десятка тактов)?
По сравнению с траханным в жопу malloc() это ну очень шустро.
Ты бы сначала разобрался, ЗАЧЕМ тебе арифметика указателей, и не
лучше ли переложить её на более высокий уровень абстракции?

> Задачи у меня весьма специфические. 

 А тут что, ТВОИ задачи обсуждаются, уродище? Перекладываешь свою
специфику на всех окружающих? Таких задач, которые потребовали бы
арифметики указателей - пальцев у инвалида хватит пересчитать.
Ты бы посмотрел, что товарищ, вопрос задавший, делать пытается.
В его задаче C или C++ просто абсолютно не в кассу.

Antichrist
()
Ответ на: комментарий от Antichrist

>Попробуй gdb или ddd. Он сразу носом тыкнет туда где ошибка.
>2justme: Согласен, ошибка скорее всего здесь и в другом такмом же >куске. (Tuser_quota *) malloc(sizeof(Tuser_quota) * i+1);

>Banshee (*) (2001-10-06 09:41:50.0)

Это мои слова?
Да ты еще и читать не умеешь, дерьма кусок!

>А тут что, ТВОИ задачи обсуждаются

А что ТВОИ задачки детсадовские разве, придурок конченный?
Заебал ты свом лиспом, где за скобками леса не видно и тому подобными язычками сугубо узкого применения.

echo "Hello world" на баше тоже на куче систем работает. Ура, я написал портабельную программу.

Ты не физик, ты любую привозную бабку за пояс заткнешь. Да только не интеллектом.

Не о malloc речь шла. Арифметика позволила минимизировать копирования памяти.

Ты вообще поработай для интереса в софтверной конторе. Быстро спесь слетит, если возьмут тебя, конечно. А так ты клепаешь поделки введите х и у, вот вам x*x + y*y на чем хочешь. Программирование числодробительством не ограничивается.

Ты еще будешь учить людей програмить. Типа все козлы, а я один армянский композитор д`Артаньян.
Пойди на курсы по VB, может поумнеешь.

Havoc ★★★★
()
Ответ на: комментарий от Havoc

А, все вы, ламеры, на одно лицо.

Тут обсуждается конкретная задача, которую мужик и решал. И для этой задачи твой в жопу ёбаный Цэ просто на хуй не нужен. Всосал, гадёныш?

И про "копирования памяти" ты просто запизделся, гнида ебанутая. Ознакомься с тем, как правильные языки с памятью работают. Никаких тебе лишних копирований, всё оптимизируется без твоего участия.

Короче, выпиздыш, сдохни. Ты только выёбываться и в состоянии, на реальные возражения тебе мозгов не хватает.

Antichrist
()

Если кто и ламер, так ты просто упертый идиот.

Про конкретную задачу ты про любую пиздишь, что ее надо "правильными" язычками решать.

Ага, оптимизируется, 10 тактов на выделение. Так небось память из пула отдают, который надо заранее подготовить. Не иначе как malloc юзается.

Сдохни сам. Ты реально в группе никогда не работал. Ты умеешь только квадратные уравнения решать в лучшем случае. Да и Страуструп уж куда умнее тебя, придурка. А в твоих недоязычках даже элементарнейший асинхронный ввод/вывод проблема сделать. А делать сборную солянку из большого проекта - не самая лучшая идея, когда подзадачи будут решаться на десятке разных языков. Тем более, что у большинства из них, и у лиспа в частности такой трахнутый синтаксис, что непонятно, что и в каких количествах авторы курили. Всегда есть несколько путей, они избрали самый геморройный.

Да и сам Цэ балуешься, судя по твоим же постингам.
Так что удавись и утопись в параше, козлик. На умного ты никак не тянешь.

(fuck (you Antichrist))

Счстливо оставаться, отсос, неумеющий читать, разговаривать, писать и жить в обществе.

Havoc ★★★★
()

Что касаемо языков функциональных, то каковы бы ни были их принципы работы с памятью, так или иначе они должны где-то хранить и как-то обрабатывать занятые программой адреса. Разница между С и Лисп-клонами в данном случае та, что Лисп детали этой реализации скрывает -- от программера, НО НЕ ОТ ПРОЦЕССОРА, а С открывает, вот и выходит, что в С быстро, но с промахами, а Лисп медленней, но надежней. Однако и в обоих случаях количество работы процессору -- не очень отличается. Вот чем мне, в частности, не подходят символьные языки (Лисп, Хаскель, форт, и т.п) Что же до обвинений взаимных -- дал бы многоуважаемы антихрист адресок, а уж там можно и по хлебалу. А то невежливо как-то получается, Вы не находите?

anonymous
()
28 мая 2002 г.

читал-читал, пока не дошел до великого русского... Вообще-то сначала надо отвечать на вопрос в форуме, а потом умничать, а всякое словоизлияние,,,,,ну я представил себе такого здоровенного отмороженного очкастого программера - ну не надо излучать такой омерзительный имидж, а то кто-нибудь подумает, что все такие. Давайте на Си не наезжать, он всяко круче Лиспа с любой позиции ))))) А вот Питон - круче всех!!! ЛАдно, пардон, никаких рулез-мастдай. Все прекрасно и ТЧК

anonymous
()
16 декабря 2002 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.