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

Я столкнулся с вопросом, касающимся написания кода для определения неиспользуемых функций в C++. Мы можем использовать различные структуры данных для определения неиспользуемых функций. Но перед этим нам нужно разобрать код. У меня есть вопрос, связанный с частью синтаксического анализа, как мы можем различать объявление и определение функций и вызовы функций?

Нравиться,

 //function declaration without argument
 fun1 ();

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

 main () {
   fun1 ();
  }

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

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

Как можно эффективно реализовать синтаксический анализ? Сколько синтаксических анализов потребуется в приведенном выше сценарии?


person Sach    schedule 16.07.2012    source источник
comment
Я не гуру С++, но разве объявления и определения функций не обозначают тип возвращаемого значения?   -  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
@ Аднан Не знать о implicit int, наверное, хорошо.   -  person pmr    schedule 16.07.2012
comment
@pmr: IIRC, C++ не допускает неявный возвращаемый тип int.   -  person Marcelo Cantos    schedule 16.07.2012
comment
@ Аднан и Марсело: вы правы. Неявный возвращаемый тип не допускается в 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