ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

С++ Builder проблема с кучей
  #1  
Старый 01.02.2009, 16:18
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию С++ Builder проблема с кучей

Если выделить память в куче любым способом хоть то malloc/free,new/delete,HeapAlloc/HeapFree И что то в ней парсить текстовое с помощью memset,strcpy,strcat и т.д. То кодегвард матерится на каждую такую операцию AccessOverrun типо в блок памяти размера Х пытаются что то запихать размером Х+1байт ,и это независит от количества памяти выделенной под переменную ,все равно будет +1байт Вроде бы так ничего ,программа невылетает.НО.Если парсить очень много данных.То при вызове free,delete вылазит AccessViolation в это случае кодегвард говорит что это "Bad Array" Тоесть место распожение данных в куче куда сдвигается и освободить память становится проблематично Как можно боротся с такой фигней?Ибо если перед завершением ф-ции неосвобождать память то она очень заметно течет.
ЗЫ:BDS 2006
 
Ответить с цитированием

  #2  
Старый 01.02.2009, 18:24
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме:
3371897

Репутация: 1462
По умолчанию

Цитата:
типо в блок памяти размера Х пытаются что то запихать размером Х+1байт
не о нулевом байте в конце строки случайно речь идет?
 
Ответить с цитированием

  #3  
Старый 01.02.2009, 18:55
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от Jes  
не о нулевом байте в конце строки случайно речь идет?
Код:
char *globbuf=new char[1024];
.................................................
void myfunc()
{
char *buf=new char[strlen(globbuf)+1];
.............................................................
memset(buf,NULL,strlen(buf));//CodeGuard=>"Access Overrun....."
}
Так что я непонимаю причем здесь нулевой байт.По мои наблюдения любая операция с изменениями данных в выделенной перемной в куче смещяет этот выделенный блок памяти куда то на 1 байт.В итоге при попытке его освободить или активном его юзе в парсинге текста получается Access Violation
 
Ответить с цитированием

  #4  
Старый 01.02.2009, 19:26
FoX's
Участник форума
Регистрация: 26.12.2004
Сообщений: 188
Провел на форуме:
1495357

Репутация: 107
Отправить сообщение для FoX's с помощью ICQ
По умолчанию

когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы
 
Ответить с цитированием

  #5  
Старый 01.02.2009, 19:39
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от FoX's  
когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы
strlen ?Да ну?За пределы ?Аж ровно на 1 байт?Серьезно?
 
Ответить с цитированием

  #6  
Старый 01.02.2009, 23:36
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от ChaaK  
А как ты до globbuf достучался? Она у тебя статическая или глобальная?
Конечно же глобальная.Как я писал выше после парсинга данных в переменной место под которую было выделено в куче,попытка освободить это самое место с помощью delete,free кончались Acces Violation Ну так вот если делать так
Код:
new *buf=new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
delete []buf;//получается тут Acces Violation
А вот если сделать так
Код:
new *buf=new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
buf+=1;
delete []buf;//ВСЕ ОК!
Вот теперь сижу и думаю в чем тут прикол
 
Ответить с цитированием

  #7  
Старый 02.02.2009, 01:40
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от ChaaK  
Используй для этого sizeof
Я непонимаю Где использовать sizeof ?
 
Ответить с цитированием

  #8  
Старый 02.02.2009, 01:51
__mad
Участник форума
Регистрация: 04.11.2007
Сообщений: 103
Провел на форуме:
548128

Репутация: 104
По умолчанию

Что то вы ***ню пишете господин, только что проверил
Код:
  char *buf;
  buf = new char[1024];
  memset(buf,NULL,1024);
  strcat(buf,"LALALALALA");
  delete []buf;//получается тут Acces Violation
  return 0;
и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.
 
Ответить с цитированием

  #9  
Старый 02.02.2009, 10:40
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от __mad  
Что то вы ***ню пишете господин, только что проверил
Код:
  char *buf;
  buf = new char[1024];
  memset(buf,NULL,1024);
  strcat(buf,"LALALALALA");
  delete []buf;//получается тут Acces Violation
  return 0;
и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.
Так не нада тут ссылатся на предшествующих авторов.Если хотите написать что то умное,тогда уж покажите где у меня там выходит за пределы выделенного массива.
 
Ответить с цитированием

  #10  
Старый 02.02.2009, 16:02
awdrg
Участник форума
Регистрация: 30.01.2009
Сообщений: 196
Провел на форуме:
505362

Репутация: 66
Отправить сообщение для awdrg с помощью ICQ
По умолчанию

Про то что массив начинается с 0 а не с 1 автор знает? Крайнее значение (учитывая нулевой байт) = buf[1022]
buf[1023] = '\0'
Скорее всего ошибка присвоения за границы массива по ходу дальнейшего кода. У меня этот кусок компилится прекрасно

Последний раз редактировалось awdrg; 02.02.2009 в 16:40..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со сплойтом для вхзлома ipb 2.0.0 Taylorith Форумы 8 18.02.2007 20:06
Проблема заливки шела Dimazzz Форумы 20 28.07.2006 05:53
Проблема с TBrowser donetsk С/С++, C#, Delphi, .NET, Asm 4 06.07.2006 09:37
проблема RocketV1_0 КИРЮХА ! Схемы и программы 0 10.06.2006 23:48
Проблема Mac OS X не только в Safari DRON-ANARCHY Мировые новости 0 23.02.2006 21:12



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