HLFX.Ru Forum Страницы (9): « 1 2 3 4 [5] 6 7 8 9 »
Показать все 123 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- нубовопросы по c++ (https://hlfx.ru/forum/showthread.php?threadid=5083)


Отправлено XaeroX 21-08-2019 в 16:51:

nemyax
У нас кастомные аллокаторы с сентинелями.
Кажется, в CRT дебажный аллокатор тоже умеет проверять на предмет порчи, но я им не пользовался.
Проверь все массивы, нет ли выхода за границу.
Если порча у класс-мембера, проверь, нет ли перезаписи за пределы другого класс-мембера.
Попробуй комментировать memcpy и смотреть, пропадает ли баг.

Цитата:
nemyax писал:
причём это число воспроизводимое

Ну это вообще самый идеальный и лёгкий для дебага вариант.

__________________

xaerox on Vivino


Отправлено nemyax 21-08-2019 в 17:10:

Цитата:
XaeroX писал:
Проверь все массивы, нет ли выхода за границу.

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

Цитата:
XaeroX писал:
У нас кастомные аллокаторы с сентинелями.

Не на асме же вы их пишете. Небось оборачиваете стандартные средства под конкретную задачу.

Насколько вообще надёжно перетирать структы, хранящие указатели?


Отправлено XaeroX 21-08-2019 в 17:53:

Цитата:
nemyax писал:
Насколько вообще надёжно перетирать структы, хранящие указатели?

Ты бы код показал, что ли, а то сеанс телепатической связи отнимает очень много энергии.

__________________

xaerox on Vivino


Отправлено nemyax 21-08-2019 в 18:32:

Структы такого рода:

C++ Source Code:
1
struct umark
2
{
3
  const int *ptr;
4
};
5
 
6
struct ulink
7
{
8
  uvert *vert;
9
  ulink *twin;
10
  ulink *wrap;
11
  uedge *edge;
12
  ubend *bend;
13
  umark *mark;
14
};
15
 
16
struct uvert
17
{
18
  flags options;
19
  union {float xyz[3]; vec3 coords;};
20
  ulink *link;
21
  uties *ties;
22
  extra_info *extra;
23
  int misc;
24
};
25
 
26
struct uedge
27
{
28
  flags options;
29
  ulink *link;
30
  uties *ties;
31
  extra_info *extra;
32
  int misc;
33
};
34
 
35
struct uface
36
{
37
  flags options;
38
  usurf *material;
39
  ubend *bend;
40
  uties *ties;
41
  extra_info *extra;
42
  int misc;
43
};
44
 
45
struct undo_chunk
46
{
47
  int type;
48
  void *addr;
49
  char state1[Undo_slot_size];
50
  char state2[Undo_slot_size];
51
  undo_chunk *smaller; // in terms of memory address
52
  undo_chunk *greater; // in terms of memory address
53
};
54
 
55
struct backup
56
{
57
  int count;
58
  undo_chunk *root;
59
};


Перезапись состояний в таком духе:
C++ Source Code:
1
void history::change_state(undo_buffer *b, void (*fun)(undo_chunk*))
2
{
3
  backup *bak = b->bak;
4
  int count = bak->count;
5
  if (bak->root == NULL) {return;}
6
    undo_chunk **stack = NULL;
7
  if (Is_small(count))
8
  {
9
    undo_chunk *s[Small_tree];
10
    stack = (undo_chunk**)s;
11
  }
12
  else {stack = (undo_chunk**)malloc(sizeof(undo_chunk*) * count);}
13
    int pos = 0;
14
  undo_chunk *ch = bak->root;
15
  undo_chunk *gr, *sm;
16
  stack[pos] = ch;
17
  while (pos >= 0)
18
  {
19
    ch = stack[pos];
20
    gr = ch->greater;
21
    sm = ch->smaller;
22
    if (gr != NULL) {stack[pos++] = gr;}
23
      if (sm != NULL) {stack[pos++] = sm;}
24
        fun(ch);
25
      --pos;
26
    }
27
  if (!Is_small(count)) {free(stack);}
28
  }


Отправлено XaeroX 21-08-2019 в 18:36:

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

__________________

xaerox on Vivino


Отправлено nemyax 21-08-2019 в 18:42:

Вот я и говорю, под линуксом просто работает. Под вендой (компилятор vc9) тоже работает, но начинается наркомания после энного повторения.


Отправлено Дядя Миша 21-08-2019 в 18:58:

Цитата:
nemyax писал:
Когда у вас, опытные товарищи, начинается чертовщина с порчей памяти, где кроме аллокации-высвобождения вы ищете её причины?

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

Добавлено 21-08-2019 в 21:58:

Поглядел код. Если уж сохранять что-то с указателями, то логично кусок памяти выделять так чтобы в него попала структура + то что мы хотели сохранить. И тада уже можно с этим иметь дело. И не использовать явные указатели, а что-то типа (struct + 1). Ну это так, к слову.
Тут помойму проблема в самой задумке. Это вообще не будет нормально работать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 21-08-2019 в 19:07:

Хорошо, скажем иначе: где кроме ошибочных аллокации-освобождения?

Добавлено 21-08-2019 в 22:07:

Цитата:
Дядя Миша писал:
Это вообще не будет нормально работать

Почему? Что может заставить систему похерить выделенные данные с того места, где она их выделила?


Отправлено Дядя Миша 21-08-2019 в 19:42:

Систему - ничего. Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий. Ты думаешь что всё в порядке, а сам что-то портишь. Я за все годы программирования один единственный раз столкнулся, когда мне система в штаны насрала - тот известный случай, когда в libc и msvcrt разная реализация atof. А всё остальное - это уже сам себе.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 21-08-2019 в 19:48:

Цитата:
Дядя Миша писал:
Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий.

Вот и я о чём. Система ведь единожды выделив память сама собой не переместит её содержимое. По крайней мере мы на это рассчитываем, когда пользуемся языком без сборщика мусора. Она даже течку допустит, но занятое место не тронет. Ну по идее.


Отправлено Дядя Миша 21-08-2019 в 19:58:

Во-во, я ж и говорю что ты не о том думаешь. У тебя там что-то с указателями, скорее всего. Память-то на старом месте, а вот на что указатели указывают, это другое дело.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 21-08-2019 в 20:18:

То, что я где-то написал фигню, не означает, что общая задумка работать не будет в принципе.
Меня плющит, что коллапс созревает постепенно к четвёртому-пятому анду-реду и только при использовании компилятора микрософта.


Отправлено Дядя Миша 21-08-2019 в 21:39:

Компилятор тут точно непричём. Значит где-то посадил UB. Накопительный баг. Надо там хотя бы алертов понтаыкать и посмотреть чо происходит.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 26-08-2019 в 18:23:

Всё-таки нашёл одну течку. Заткнул, и порча снята.


Отправлено nemyax 23-09-2019 в 22:32:

Микрософт опубликовал свой STL под лицензией Apache: https://devblogs.microsoft.com/cppb...cing-msvcs-stl/

Добавлено 24-09-2019 в 01:32:

На ЛОРе профессионалы наорудовали, что там не только STL, но и либстдц++ как таковой. Не знаю, правда ли.


Временная зона GMT. Текущее время 04:17. Страницы (9): « 1 2 3 4 [5] 6 7 8 9 »
Показать все 123 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024