2013-05-23 2 views
0

В моем коде, я ве получил функцию много деклараций с недействительными указателями в качестве аргументаразбора C++/отслеживание недействительных указателей

void my_func(void* my_void_pointer) 

Мне нужно найти все места в моих источниках

  1. где my_func называется
  2. (что более важно), с каким типом в качестве аргумента.

Например вызовы, такие как:

int* intpt=new int(10); 
my_func(intpt); 

или

char* charpt = new char('a'); 
my_func(charpt); 

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

Я уже посмотрел gcc_xml, но с помощью этого инструмента могу узнать, какие функции определены с помощью каких аргументов/типов аргументов. Конечно, теперь я могу grep источники для вызова функций таких функций, но я до сих пор не знаю, с какими типами они вызываются. Любая идея, с какого инструмента начать?

+0

Надеюсь, вы поймете, почему это была плохая идея (т. Е. Использовать 'void *' как аргумент стираемого типа), если только это не для интерфейса C, и в этом случае интерфейс может содержать суффикс имени типа и выполнять правильное преобразование на этом уровне, предотвращая собственный код, по крайней мере, от хакерских типов. – rubenvb

+0

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

+0

Я чувствую для вас тогда ':)'. Удачи! – rubenvb

ответ

1

Переименуйте аргумент, не являющегося указателем и перекомпилировать. Вы должны получать ошибки, такие как cannot convert int* to int или cannot convert char* to int везде, где вы вызываете вашу функцию.

2

Начать с вашего компилятора. Перейдите и проломите прототип и версию my_func, переименовав его в Xmy_func (или любые другие изменения) и перекомпилируйте ... компилятор скажет вам каждое место, которое оно использует.

+0

Спасибо, отличная идея, но как мне узнать, с какими типами аргументов она называется? – ProfHase85

+1

Если у вас есть среда IDE, которая позволяет вам щелкнуть по ошибке, чтобы перейти к строке содержащего ее кода, вы делаете это для каждого случая и используете Eyeball (2.0), чтобы проверить, какие аргументы используются :) – mah

+0

Спасибо, изменение @ mark-tolonen решает его: я изменю список аргументов и grep для вхождений – ProfHase85

0

Вариант 1. Используйте следующую команду для сериализации встречающихся объектов my_func в исходном каталоге.

grep "my_func(" * 

Вариант 2. Использование навигатора источника. Откройте источник в исходном навигаторе и найдите имя функции «my_func».

0

Если вы работаете в * NIX терминала, вы можете попробовать что-то вроде этого:

// in project root folder 
// you can replace *.cpp with *.h or *.hpp etc 
for i in $(find . -type f -name "*.cpp"); do \ 
grep -Hn "my_func" $i; \ 
done; 
+0

-Hn вариант выдает вам имя файла и номер строки, где существует функция. –

+0

Существует также сверхбыстрый [Серебряный поиск] (http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/) в качестве альтернативы grep. – Gui13

+0

Да, но это не помогает мне найти, с какими аргументами вызывается функция, поэтому я называю 'my_func' с переменной int * или с символом' char * ' – ProfHase85

0

С помощью современной IDE, такой как Eclipse CDT, вы можете искать все вхождения каждой из ваших функций и исследовать сайты вызовов. Обратите внимание, однако, что Eclipse CDT, по-видимому, не может отличить перегрузки при поиске, как это делает его аналог Java.

Смежные вопросы