/**
 * @name Uses of recursion
 * @description Avoiding recursion allows tools and people to better analyze the program.
 * @kind problem
 * @id cpp/jpl-c/recursion
 * @problem.severity warning
 */

import cpp

class RecursiveCall extends FunctionCall {
  RecursiveCall() {
    this.getTarget().calls*(this.getEnclosingFunction())
  }
}

from RecursiveCall call, string msg
where if (call.getTarget() = call.getEnclosingFunction()) then
         msg = "This call directly invokes its containing function $@."
      else
         msg = "The function " + call.getEnclosingFunction() + " is indirectly recursive via this call to $@."
select call, msg, call.getTarget(), call.getTarget().getName()
