Есть ли способ извлечь утверждения из C файлов? - PullRequest
1 голос
/ 21 апреля 2020

Есть ли простой способ извлечь внутреннюю часть функций assert из C файлов?

Например -

assert(cred->keytab == NULL);

/*
assert(1==1);
*/

Вывод должен быть -

cred->keytab == NULL

Я ищу что-то вроде xgettext только для функций assert.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

Просто используйте препроцессор, и он появится на stderr:


#undef assert(x)

int main(void)
{
int x=1;

assert(x==1);
return 0;
}

$ cc -Wall assertz.c
 warning: extra tokens at end of #undef directive [enabled by default]
 #undef assert(x)
              ^
assertz.c: In function ‘main’:
assertz.c:8:1: warning: implicit declaration of function ‘assert’ [-Wimplicit-function-declaration]
 assert(x==1);
 ^
2 голосов
/ 21 апреля 2020

Как насчет того, чтобы позволить процессору избавиться от комментариев?

gcc -E prog.c -fpreprocessed | \
  sed -re 's/^.*assert[ \t]*[(](.*)[)].*$/\1/;t;d'
1 голос
/ 21 апреля 2020

Вы можете сделать это с помощью awk (если вы согласны с этим), это также позаботится, если функция assert входит в комментарии, она пропустит это.

awk '
/^\/\/assert/{
  next
}
/assert/ && !found{
  match($0,/\(.*\)/)
  print substr($0,RSTART+1,RLENGTH-2)
  next
}
/^\/*/{
  found=1
  next
}
/^\*\//{
  found=""
}
'  Input_file
...