소스코드 분석할때 어떤식으로 하시나요?

superkkt의 이미지

남의 코드를 분석할때 좋은 방법이 있나요? 아니면 나름대로의 방법을 만들어서 하시는지..

저는 일단 main 함수부터 시작해서 모든 변수 및 구조체 등의 선언, 정의 과정을 다 따라다니면서 여기에 이런 값이 들어가고 저기에 저런값이 들어가고.. 계속 순서대로 따라다닙니다.

그런데 프로그램이 작을때는 할만한데 좀만 커지면 변수들도 햇갈리고 무슨 값이 들어가는지 놓치고 정신이 없어지네요..

제가 하는 방법이 잘못된건가요? 좀 더 효율적인 방법이 있다면 조언 부탁드리겠습니다.

wakeup의 이미지

전 디버거돌리면서 분석합니다.
코드보다보면 함수포인터 부분에서 어떤 함수가 콜이되는지 알수없는 경우가 많더군요..
그런후 구조체 중심으로 분석하고 있습니다. 잘 짜여진 애플리케이션은 구조체 구조가 잘 정의되어 있기때문에 분석하는데 도움이 되더군요

IsExist의 이미지

vim + taglist, ctags 이면 코드 쫓아가는건 어느정도 수헐합니다.

일단 대략 소스로 추적하고 그 다음 디버거로 마무리..

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

kihongss의 이미지

디버깅 해보면서 함수 호출쪽을 살펴보시는게 빠를듯하네요.
소스 잘 설명해놓은 문서가 있다면 금상첨화구여.
그냥 소스만 보고 있다가는 어느새 졸음이 쏟아져서리.

    CODE Reading : The Open Source Perspective
이책이 조금 도움이 될까 모르겠네요.

코딩을 윈도우에서 하신다면 Source Insight (http://www.sourceinsight.com) 같은 툴들이
굉장한 도움이 되죠. :D

[/]
iamslash의 이미지

해당 문서가 있다면 충분 히 읽어 봅니다. 정말 도움이 되겠죠...

그리고는 일단 잘 build 해서 해당 플래폼의 디버거로 흐름을 파악합니다. 프로그램의 역할이 어떤가 에 따라서 파악 하고 싶은 부분 중심으로 조사를 합니다.

tagging 만 해서 파악하기에는 힘들더라구요...

쌀밥의 이미지

source insight 라는 프로그램을 사용할 때도 있습니다.

visual c++ 8 에서 이 기능들이 일부 도입되어서

소스 분석하기에 편해졌더군요...

UNIX계열에서는 사용할 수 없으니;; 도움이 안되는 답글이 될듯합니다;;

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

익명 사용자의 이미지

잘~ 하면 됩니다.

shamlock의 이미지

vim + taglist, ctags 를 사용하고 있는데요
ctrl+] 를 누르면 제대로 찾아가는 경우도 있는데
엉뚱한 곳으로 찾아가는 경우도 많더라구요
다른 분들은 이런 문제 없으신가요?

