BinaryOperator не работает, когда дело доходит до a=function(b,c)?

Я хочу идентифицировать выражение как int a = function(b,c), поэтому я написал код как последователи:

void foo(int* a, int *b) {
int x;
int m;
int z;
int *p;
  if (a[0] > 1) {
    b[0] = 2;
    z=10;
    x = function( sizeof(char));
  }
  m = function( sizeof(char));
   bar(x,m);
}

void bar(float x, float y);

int function(int size){
    return size;
}

Затем я использовал clang -Xclang -ast-dump -fsyntax-only cfunc_with_if.c для получения AST кода: введите здесь описание изображения

В результате я обнаружил, что тип узла AST int a = function(b,c)BinaryOperator. Чтобы убедиться в этом, я использую VisitStmt(Stmt *s) для вывода всех типов stmts.

bool VisitStmt(Stmt *s) {
    if(isa<Stmt>(s)) {
        Stmt *Statement = dyn_cast<Stmt>(s);
    //Statement->dump();
    std::string st(Statement->getStmtClassName());
    st = st + "\n";
    TheRewriter.InsertText(Statement->getLocStart(), st, true, true);
    }
  return true;
  }

Но результат такой странный. ничего не распечатывается о типе int a = function(b,c). и я так смущен результатом. Есть ли какая-то ошибка в моем коде или что-то еще?

введите здесь описание изображения


person Aries_Liu    schedule 09.06.2017    source источник


Ответы (1)


В bar(x,m); тоже нет выхода. Есть ли ошибки, когда инструмент компилирует анализируемый код? Как написано выше, код не скомпилируется в x = function( sizeof(char));, так как function не был объявлен. Даже когда компиляция не удалась из-за ошибок, инструменты libtool все еще могут работать, по крайней мере частично, со странными результатами.

Изменить, чтобы добавить: что произойдет, если вы запустите инструмент для этого кода?

void bar(float x, float y);

int function(int size);

void foo(int* a, int *b) {
int x;
int m;
int z;
int *p;
  if (a[0] > 1) {
    b[0] = 2;
    z=10;
    x = function( sizeof(char));
  }
  m = function( sizeof(char));
   bar(x,m);
}

void bar(float x, float y);

int function(int size){
    return size;
}
person Some Who Call Me Tim    schedule 12.06.2017
comment
На самом деле я не знаю о коде, но когда я использовал код в этом ссылка Я могу получить имя каждого CallExpr - person Aries_Liu; 14.06.2017