Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Найти все вызовы функции с нулевым параметром... [D5]


kull ©   (2005-09-19 12:19:00) 

Привет, народ!

Передо мной появилась такая задача.
Дано:
 function GetBuffer(var P: Pointer; const Size: DWORD): Boolean;

Задача:
 Найти в проекте все вызовы  этой функции с параметром Size = 0.

Все если Size передается как константа 0, то проблем нет. Но ведь на вход для параметра Size может передаваться переменная с ранее присвоенным значением 0.

Можно было бы писать в лог из этой функции, если Size=0, но используется эта функция в куче мест, и прогнать все вызовы GetBuffer в Runtime просто нереально.

Какие будут предложения, и есть ли у задачи вообще решение?


Kolan   (2005-09-21 00:18:00) [1]


>  убеждать менеджерав этом


Он то чё лезет. Он за сроки(итд) в ответе, а не за архитектуру приложения.


kull   (2005-09-20 19:04:00) [2]


> Игорь Шевченко ©   (20.09.05 12:50) [11]

Согласен.

Но проблемы не решает, т.к. оный (дизайн) уже в наличии.


> evvcom ©   (20.09.05 13:47) [12]

Согласен.

И я уже устал убеждать менеджера в этом. К сожалению весь стиль программирования такой, что вызываемый должен предполагать кто его вызывает и зачем, а вызывающий - предполагать что творится внутри функции. Тьфу! Аж тошно. Да ну ето все в болото! :(

Вообщем, отфильтровать ответы до краткости, как я и предполагал в начале - решения не существует. Ну если, конечно, только ручками в тупую.


evvcom   (2005-09-20 13:47:00) [3]

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


Игорь Шевченко   (2005-09-20 12:50:00) [4]


> В проекте куча окон, у окон куча кнопочек, которые вызывают
> кучу методов.
> Из этих методов вызывается вышеуказанная функция.
>
> Вызовов функции > 1000 мест.
>
> Проект очень большой и перенажимать на все кнопочки, чтобы
> пройти все места где вызывается вышеуказанная функция просто
> нереально.


Ошибка дизайна


Digitman   (2005-09-20 12:47:00) [5]


> перенажимать на все кнопочки, чтобы пройти все места где
> вызывается вышеуказанная функция просто нереально


ну а раз так, то это значит что нереально пройти все потенциально возможные ветки алгоритма программы

т.е. ты сам себе противоречишь в


> Проверяются все его функциональности, в которых может быть
> вызов этой функции


максимум что можно сделать, это протоколировать инф-цию в след.виде: при нажатии такой-то кнопки (и при таких-то доп.прогр.условиях) в ходе выполнения ее обработчика данная (исследуемая) ф-ция была вызвана (прямо или косвенно) там-то и там-то по тексту проекта, в такой-то временной последовательности и конкретно с такими-то фактическими параметрами


kull   (2005-09-20 12:28:00) [6]


> Digitman ©   (20.09.05 11:15) [8]

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

В проекте куча окон, у окон куча кнопочек, которые вызывают кучу методов.
Из этих методов вызывается вышеуказанная функция.

Вызовов функции > 1000 мест.

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


Digitman   (2005-09-20 11:15:00) [7]


> kull   (20.09.05 10:21) [6]


и какие проблемы ?

вставляешь в начало тела ф-ции GetBuffer() код, протоколирующий адрес ее фактического вызова (расчитывается на основе адреса возврата, лежащего в стеке на момент фактической передачи управления ф-ции) и  факт.параметры вызова


Anatoly Podgoretsky   (2005-09-20 10:26:00) [8]

kull   (20.09.05 10:21) [6]
Это логарифмитическая зависимость.


kull   (2005-09-20 10:21:00) [9]


> Digitman ©   (19.09.05 13:54) [4]

Поясняю...
Запускается приложение (RunTime) (откомпиленный проект) и либо ручками, либо с помощью автоматических тестов. Проверяются все его функциональности, в которых может быть вызов этой функции. Т.е. все возможные ветви поведения программы с вызовом GetBuffer.


Владислав   (2005-09-19 14:05:00) [10]

Вариант. Assert(Size <> 0) + call stack.


Digitman   (2005-09-19 13:54:00) [11]


> или меня не поняли


именно так.

давай уже поясняй термин "прогнать все вызовы".


kull   (2005-09-19 13:42:00) [12]

Или я не понял, или меня не поняли. :)
см. выше.
"...прогнать все вызовы GetBuffer в Runtime просто нереально"

Э... Так что делать?


Digitman   (2005-09-19 12:27:00) [13]


> Можно было бы писать в лог из этой функции, если Size=0,


лучше всего так и поступить


> используется эта функция в куче мест


адрес возврата, лежащий в стеке в момент исполнения тела ф-ции, даст нужную инф-цию о месте в программе, откуда был произведен вызов


TUser   (2005-09-19 12:26:00) [14]

Поставить брикпоинты с условием Size = 0 ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо