![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти все вызовы функции с нулевым параметром... [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 ?