글로벌, 스태틱, 로컬변수..등 분류할수 있는 종은 방법이 없을까요?
글쓴이: 오호라 / 작성시간: 수, 2008/02/27 - 10:06오전
좀 지난 일이긴 한데(결국 수동으로 해결)...
전체소스에서 글로벌, 스태틱 변수를 찾을 일이 있었습니다.
처음에는 egrep, sed, awk 으로 간단하게 끝내리라 했지만 결과는 OTL...
각종 typedef, extern, enum... 등으로 변수가 많더군요.
그냥 lex(flex)로 끝내버리리라~ 했지만, 아시다시피 C grammer 가 얼마나 오묘(?)한지 잔머리굴려도 잘안되길래.
구글링으로 c grammer 가져다가 수정해서 작업하던 찰례에...
포기했죠. 어차피 코드까지 같이 수정해야 하기 때문에 결국 일일이 파일을 열어서 확인했죠. (ㅠㅠ)
지나고보니까. 획기적인 방법이 있을거 같은데 생각이 안나에요.
뭔가 좋은 방법이 없을까요?
ps. 프로파일러, 분석기..등도 좋습니다.
Forums:
일단, global 및 static
일단, global 및 static 은 컴파일 된 오브젝트 파일에 nm 명령을 적용하고 sed 나 grep 을 통과하면 추려낼 수 있습니다. 로컬 변수에 대해서는 당장 떠오르는 아이디어가 없네요.
Orion Project : http://orionids.org
아. 그 생각을 못했네요. ㅠㅠ
소스파일 가지고 어떻게 해볼까 궁리만 했습니다.
역시 생각은 공유해야 하나 봅니다. 감사합니다.
일단 2/3는 해결됐네요. ^^
Hello World.
Visual Studio만
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
댓글 달기