|
I don't have the IP for the code so I can't copy it here, but what I did was very simple and the gist of it is described below: The parser used regular expressions to recognise function definitions and calls in those definitions.
I used file names as the function scope, this was good enough because there were no two functions with identical names in the same file.
Function calls became the following terms: "calls(x,y,z).", meaning that function x in file y calls z. These "calls" terms actually define a directed graph.
If you google "prolog path through directed graph", there are lots of hits that will help you out.
The following (untested) code should get you started: %there is a path if there is a call
path(Caller, File, Called, [calls(Caller, File, Called)]) :- calls(Caller, File, Called).
%there is a path if there is a call to some function and there is a path from that function
path(Caller, File, Called, [calls(Caller, File, A) | P]) :- calls(Caller, File, A), path(A, _, Called).
After that, you can find all possible paths with "findall/3" and check for existence of a certain known good/bad function with "member/2" (again, google is your friend)Due to some properties of the code, this simple approach worked well enough for me.
Hopefully this helps you out. |