Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

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

 
kull   (2005-09-19 12:19) [0]

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

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

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

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

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

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


 
TUser ©   (2005-09-19 12:26) [1]

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


 
Digitman ©   (2005-09-19 12:27) [2]


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


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


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


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


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

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

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


 
Digitman ©   (2005-09-19 13:54) [4]


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


именно так.

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


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

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


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


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

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


 
Anatoly Podgoretsky ©   (2005-09-20 10:26) [7]

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


 
Digitman ©   (2005-09-20 11:15) [8]


> kull   (20.09.05 10:21) [6]


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

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


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


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

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

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

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

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


 
Digitman ©   (2005-09-20 12:47) [10]


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


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

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


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


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


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


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


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


 
evvcom ©   (2005-09-20 13:47) [12]

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


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


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

Согласен.

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


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

Согласен.

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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.067 c
14-1126852705
BHyK
2005-09-16 10:38
2005.10.09
Conter-Strike по телефону.


9-1117168849
Slavikk
2005-05-27 08:40
2005.10.09
GLScene - классы


14-1127011917
Body
2005-09-18 06:51
2005.10.09
Физика


1-1127214094
Leonid
2005-09-20 15:01
2005.10.09
Как отловить неиспользуемые процедуры


3-1125043936
Виталий Панасенко
2005-08-26 12:12
2005.10.09
Возник. ошибки в дес.-тайме при попытке создать экземпляры полей