Профилактика безопасного кода
От: Tom Россия http://www.RSDN.ru
Дата: 15.02.05 14:58
Оценка:
Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать

07.07.05 21:42: Перенесено модератором из 'О жизни' — Кодт
Народная мудрось
всем все никому ничего(с).
Re: Профилактика безопасного кода
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 15.02.05 15:04
Оценка: :))
Здравствуйте, Tom, Вы писали:

Tom>Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать

-1
King Oleg
*Читайте DOC'и, они rules*
Re: Профилактика безопасного кода
От: Анатолий Широков СССР  
Дата: 07.07.05 19:49
Оценка: +2
Ненадо ничего скидывать — от лукавого это. ИМХО надо избавляться в проекте от "голых" указателей и вводить их под управлением smart pointer-ов.
Re: Профилактика безопасного кода
От: Alexey Chen Чили  
Дата: 07.07.05 21:40
Оценка: -1
Здравствуйте, Tom, Вы писали:

Tom>Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать


По идее правильно бы было если бы скидывал хипменеджер.

Но скидывание может и не помочь, просто по причине реалокации памяти под другой обьект. Мы боролись тестированием с собственной реализацией хипа. Жёсткий чек целостности и стратегия, при которой память как можно дольше не реалакируется, в принципе достаточно хорошо отлавливают подобные ошибки. Не гарантированно конечно. Гарантии тут, ИМХО, вообще не возможны. И никакие умные указатели не спасут.
Re[2]: Баба яга против
От: McSeem2 США http://www.antigrain.com
Дата: 07.07.05 22:54
Оценка: +1 -1
АШ>Ненадо ничего скидывать — от лукавого это. ИМХО надо избавляться в проекте от "голых" указателей и вводить их под управлением smart pointer-ов.

Данное утверждение эквиавлентно "выбросьте проект и перепишите его по-новой". А надо всего лишь поправить ошибку. Это во-первых.

Во-вторых, смарт-поинтеры нужны лишь для реализации некой пародии на сборку мусора методом подсчета ссылок. Если же в данном проекте стратегия с типа-автоматической сборкой мусора не заложена в изначальном дизайне, то они и не нужны. Максимум, что нужно — это auto_ptr и то очень-очень редко. А использовать надо контейнеры — стандартные или свои, не важно. Главное что контейнеры, самоудаляющиеся.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Профилактика безопасного кода
От: ukshish  
Дата: 08.07.05 06:26
Оценка: :)
Здравствуйте, Tom, Вы писали:

Tom>Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать


Существют такие средства, как BoundsChecker и CodeGuard. Рекомендую.
Re: Профилактика безопасного кода
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.07.05 06:47
Оценка: 1 (1) +1
Здравствуйте, Tom, Вы писали:

Tom>Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать


Имхо, затраты времени и сил на написание такого кода:
~some_object_t()
    {
        delete some_ptr_;
        some_ptr_ = MAGIC_NULL_VALUE;
        
        delete another_ptr_;
        another_ptr_ = MAGIC_NULL_VALUE;
        ...
    }

вполне сравнимы с тем, чтобы:
— просто проверить соответствие new/delete;
— перейти на использование std::auto_ptr (или других умных указателей), или использовать std::vector вместо new something[];
— найти таки причину "повисания" указателя на уже удаленный объект.

Кроме того, с магическими числами еще и будет выполнятся лишняя работа -- сброс указателей после delete. И это при том, что в 99% случаев это совершенно не требуется. А оставшийся 1% -- это ошибки, которые по любому нужно найти и исправить.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: Профилактика безопасного кода
От: ansi  
Дата: 08.07.05 11:19
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Тут недавно обнаружил что в проекте давольно успешно работал уже удалённый обьект. Причём с виртуальными функциями и обращением к мемберам. Вопрос такой. В какие обычно значения скидывают скажем указатели в деструкторе, дабы потом при обращении к ним возник AV. 0 — не предлагать


Мертвая говядина
Автор: ansi
Дата: 05.07.05
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Avantasia — Farewell";
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.