разбор 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);

I need this because usually my_func does a reinterpret_cast to some self defined types and I would like to find out what possibly could go wrong if fабо example my byteабоder changes.

I have already had a look at gcc_xml, but with this tool I can only find out which functions are defined with which arguments/argument types. Of course I could now grep the sources fабо function calls of such functions, but I still do not know with which types they are called with. Any idea which tool to start with?

0
Я спадзяюся, вы разумееце, чаму гэта была дрэнная ідэя (гэта значыць выкарыстоўваць несапраўдныя * у якасці аргументу тыпу сцёртых), калі гэта не для інтэрфейсу C, у гэтым выпадку інтэрфейс можа ўтрымліваць суфікс TYPENAME і зрабіць правільнае пераўтварэнне ў гэтым пласце, прадухіляючы уласны код, па меншай меры ад узлому типобезопасности.
дададзена аўтар rubenvb, крыніца
Я адчуваю для вас, то :) . Поспехаў!
дададзена аўтар rubenvb, крыніца
На жаль, я бачу вельмі выразна, чаму гэта дрэнная ідэя, каб зламаць типобезопасность. У гэтым выпадку мне трэба апрацоўваць спадчыну кода, які павінен быць перанесены на іншую платформу, і мне трэба, каб высветліць, на якіх падставах ён зламаецца
дададзена аўтар ProfHase85, крыніца

7 адказы

Пачніце з кампілятарам. Ідзіце і зламаць прататып і рэалізацыі my_func , пераназваўшы яго ў Xmy_func (ці любога іншага змены) і перасабраць ... кампілятар пакажа вам ўсе месцы, ён выкарыстоўваецца.

2
дададзена
Калі ў вас ёсць IDE, што дазваляе націснуць на памылку, каб перайсці да радка коды, якая змяшчае яго, вы робіце гэта для кожнага выпадку і выкарыстоўваць вочны яблык (2.0), каб праверыць, якія аргументы выкарыстоўваюцца :)
дададзена аўтар mah, крыніца
Дзякуй, выдатная ідэя, але як жа я тады даведацца, з якім тыпам аргументу ён называецца?
дададзена аўтар ProfHase85, крыніца
Дзякуй, мадыфікацыя @ нацэнка Tolonen вырашае: я змяню спіс аргументаў і Grep для уваходжанняў
дададзена аўтар ProfHase85, крыніца

Пераназавіце аргумент, якi не з'яўляецца паказальнікам і перакампіляванні. Вы павінны атрымаць памылкі як не можа пераўтварыць Int * ў цэлым або не можа пераўтварыць сімвал * ў цэлым , дзе ваша функцыя выклікаецца.

1
дададзена

Вы маглі б напісаць невялікую ўтыліту, выкарыстоўваючы Clang Інструментальнае .

1
дададзена

З сучасным IDE, такія як Eclipse CDT , вы можаце выканаць пошук усіх уваходжанняў кожнай з функцый і вывучыць сайты выклікаў. Аднак варта адзначыць, што Eclipse CDT не зьяўляецца, каб быць у стане адрозніць перагрузкі пры пошуку, так як яго калега Ja робіць.

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
дададзена
так, але гэта не дапамагае мне знайсці з які аргумент тыпу функцыя выклікаецца, ці так я называць my_func з INT * пераменная або з паўкокс *
дададзена аўтар ProfHase85, крыніца
дададзена аўтар Gui13, крыніца
У гэтым выпадку адказ MAH з'яўляецца вашым ісці. Акрамя таго, можна змяніць прататып функцыі, каб прыняць тое, што не можа быць адліванымі як несапраўдным * першапачаткова. Гэта анс трохі аналізу лог дасць вам прадстаўленне аб якіх выкарыстоўваюцца тыпы /
дададзена аўтар Gui13, крыніца
-Hn выхад варыянт для вас імя файла і нумар радка, дзе функцыя існуе.
дададзена аўтар Artem Agasiev, крыніца

Калі вы працуеце ў * 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
дададзена
так, але гэта не дапамагае мне знайсці з які аргумент тыпу функцыя выклікаецца, ці так я называць my_func з INT * пераменная або з паўкокс *
дададзена аўтар ProfHase85, крыніца
дададзена аўтар Gui13, крыніца
У гэтым выпадку адказ MAH з'яўляецца вашым ісці. Акрамя таго, можна змяніць прататып функцыі, каб прыняць тое, што не можа быць адліванымі як несапраўдным * першапачаткова. Гэта анс трохі аналізу лог дасць вам прадстаўленне аб якіх выкарыстоўваюцца тыпы /
дададзена аўтар Gui13, крыніца
-Hn выхад варыянт для вас імя файла і нумар радка, дзе функцыя існуе.
дададзена аўтар Artem Agasiev, крыніца

Варыянт 1. З дапамогай наступнай каманды да пошуку ў occureneces з my_func ў зыходным каталогу.

grep "my_func(" * 

Варыянт 2. Выкарыстанне крыніцы навігатара. Адкрыць крыніцу ў зыходным штурмана і пошук імя функцыі «my_func».

0
дададзена