이 코드의 실행결과는 어떻게 될까요?

redpig의 이미지

char buffer[100]={0};
strncpy(buffer, "TEST", -1);
printf("%s\n", buffer);

그냥 심심해서( :oops: ) 위 코드를 컴파일해서 실행해 보니 아무값도 출력안되네요.
어떻게 된걸까요?
윈도2k 머신에서 VC6로 컴파일했습니다.
증말 초보라서 허접한 질문이지만 답변 부탁드립니다.

raynear의 이미지

어디서부터 답변을 드려야 될지 모르겠네요... ㅡㅡ;;

우선 strncpy의 사용법을 확인 해 보시죠.

strncpy의 마지막 인자가 -1이라는게... ㅡㅡ;;

그런거 없다

hanseok의 이미지

redpig wrote:
char buffer[100]={0};
strncpy(buffer, "TEST", -1);
printf("%s\n", buffer);

그냥 심심해서( :oops: ) 위 코드를 컴파일해서 실행해 보니 아무값도 출력안되네요.
어떻게 된걸까요?
윈도2k 머신에서 VC6로 컴파일했습니다.
증말 초보라서 허접한 질문이지만 답변 부탁드립니다.

뭐 그냥..
strncpy 에서 3번째 아큐먼트는..? 몇개를 복사할것인지 알려주는 것입니다.
-1 이면 이것 만큼 복사를 해야하는데.. 아무것도 복사를 안하게 되고
결국 buffer에는 {0} 이란것이 들어있게 됩니다.
buffer를 출력하면 {0} 이 출력되는것이겠죠.

==3==3

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

doldori의 이미지

strncpy()의 마지막 인자는 size_t로서 이는 무부호 정수형입니다. 예를 들어
typedef unsigned int size_t;
로 정의된 구현체의 경우 -1은 변환 규칙에 따라 UINT_MAX로 변환됩니다.
UINT_MAX의 값은 buffer의 크기 100보다는 훨씬 크지요. 그러나 strncpy()
내부에서는 buffer의 크기를 알지 못하며 주어진 바이트수(UINT_MAX)만큼 무작정
복사를 합니다. 그런데 복사하는 과정에서 buffer의 범위를 벗어나고(buffer overrun)
그 결과는 정의되지 않습니다.

IDNed의 이미지

BOF될듯 하네요...

32bit 시스템에서는 4294967295바이트가 복사될테니까...

Quote:

char* strncpy(char* s, const char* ct, size_t n);
Copies at most n characters of ct to s. Pads with NUL characters if ct is of length less than n. Note that this may leave s without NUL-termination. Return s.

그러니까 buffer의 한계(100바이트)를 넘어서서 스택을 완전히 변조시켜서(RET가 NULL이 되버리는??) 세그먼트 폴트가 날듯...

실제로는 세그먼트 폴트(Segmentation Fault)라는 에러메시지"마저"도 변조가 되는 듯합니다...

그러니까 엄청난 양의 메모리를 NULL로 덮어씌우신 효과가 날듯..

댓글 달기

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