alloc한 메모리 이상의 영역을 액세스할때...

kdgcom의 이미지

예를 들어......

char *ptr = "1234567";
printf("%c\r\n", *(ptr+8));

라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)

이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)

이경우 당장은 에러가 안나는데 allocation이 빈번하게 일어날 경우 한참 잘 되다가 갑자기 libc의 _int_malloc에서 에러났다는 뻔뻔한 메시지를 보여주면서 segmentation fault를 보이더군요... (gdb에서 backtrace를 했을때의 결과가 말이죠)

이거 좀 쉽게 잡는 방법 없을까요?
지금 쓰는 코드가 struct 머시기 **ptr[][] 이렇게 생긴거 여러개에 대해 빈번하게 읽고 쓰고 하는지라 하나하나 따져보기가 매우 괴롭습니다 ㅠ.ㅠ :?

kslee80의 이미지

valgrind 라는 메모리 디버깅 툴이 있습니다.
한번 사용해 보시길...

eek의 이미지

컴파일 하실때 -g옵션사용하세요.
그럼 위치를 정확하게 나오는걸로 알고있습니다.
메모리 릭관련해서는 추척해주는 라이브러리가 있었던걸로 기억하는데
구글에서 검색해보세요 여러가지 좋은 라이브러리가 많이 있습니다.

Perl 만세~~~

익명 사용자의 이미지

eek wrote:
컴파일 하실때 -g옵션사용하세요.
그럼 위치를 정확하게 나오는걸로 알고있습니다.
메모리 릭관련해서는 추척해주는 라이브러리가 있었던걸로 기억하는데
구글에서 검색해보세요 여러가지 좋은 라이브러리가 많이 있습니다.

물론 -ggdb 옵션을 썼습니다...
그럼에도 불구하고 bt할때 _int_malloc 에서 오류가 나는걸로 보이니 환장하겠네요 ㅠ.ㅠ

kdgcom의 이미지

kslee80 wrote:
valgrind 라는 메모리 디버깅 툴이 있습니다.
한번 사용해 보시길...

죄송하지만 valgrind가 어느 정도 수준의 디버깅을 가능하게 해주는지요? 지금 시간이 없는지라 메뉴얼을 제대로 보기 힘드네요 ㅠ.ㅠ
alloc된 영역 이상의 메모리를 참조할때 잘 잡아 주나요???

ㅡ,.ㅡ;;의 이미지

kdgcom wrote:
예를 들어......

char *ptr = "1234567";
printf("%c\r\n", *(ptr+8));

라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)


아뇨 에러입니다. ptr+6 이 7이니까..

Quote:

이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)

아뇨.. 많이 안벗어나도 에러납니다. 물론 운이 좋아 에러가 나지 않는경우도 많습니다.

잡는법은.. 그저.. 디버깅해야죠..


----------------------------------------------------------------------------

progcom의 이미지

kdgcom wrote:
예를 들어......

char *ptr = "1234567";
printf("%c\r\n", *(ptr+8));

라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)

이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)

"1234567"과 "%c\r\n"이 연속적으로 들어간다는 보장이 없습니다. 한마디로, 에러가 나지 않은건 '운'이 좋았을 뿐입니다.

할당 받은 크기를 벗어나는 접근은 절대로 일어나지 않도록 정확히 코딩을 해줘야합니다. 넘어가도 된다...라는 생각을 하는 순간부터 잘못된겁니다. 무슨 일이 일어날지 모릅니다. :evil:

익명 사용자의 이미지

ㅡ,.ㅡ;; wrote:
kdgcom wrote:
예를 들어......

char *ptr = "1234567";
printf("%c\r\n", *(ptr+8));

라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)


아뇨 에러입니다. ptr+6 이 7이니까..

Quote:

이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)

아뇨.. 많이 안벗어나도 에러납니다. 물론 운이 좋아 에러가 나지 않는경우도 많습니다.

잡는법은.. 그저.. 디버깅해야죠..

당연히 에러입니다. 그러니까 예시를 했겠죠.
그저 디버깅한다는 것.. 예.. 그저 디버깅을 무려 2주 넘게 하고 있습니다만.. 도저히 보이질 않는군요. 다른 해결방안은 없나요?

익명 사용자의 이미지

progcom wrote:
kdgcom wrote:
예를 들어......

char *ptr = "1234567";
printf("%c\r\n", *(ptr+8));

라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)

이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)

"1234567"과 "%c\r\n"이 연속적으로 들어간다는 보장이 없습니다. 한마디로, 에러가 나지 않은건 '운'이 좋았을 뿐입니다.

할당 받은 크기를 벗어나는 접근은 절대로 일어나지 않도록 정확히 코딩을 해줘야합니다. 넘어가도 된다...라는 생각을 하는 순간부터 잘못된겁니다. 무슨 일이 일어날지 모릅니다. :evil:

다중스레드를 쓰지 않는 이상 거의 %가 찍힐 것 같습니다 :) (농담입니다)
그리고 영역 밖의 데이터는 당연히 쓰레기일텐데 넘어가도 된다고 생각하고 프로그램할리는 없을거라고 생각합니다.
특정 디버깅툴을 제시해주는등의 좀 더 구체적인 해결책이 필요합니다.
(최소한 gdb는 여기에 대해 깡통인 것 같고... valgrind는 root 권한이 없어서 아직 실험을 못하고 있습니다.)

댓글 달기

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