그리고 한가지 필요한 기능이 있는데
제가 모르는 건지
어떤 함수가 있을때 이 함수를 호출하는 리스트를 보려면
[ + I를 누르면 되는데
그 목록중 하나로 쫓아가는 간단한 방법이 없을까요?

@.@

체스맨의 이미지

요령도 중요하겠지만, 많은 시간 동안 많은 것을 만들어보고,
남의 소스도 읽어보고, 즉 시간을 투자해야 분석하는 감을
얻을 수 있다고 봅니다.

어느 선에 도달하면 무엇을 봐야 할지, 무슨 소스에 무엇이
있을 지 감이 오게 됩니다. 그것을 편하게 하는 툴은 그 다음이죠.
뭐 툴은 없으면 노트 패드라도 써야 하는 거 아닌가요? :wink:

프로그램 언어도 결국 언어라서, 소스를 읽고 이해하는 건
책을 읽고 그 내용을 이해하는 것과 비슷합니다. 많은 경험이
최고죠.

Orion Project : http://orionids.org

superkkt의 이미지

체스맨 wrote:
요령도 중요하겠지만, 많은 시간 동안 많은 것을 만들어보고,
남의 소스도 읽어보고, 즉 시간을 투자해야 분석하는 감을
얻을 수 있다고 봅니다.

어느 선에 도달하면 무엇을 봐야 할지, 무슨 소스에 무엇이
있을 지 감이 오게 됩니다. 그것을 편하게 하는 툴은 그 다음이죠.
뭐 툴은 없으면 노트 패드라도 써야 하는 거 아닌가요? :wink:

프로그램 언어도 결국 언어라서, 소스를 읽고 이해하는 건
책을 읽고 그 내용을 이해하는 것과 비슷합니다. 많은 경험이
최고죠.

좋은 답변 감사합니다. 제가 너무 쉬운길만 찾으려고 했던것 같습니다. :oops:

======================
BLOG : http://superkkt.com

IsExist의 이미지

ifdef 등으로 인해 다른 정의쪽을 탄다면 ctags 호출할때 상수등을
정의할 수 있습니다.

[ Tab 혹은 숫자 [ Tab 하면 됩니다.
아니면 [ I 눌렀을때 나오는 라인번호를 :라인번호 형태로 쳐두
됩니다.

[ I 는 현재 커서가 있는 keyword가 발견되는 부분을 찾는걸로
알고 있습니다만.. 전 함수보다는 변수나 타입 정의를 찾을때 편하
게 이용합니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

addnull의 이미지

음.. 아직 큰 프로그램을 분석해본 적은 없어서..
그냥, 새로 프로젝트 열고는
상대방 프로그램을 모듈별로 copy&paste해서 테스트 해봅니다.. =_=;;
(일명 "divide&conquer" <= 나폴레옹의 전략)

잠깐 딴이야기로.
혹자는 "/* */"를 써서 소스의 일부분을 주석 처리하고 하면 되지 않겠냐 하시는데
다른 분들 소스를 보다보면 쓸데없이 "/* */"을 남발해서 주석 처리가 힘들더군요.
("/* */"은 중첩될 수 없죠...)
그리고 저는 왠만하면 "//" 주석을 쓰고
모듈 단위론

/* 주석 처리
~blah blah
//*/

//* 주석 해제
~blah blah
//*/

이렇게 씁니다.

2005년 12월 1일.

doldori의 이미지

어니스트 wrote:
잠깐 딴이야기로.
혹자는 "/* */"를 써서 소스의 일부분을 주석 처리하고 하면 되지 않겠냐 하시는데
다른 분들 소스를 보다보면 쓸데없이 "/* */"을 남발해서 주석 처리가 힘들더군요.
("/* */"은 중첩될 수 없죠...)

코드의 일부를 주석처리하는 효과를 얻으려면 이런 방법도 있습니다.
#if 0
/* the preprocessor will do it for you */
#endif
IsExist의 이미지

저도 #if 0 을 주로 사용합니다.

/* 나 // 하긴 귀찮을때가 많죠 ..

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

쌀밥의 이미지

생각난 것을 추가로 적어봅니다.

UML의 static class diagram을 자동으로 그려주는 툴들이 몇가지 나와있습니다.

rational rose 나 visio, doxgen 등이 그것입니다.

개인적으로.... 소스 분석은 UML로 하는 것이 그나마 가장 빠르고 효과적이라고.. 생각하고 있습니다..

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

cppig1995의 이미지

#if 0 ... #endif 를 사용하더라도 안에 들어있는 부분은 문법에 합당해야 합니다.
신성국(cinsk) 님께서 C FAQs 번역에 깔끔하게 써주셨더군요.
아마 9장 Preprocessor Macros 인가? 일 겁니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

doldori의 이미지

cppig1995 wrote:
#if 0 ... #endif 를 사용하더라도 안에 들어있는 부분은 문법에 합당해야 합니다.

아닙니다. 문법은 전처리기가 상관할 일이 아니죠. 물론 전처리 지시어 자체의 문법은
지켜야 하지만요. 다음 코드는 깨끗하게 컴파일 됩니다.
int main()
{
#if 0
    hey compiler, do you hear me?
#endif
    return 0;
}
ed.netdiver의 이미지

doldori wrote:
cppig1995 wrote:
#if 0 ... #endif 를 사용하더라도 안에 들어있는 부분은 문법에 합당해야 합니다.

아닙니다. 문법은 전처리기가 상관할 일이 아니죠. 물론 전처리 지시어 자체의 문법은
지켜야 하지만요. 다음 코드는 깨끗하게 컴파일 됩니다.
int main()
{
#if 0
    hey compiler, do you hear me?
#endif
    return 0;
}

그렇긴 한데, editor가 중소괄호나 if, while등 loopmatching에 실패하는 경우가 있잖습니까?
논리적으로 말도 안되는 코드가 if 0 block안에 nest되더라도 그 nesting만큼은 if 0 밖의 code와 수미쌍응해줘야 code보는데 덜골치아프더군요. %가 무용지물이 되어버리는 맘아픈 상황에 직면하지 않으려면요... 8)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

lifthrasiir의 이미지

cppig1995 wrote:
#if 0 ... #endif 를 사용하더라도 안에 들어있는 부분은 문법에 합당해야 합니다.
신성국(cinsk) 님께서 C FAQs 번역에 깔끔하게 써주셨더군요.
아마 9장 Preprocessor Macros 인가? 일 겁니다.

전처리 과정은 토큰화 과정 바로 다음에 일어 납니다. 문법에 합당할 필요는 없습니다. 단, (이건 제가 제대로 알고 있는 건지 장담은 못 하겠는데) 잘못된 토큰이 있을 경우 토큰화 과정에서 에러가 날 가능성이 있습니다.

- 토끼군

kihongss의 이미지

함수 호출 경로 등, 소스를 정리할때는
freemind 이라는 마인드맵 툴을 사용합니다.
원래 소스 정리하라고 이 툴이 생긴거는 아니지만,
쓸만하더군요.

http://freemind.sourceforge.net/

익명 사용자의 이미지

wakeup

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.