Короткий ответ: нет.
Немного более длинный ответ — нет, ни для какой-либо нетривиальной программы на любом языке программирования.
Более длинный ответ заключается в том, что вы более или менее описываете проблему остановки. Не существует общего способа определить, какие методы достижимы, а какие нет, потому что для этого вам нужно решить проблему остановки.
Представьте себе цикл while
, после которого идет единственный вызов myfunc()
. myfunc()
называется? Вы не можете знать, потому что цикл может или не может закончиться. Возможно, цикл зависит от переменной, переданной в функцию. Возможно, это зависит от ввода пользователя. В любом случае, если цикл завершается, вызывается myfunc()
. Если цикл не прерывается, то myfunc()
— мертвый код, который никогда не будет вызван. Скажем так, вы делаете while(Console.ReadLine() != "G") { }
. Ваша программа вызывает myfunc()
? Зависит от входа!
И, как и в случае с проблемой остановки, вы можете создавать тривиально маленькие программы, которые всегда выдают правильный ответ, или создавать очень маленькие конечные автоматы, которые всегда выдают правильный ответ. Но если вы затем возьмете свою программу статического анализа и запустите ее даже в относительно небольшом приложении, количество потенциальных комбинаций состояний быстро превысит количество доступных атомов во Вселенной.
Единственный способ узнать, будет ли ваша программа вызывать ту или иную функцию, — запустить ее и посмотреть, вызывает ли она ее. Затем вы можете сказать: «Для ввода X, в среде Y, на ЦП Z, в дату и время D, учитывая эти версии этих системных библиотек, в то время как система находилась под такой нагрузкой ЦП и такой нагрузкой ввода-вывода, и там, где колебания земли не прерывали работу жесткого диска, и где космический луч не переворачивал биты в памяти, моя программа называла подмножество G всех доступных функций F».
Если какая-либо из этих переменных изменится (входная будет основной), то ваш предыдущий анализ будет неполным.
Примечание. Невозможно даже дать строгие гарантии того, какие функции могут быть вызваны, потому что отражение может вызывать любую функцию, создавая строку (поэтому вы даже не можете сканировать имена функций), или даже генерировать и внедрять совершенно новые функции в ваша программа.
person
russbishop
schedule
13.04.2014