[완료][추가질문]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데...

hangsookang의 이미지

열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데 왜 오류가 나는 지 모르겠습니다 ㅠㅠ
라는 제목의 질문글에서 올렸던 코드입니다.
바로가기: http://kldp.org/node/129595

#include <stdio.h>
 
int main(void)
{
   char a, b;
   char result;
 
   printf("-50 이상 +50 이하의 수 둘 입력 : ");
   scanf("%d %d", &a, &b);
   result=a+b;
   printf("두 수의 덧셈 결과 : %d \n", result);
 
   return 0;
}

이 코드를 실행해서 a 와 b 에 숫자를 넣어주면
b 만 나오는 오류가 있었는데

원인을 찾다보니 버퍼 오버플로라는 것을 알게되어
메모리를 도식화해서
이 코드의 문제를 정리해봤습니다.

제가 이해한 것이 맞는 지 봐주시면 감사하겠습니다 :)

앞선 질문에 답해주신 분들 모두 감사합니다~~~
생각지도 못하게 이것 저것 많이 알게되니 기분 좋네요 ^^;

====
모두들 새해 복 많이 받으세요!

File attachments: 
첨부파일 크기
Image icon _오버플로.JPG85.37 KB
planetarium의 이미지

방향은 옳게 잡으셨습니다. 변수간에 영역을 침범한거죠.

1. 다만 scanf() 를 수행한 후라고 해서 b에게 주어진 공간이 갑자기 4칸으로 늘어나진 않죠.
a+b 할때의 b는 여전히 1byte만 읽습니다.

그럼 왜 저런 결과가 나오느냐?

2. 추측컨데 아마 4byte 10은 00001010 / 00000000 / 00000000 / 00000000 으로 저장되고,
4byte 20은 00010100 / 00000000 / 00000000 / 00000000 으로 저장되었을 겁니다.
만약 결과로 20이 나왔다면, 메모리에 a / b 순서가 아닌 b / a 순서로 지정되었을 거라 "추측" 해봅니다.

이 문제의 결과에 대한 정확한 원인 분석을 위해서는
사용하신 컴퓨터의 리틀엔디안/빅엔디안 여부, 워드 크기, 컴파일러의 종류와 버전 등 많은 정보를 알아야 합니다.
거꾸로 말해서, 같은 C 코드라고 해도 엔디안이나 워드 크기, 혹은 컴파일러 버전만 달라져도 다른 결과가 나올수 있습니다.
그러므로 사용하신 컴파일러가 저 코드를 어셈블리로 어떻게 번역했는지를 열어봐야 정확한 확인을 할수 있습니다...

본의아니게 너무 혼란을 드리는것 같지만, 설명을 위해서는 어쩔수 없네요.

사족 하나 더:
결국 이런 문제 때문에 printf() 나 scanf() 함수는 "char는 %hhd, short은 %hd, int는 %d, ..." 하는 식으로 프로그래머가 format string을 일일이 잘 맞춰줘야 하죠.

hangsookang의 이미지

리틀엔디안/빅엔디안까지 확인해보고나니
드디어 이 문제의 끝이 보이는 것 같습니다!!
감사합니다 헤헤

사족도 감사합니다. 공부할 게 점점 더 생기네요 ㅎㅎ 좋습니다 ^^

"안됨 말고,"

planetarium의 이미지

근데 KLDP에 댓글 수정버튼 아예 사라졌나요? 예전엔 다른 댓글 달리기 전에는 수정이 됐었는데... 평소에 글쓰기 눌러놓고 검토하는 버릇이 있었는데 영 적응 안되네요.

지난번 질문을 읽어보고 추가하자면, %d는 아시다시피 4byte 정수를 입력받을때 사용하구요.
%c는 char에 문자를 입력받을때 사용하는 것이고... 1byte 정수를 위해서는 위에 적었듯 %hhd를 사용합니다.

물론 지난번 글에 여러 분들께서 도와주셨지만 아무도 언급 못했던 것처럼
%hhd를 쓰는 경우가 사실상 없다시피해서 굳이 기억해둘 필요도 없습니다.

hangsookang의 이미지

댓글수정버튼 있으면 좋겠네요 ㅎ

공부수고를 덜어주시네요 ㅎㅎㅎ

"안됨 말고,"

댓글 달기

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