powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват доступа по указателю
12 сообщений из 12, страница 1 из 1
Перехват доступа по указателю
    #38180274
Фотография Poppler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct A
{
    int m_nVal;
};

struct B
{
    A* m_pA;
};

A* pA = new A();
pA->m_nVal = 10;

B* pB = new B();
pB->m_pA = pA;



Можно, как нибудь перехватить присваивание
Код: plaintext
1.
pB->m_pA = pA;

например с помощью перегрузки операторов или как-то иначе? Нужно для проверки корректности указателя pA.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180286
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poppler,

Нет и да. Вначале вычисляется pB->m_pA, затем для результата temp выполняется temp = pA. Таким образом, temp должно быть пользовательского типа, допускающего присваивание A*. Поэтому в такой схеме фокус не пройдёт, а вот если m_pA есть объект типа A_Verifier, то в коде оператора присваивания можно разместить любые проверки.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180494
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PopplerНужно для проверки корректности указателя pA.а это вы как собираетесь проверять, интересно?
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180639
Фотография Poppler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа это вы как собираетесь проверять, интересно?

проверять через IsBadReadPtr.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180645
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Popplerпроверять через IsBadReadPtr.
Реймонд Чен пишет что этими функциями не следует пользоваться - IsBadXxxPtr should really be called CrashProgramRandomly
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180744
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poppleregorychа это вы как собираетесь проверять, интересно?

проверять через IsBadReadPtr.

Интересно...
И что будете далее делать, если он таки bad ?

да и именно это можно сделать проще и универсальные.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180749
Фотография Poppler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ что будете далее делать, если он таки bad ?

Дальше фиксить баг.))
В унаследованном коде где-то не стоит критическая секция и как следствие часто рушится приложение. Чем проводить полный код ревью проще попробовать воткнуть туда логирование или брекпоинт.

MasterZivда и именно это можно сделать проще и универсальные.

Как? Мне нужно в случае если указателен неверен или логировать или срабатывать на брекпоинте (DebugBreak();).
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180849
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poppler,

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

Можешь также просто поймать ... и обработать, можно SEH использовать, SEH даже лучше немного.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38180873
Фотография Poppler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПросто ничего не делай, программа сама свалится в нужном месте. Если запустить под отладчиком, получишь стек и все что там еще надо.

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

MasterZivМожешь также просто поймать ... и обработать, можно SEH использовать, SEH даже лучше немного.

Чем лучше? Нету информации где именно происходит изменение указателя и где мне нужно вставить критическую секцию.
На данный момент известно только то, что указатель портится, известно в каком месте обычно падает, а источник где указатель портиться неизвестен, а это место весьма вероятно далеко от места падения.
Идея была в том, чтобы перехватить в одном месте все попытки изменения указателя.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38181100
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Poppler,

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

Просто чтобы DebugBreak сработал, тебе нужно на машине иметь отладчик установленный, к нему для твоей программы нужна отладочная информация, и желательно программа должна быть собрана без оптимизации (/G0).

Если трудности с именно кодом хитрого указателя -- возми код любого хитрого указателя в сети где-то, хотя бы из буста, или найди,
и добавь туда проверки какие нужно.

Ну и тебе придётся всю программу пересобрать, все модули.
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38181117
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откуда можно взять код smatp pointer-а:

http://www.codeproject.com/Articles/15351/Implementing-a-simple-smart-pointer-in-c (Reference counting тебе не нужно). -- хорошо, потому что код независим абсолютно ни от чего.

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/scoped_ptr.htm (может быть немного проблемно выдрать код из буста)
...
Рейтинг: 0 / 0
Перехват доступа по указателю
    #38181137
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PopplerMasterZivМожешь также просто поймать ... и обработать, можно SEH использовать, SEH даже лучше немного.

Чем лучше? Нету информации где именно происходит изменение указателя и где мне нужно вставить критическую секцию.



Ты сможешь поймать исключение не после выброса его, а в момент выброса, т.е. стек будет не раскручен.
Подробности тут: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

А по

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


-- все попытки изменения указателя ты НЕ перехватишь таким образом, ты перехватишь только попытки изменения его с помощью инициализации и присваивания.

А ещё (и как правило так и происходит) может просто затираться память, это только отладчиком отлавливается, ставится прерывание по записи в память, используемую этим указателем.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват доступа по указателю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]