글로벌, 스태틱, 로컬변수..등 분류할수 있는 종은 방법이 없을까요?

오호라의 이미지

좀 지난 일이긴 한데(결국 수동으로 해결)...

전체소스에서 글로벌, 스태틱 변수를 찾을 일이 있었습니다.

처음에는 egrep, sed, awk 으로 간단하게 끝내리라 했지만 결과는 OTL...

각종 typedef, extern, enum... 등으로 변수가 많더군요.

그냥 lex(flex)로 끝내버리리라~ 했지만, 아시다시피 C grammer 가 얼마나 오묘(?)한지 잔머리굴려도 잘안되길래.

구글링으로 c grammer 가져다가 수정해서 작업하던 찰례에...

포기했죠. 어차피 코드까지 같이 수정해야 하기 때문에 결국 일일이 파일을 열어서 확인했죠. (ㅠㅠ)

지나고보니까. 획기적인 방법이 있을거 같은데 생각이 안나에요.

뭔가 좋은 방법이 없을까요?

ps. 프로파일러, 분석기..등도 좋습니다.

체스맨의 이미지

일단, global 및 static 은 컴파일 된 오브젝트 파일에 nm 명령을 적용하고 sed 나 grep 을 통과하면 추려낼 수 있습니다. 로컬 변수에 대해서는 당장 떠오르는 아이디어가 없네요.

Orion Project : http://orionids.org

오호라의 이미지

소스파일 가지고 어떻게 해볼까 궁리만 했습니다.

역시 생각은 공유해야 하나 봅니다. 감사합니다.

일단 2/3는 해결됐네요. ^^

Hello World.

kalstein의 이미지

Visual Studio만 해도...대충은 보일테구요...

SourceInsight 같은 소스분석 툴들도 보여주고...

결과를 텍스트파일로 뽑으실껀가요?

lex를 이용하신다면야...left brace로 시작했는지 안했는지 state machine을 만들어야 될듯?

변수 선언문이 '{' '}' 밖에 있으면 global인거잖아요.

static인지 아닌지는 훨씬 찾기 더 쉽구요...


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

체스맨의 이미지

발제자님께서 경험하신 것처럼, 제대로 하자면, { 밖에 있는 것을 찾는다는 게 생각처럼 간단하지 않습니다. 우선은 전처리기를 통과시키면, 복잡한 인클루드나 매크로 확장 문제는 벗어날 수 있겠지만, { 밖에 존재하는 코드들이 전역 변수만 있는 건 아니니, 그 중에 선언부를 골라내야 하는데, 여러 복잡한 문제가 많습니다. 미리 C 파서를 보유하고 있지 않는한, 이거 하나 하자고 그렇게 하기는 좀 그렇죠.

nm 이면 글로벌, 스태틱은 쉽게 일괄처리로 찾아집니다. 윈도 경우는 dumpbin 이 있구요.

Orion Project : http://orionids.org

오호라의 이미지

typedef 된 타입을 함수포인터변수에 extern 해서 쓰고, ..등등 좀 난해한 점들이 있습니다.

거의 파서레벨에서야 가능할듯 싶습니다.

AST 만들고 거기서 원하는 정보를 추출하는 식으로 해야 할듯 한데...

AST까지도 필요없고 스캐너(flex)만으로도 충분할 듯한데, 일단 Lex으로 만들어 봐야 겠네요. ^^;

Hello World.

체스맨의 이미지

변수의 타입 정보까지 필요하다면, preprocessor 를 통과시킨뒤, ctags 로 태그 정보를 생성하고, 그것을 sed 해도 될 것 같습니다.

지역변수는 아무래도 파싱이 필요할 것 같지만, 몇 개 툴들을 조합하면 C 파서 수준까지 안가도 어느 정도 추릴 수 있을 것 같네요.

Orion Project : http://orionids.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.