Проблемы с "glibc detected"

Модератор: Модераторы разделов

Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Проблемы с "glibc detected"

Сообщение _GV »

Народ, есть следующая проблема. Имеется своя бибилиотека, в которой встречается следующий код:

Код: Выделить всё

int WriteToFD(int *fd,u_int8_t **buf,int buf_size,int *bc,long *usec)
{
  struct timeval *slice;
  fd_set fds;
  int flag,j,errsv;
  long eta;
  *bc=0;
  if (usec)
  {
    slice=(struct timeval *)malloc(sizeof(struct timeval));
    slice->tv_sec=0;
    slice->tv_usec=(*usec);
    eta=(*usec);
  }
  else
  {
    slice=NULL;  //Be care. It's infinity
  }
  j=0;
//SKIPPED
//.....
    flag=select(*fd+1,NULL,&fds,NULL,slice);
//SKIPPED
//.....
    if (slice)
      free(slice);
    return 0;
//SKIPPED
//.....
}


При вызове этой процедуры у заказчика возникает ошибка вида
***glibc detected free() invalid next size
, при выходе из функции
Если изменить строку 'slice=(struct timeval *)malloc(sizeof(struct timeval));' на 'slice=(struct timeval *)malloc(1024);', то ошибка изменяется
на ***glibc detected double free() or corruption.

Установленная система Slackware linux 11, linux-2.6.17.13-smp, glibc-2.3.6
Железо PentiumD, RAM 1Gb

На других системах все работает, как часы (как на более старых, так и на более новых)
С чем это может быть связано?
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Проблемы с "glibc detected"

Сообщение _GV »

Кажется раскопал.
Вызывает ошибку даже программа

Код: Выделить всё

#include <stdlib.h>

int main(int argc char **argv)
{
  int *a;
  a=(int *)malloc(3*sizeof(int));
  if (a!=-1)
    free(a);
  return 0;
}


Узнал, что при установке сервера была предпринята попытка обновить glibc, собрав его из исходников с изменением целевой платформы с march=i486
на mtune=i686, после чего установиться это до конца не смогло.

На выходных поеду переставлять glibc. О результатах отпишу
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Проблемы с "glibc detected"

Сообщение Sleeping Daemon »

_GV писал(а):
16.11.2007 07:22
Кажется раскопал.
Вызывает ошибка даже программа

Код: Выделить всё

#include <stdlib.h>

int main(int argc char **argv)
{
  int *a;
  a=(int *)malloc(3*sizeof(int));
  if (a!=-1)
    free(a);
  return 0;
}


Узнал, что при установке сервера была предпринята попытка обновить glibc, собрав его из исходников с изменением целевой платформы с march=i486
на mtune=i686, после чего установиться это до конца не смогло.

На выходных поеду переставлять glibc. О результатах отпишу

В этом коде как минимум одна ошибка и одно предупреждение. При этом есть логическая ошибка, как раз где предупреждение.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Проблемы с "glibc detected"

Сообщение v04bvs »

_GV писал(а):
16.11.2007 07:22
Кажется раскопал.
Вызывает ошибку даже программа

Код: Выделить всё

#include <stdlib.h>

 int main(int argc char **argv)
 {
   int *a;
   a=(int *)malloc(3*sizeof(int));
   if (a!=-1)
     free(a);
   return 0;
 }


Если malloc-у не хватает памяти, он возвращает NULL.
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Проблемы с "glibc detected"

Сообщение _GV »

Sleeping Daemon писал(а):
16.11.2007 08:29
_GV писал(а):
16.11.2007 07:22
Кажется раскопал.
Вызывает ошибку даже программа

Код: Выделить всё

#include <stdlib.h>

int main(int argc char **argv)
{
  int *a;
  a=(int *)malloc(3*sizeof(int));
  if (a!=-1)
    free(a);
  return 0;
}

В этом коде как минимум одна ошибка

Не ошибка, а опечатка. Исправляю.

Код: Выделить всё

int main(int argc, char **argv)


Sleeping Daemon писал(а):
16.11.2007 08:29
и одно предупреждение. При этом есть логическая ошибка, как раз где предупреждение.

Ну про malloc, конечно, слажал. Но эта логическая ошибка не влияет на выполнение программы, при условии, что malloc'у хватает памяти на 3 int'а
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Проблемы с "glibc detected"

Сообщение _GV »

Нашел. Glibc не причем. Больно не пинайте.
Полная версия "глючащей" проги ниже

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  char *a;
  a=(char *)malloc(10*sizeof(char));
  if (a)
  {
    sprintf(a,"Hello world"); //Длина "Hello world" явно больше 9-и символов
    printf("%s\n",a);
    free(a);
  }
  return 0;
}


Ошибку уже видно. В оригинальной версии было то же самое. Просто ошибка вылазила не в основной проге, а внутри библиотеки (3-я функция по стеку вызовов) на первом же free.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Проблемы с "glibc detected"

Сообщение v04bvs »

_GV писал(а):
19.11.2007 08:24
Нашел. Glibc не причем. Больно не пинайте.
Полная версия "глючащей" проги ниже

Код: Выделить всё

#include <stdlib.h>
 #include <stdio.h>

 int main(int argc, char **argv)
 {
   char *a;
   a=(char *)malloc(10*sizeof(char));
   if (a)
   {
     sprintf(a,"Hello world"); //Длина "Hello world" явно больше 9-и символов
     printf("%s\n",a);
     free(a);
   }
   return 0;
 }


Ошибку уже видно. В оригинальной версии было то же самое. Просто ошибка вылазила не в основной проге, а внутри библиотеки (3-я функция по стеку вызовов) на первом же free.


Бывает. Только sizeof(char) не нужно, он всегда 1 :)
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Проблемы с "glibc detected"

Сообщение _GV »

Бывает. Только sizeof(char) не нужно, он всегда 1

Привычка :rolleyes:
Спасибо сказали: