Die kurze Antwort ist kein.
Die etwas längere Antwort ist nein, nicht für irgendein nicht-trivial Programm in irgendeiner Programmiersprache. Die längere Antwort ist, dass Sie mehr oder weniger the halting problem beschreiben. Es gibt keinen allgemeinen Weg zu bestimmen, welche Methoden erreichbar sind und welche nicht, weil Sie das Halteproblem lösen müssen.
Stellen Sie sich eine while
Schleife und nach der Schleife ist der einzige Anruf an myfunc()
. Wird myfunc()
aufgerufen? Sie können nicht wissen, weil die Schleife beendet werden kann oder nicht. Vielleicht beruht die Schleife auf einer Variablen, die an die Funktion übergeben wird. Vielleicht ist es auf Eingaben des Benutzers angewiesen. Was auch immer der Fall ist, wenn die Schleife beendet wird, wird myfunc()
aufgerufen. Wenn die Schleife nicht beendet wird, ist myfunc()
ein ungültiger Code, der niemals aufgerufen wird. Lassen Sie uns einfach sagen, Sie tun while(Console.ReadLine() != "G") { }
. Ruft Ihr Programm myfunc()
auf? Hängt von der Eingabe ab!
Und ähnlich wie das Halteproblem können Sie trivial kleine Programme konstruieren, die immer die richtige Antwort produzieren, oder extrem winzige endliche Automaten erstellen, die immer die richtige Antwort produzieren. Aber wenn Sie dann Ihr statisches Analyseprogramm verwenden und es sogar auf einer relativ kleinen App ausführen, übersteigt die Anzahl der möglichen Zustandskombinationen schnell die Anzahl der verfügbaren Atome im Universum.
Die einzige Möglichkeit zu wissen, ob Ihr Programm diese Funktion oder diese Funktion aufrufen wird, ist es auszuführen und zu sehen, ob es funktioniert. Dann können Sie sagen "Für die Eingabe X, in der Umgebung Y, in der CPU Z, zur Datumzeit D, in Anbetracht dieser Versionen dieser Systembibliotheken, während das System unter dieser Menge an CPU-Last war, und diese Menge an I/O-Last, und wo Bodenvibrationen die Festplatte nicht unterbrachen und wo ein kosmischer Strahl keine Bits im Speicher umwandelte, nannte mein Programm die Teilmenge G aller verfügbaren Funktionen F ".
Wenn sich eine dieser Variablen ändert (die Eingabe ist die primäre), ist Ihre vorherige Analyse unvollständig.
Hinweis: Es ist nicht einmal möglich, starke Garantien dafür zu geben, welche Funktionen möglicherweise aufgerufen werden können, da Reflection jede Funktion aufrufen kann, indem sie eine Zeichenfolge erstellt (also nicht nach Funktionsnamen sucht) oder gar generieren und injizieren kann brandneue Funktionen in Ihrem Programm.
Als eine kleine Notiz, garantiert ist zu stark, um getan zu werden (siehe das Halteprogramm, wenn Sie wissen wollen, warum). Es ist jedoch sicher möglich, Funktionen zu erkennen, die möglicherweise aufgerufen werden können. – Guvante
Sie können einige Fälle abdecken, aber zumindest nicht alle. Nehmen Sie eine Funktion, die eine Eingabe (Datei, Tastatur) und einen Schalter mit 50 Fällen am Eingang hat und jeweils einen neuen Funktionsaufruf hat. Dann kommt es auf die gegebenen Daten an. – user743414