Hi everyone,
I have just got started with clang development. My first project would extract the return value from each path. I can get the return value quite easily, but have some problem with path representation. For example, given the following very simple function,
1: int jump(int x){
2: int result = x;
4: if (x < 5) {
result = -1;
6: goto out;
}
9: result = 0;
out:
12: return result;
}
I would like to return two paths and their corresponding return values. I use line numbers to represent each path.
Path Return value
L6, L12 -1
L12 0
The problem I am having now is that I am not able to get line numbers of goto statements, although my checker writes callback functions for goto statements. My code is as follows. I have tried to add callback functions for PreStmt on both GotoStmt and IndirectGotoStmt and also PostStmt on them, but never got line numbers for goto statements. I can get line numbers for return statements with the following code.
Does anybody have any idea about why this happens?
Thank you for your help.
Sheng
namespace {
class CheckReturnValue : public Checker< check::PreStmt,
check::PreStmt,
check::PostStmt> {
public:
void checkPreStmt(const ReturnStmt *DS, CheckerContext &C) const;
void checkPreStmt(const IndirectGotoStmt *DS, CheckerContext &C) const;
void checkPostStmt(const GotoStmt *DS, CheckerContext &C) const;
private:
static bool isNegative(CheckerContext &C, const Expr *E);
};
} // end anonymous namespace
void CheckReturnValue::checkPostStmt(const GotoStmt *DS, CheckerContext &C) const{
llvm :: outs() << “Goto statement\t”;
DS → getLocStart().print(llvm::outs(),C.getSourceManager()) ;
}
void CheckReturnValue::checkPreStmt(const IndirectGotoStmt *DS, CheckerContext &C) const {
llvm :: outs() << “Indirect goto statement\t”;
DS → getLocStart().print(llvm::outs(),C.getSourceManager()) ;
}
void CheckReturnValue::checkPreStmt(const ReturnStmt DS, CheckerContext &C) const {
const Expr retExp = DS → getRetValue() ;
retExp → printPretty(llvm::outs(), NULL, PrintingPolicy(LangOptions())) ;
llvm :: outs() << “\tLocation\t”;
DS → getLocStart().print(llvm::outs(),C.getSourceManager()) ;
}