определяне на декларация, дефиниция и извикване на функция

Попаднах на въпрос относно писането на код за определяне на неизползвани функции в C++. Можем да използваме различни структури от данни, за да определим неизползваните функции. Но преди това трябва да анализираме кода. Имам въпрос, свързан с частта за анализиране, как можем да разграничим декларацията и дефиницията на функции и извикванията на функции?

Като,

 //function declaration without argument
 fun1 ();

 //function definition
 fun1 () {
   // code goes here
  }

 main () {
   fun1 ();
  }

Декларацията и извикването по-горе изглеждат по същия начин, където дефиниционната част е малко по-различна от декларацията и извикването.

Освен горния сценарий, има множество сценарии за извикване на функция и обхват на функции, като два класа, които имат функция с едно и също име, една функция се извиква в рамките на членска функция (т.е. не се изисква изричен извикващ обект) ИЛИ извикване на функция с използване на обект, така че трябва да разберете първо типът на обекта, за да определите коя функция всъщност се извиква.

Как може ефективно да се приложи парсирането? Колко парсинга ще са необходими в горния сценарий?


person Sach    schedule 16.07.2012    source източник
comment
Не съм C++ гуру, но функционалните декларации и дефиниции не обозначават типа на връщаната стойност?   -  person Adi    schedule 16.07.2012
comment
@Adnan Освен ако смятате, че implicit int е така. @Sachin Разборът на C++ е невероятно труден. Предлагам да използвате libclang, за да направите синтактичния анализ вместо вас и да направите вашия статичен анализ с него, вместо да се опитвате да направите това сами. Това става невероятно трудно с шаблоните.   -  person pmr    schedule 16.07.2012
comment
Благодаря @pmr, трябва да се занимавам малко повече с C++.   -  person Adi    schedule 16.07.2012
comment
@Adnan Да не знаеш за implicit int вероятно е хубаво нещо.   -  person pmr    schedule 16.07.2012
comment
@pmr: IIRC, C++ не позволява неявния тип връщане int.   -  person Marcelo Cantos    schedule 16.07.2012
comment
@Adnan and Marcelo : Вие сте прави. Неявният върнат тип не е разрешен в C++. по принцип се опитвах да опиша най-простия сценарий от различни сценарии за статичен анализ като отмяна на функция или виртуални функции или функция с подобно име от различно пространство на имена.   -  person Sach    schedule 16.07.2012


Отговори (1)


Ето как можете да ги различите:

//function definition
return_type fun1 (args) {
  // code goes here
}

Имайте предвид, че дефиницията на функцията има "връщане тип" преди името на функцията.

Също така имайте предвид, че декларацията на функция изглежда точно както нейната дефиниция. Всъщност не е нужно да ги различавате, докато не видите ; или {. Това е точката, в която вие вземате решение дали това е декларация или дефиниция. Във вашето конкретно приложение не ви интересува наистина, защото не ви интересува какво всъщност прави функцията.

За ваше съжаление, C++ е сложен. За да определите кои функции са безполезни, всъщност ви е необходим поне основен семантичен анализ. Това включва поне системата от типове.

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

person Shahbaz    schedule 16.07.2012
comment
Това ми напомня на Монти Пайтън: Каква е разликата между патица? Напълно сериозно обаче предполагате ли, че декларациите на функции нямат тип връщане? - person Marcelo Cantos; 16.07.2012
comment
Ах, разбирам какво имаш предвид! Актуализирах отговора си. - person Shahbaz; 16.07.2012
comment
@Shahbaz: Изглежда сложно да се определят извикванията на функции чрез статичен анализ. Ако все още се извършва статичен синтактичен анализ, трябва да имате предвид неговото ограничение, че функцията заменя и други сценарии няма да могат да се справят. Благодаря. Мисля че го схванах. - person Sach; 16.07.2012
comment
Сложно е. Можете да го направите малко интелигентно със системата от типове или малко изпълнение (не истинско изпълнение, но ако приемем, че всички случаи на if и else са били изпълнени), за да получите възможните типове деца, които родителят може да приеме, но в крайна сметка, винаги можете да измислите примери, че алгоритъмът генерира фалшиви положителни резултати (или ако е твърде ограничен, фалшиви отрицателни). - person Shahbaz; 16.07.2012