<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: C언어 문자열을 가능한한 피해야하는 이유</title>
	<atom:link href="http://rein.kr/blog/archives/1009/feed" rel="self" type="application/rss+xml" />
	<link>http://rein.kr/blog/archives/1009</link>
	<description>프로그래머, 독서가, 게이머 그리고 블로거</description>
	<lastBuildDate>Sat, 19 May 2012 05:39:34 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta4-20762</generator>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-33049</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Sat, 21 Jun 2008 08:58:47 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-33049</guid>
		<description>개략적인 메모리 구조 정의 + 함수들이긴하죠(...)</description>
		<content:encoded><![CDATA[<p>개략적인 메모리 구조 정의 + 함수들이긴하죠(&#8230;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 수원</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32970</link>
		<dc:creator>수원</dc:creator>
		<pubDate>Fri, 20 Jun 2008 16:28:52 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32970</guid>
		<description>씨의 &#039;스트링&#039;은 사실 스트링이 아니지 ㅡㅡ;;;</description>
		<content:encoded><![CDATA[<p>씨의 &#8216;스트링&#8217;은 사실 스트링이 아니지 ㅡㅡ;;;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32898</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Fri, 20 Jun 2008 02:58:31 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32898</guid>
		<description>object / PIN API를 보니 &quot;뚝딱&quot;은 안될것같지만 &quot;조물조물&quot; 만들어 낼 수는 있을 것 같네요 ~_~

baadf00d라거나 deadbeef라거나 0xcdcdcdcd라거나(...) 메모리 디버깅하다보면 가끔 보게되는 녀석들이네요;

근데 x5보다 느리면 문제가되긴하나보네요; 학부다닐때는 한 30배 느려져도 자고 일어나면 끝나겠지를 했는데 /먼산</description>
		<content:encoded><![CDATA[<p>object / PIN API를 보니 &#8220;뚝딱&#8221;은 안될것같지만 &#8220;조물조물&#8221; 만들어 낼 수는 있을 것 같네요 ~_~</p>
<p>baadf00d라거나 deadbeef라거나 0xcdcdcdcd라거나(&#8230;) 메모리 디버깅하다보면 가끔 보게되는 녀석들이네요;</p>
<p>근데 x5보다 느리면 문제가되긴하나보네요; 학부다닐때는 한 30배 느려져도 자고 일어나면 끝나겠지를 했는데 /먼산</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: object</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32886</link>
		<dc:creator>object</dc:creator>
		<pubDate>Fri, 20 Jun 2008 02:18:53 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32886</guid>
		<description>memcpy_s.... 네 역시나 그랬군요. 저 코드 짠 친구를 잠시 불러서 약간의 담화를 나누시는 것이 좋을 듯 합니다. 

그리고 제가 잘못 알았네요. Valgrind의 방식도 역시나 인스트루멘테이션해서 메모리 주소 값을 계속 측정하는 거네요. 하기야 Valgrind의 slowdown이 x30 이상이니 그런 식으로 해야죠.

이건 사실 만들기가 어렵지 않습니다. 아주 심심하시다면 PIN이라는 dynamic binary instrumentation 툴로 뚝딱(!) 만들어 낼 수 있습니다. PIN을 이용하면 메모리에 접근하는 명령어를 가로채서 그 주소를 가져올 수 있죠. 스택 영역은 이제 VC++ 컴파일러가 넣어주는 코드만으로도 충분히 버그를 잡고 힙은 정확히 하려면 말씀대로 Valgrind 방식을 써야 합니다. 대신 무진장 느립니다. 보통 x5 이상 늦어지면 고객들로부터 욕이 튀어나오죠. 그래서 multithread 버그 검출 (재현이 힘든 버그들) 프로그램 등이 실용화되기 매우 힘듭니다. 보통 50배 이상 느려지거든요. (모든 힙 영역 메모리 엑세스를 검출하면 한 30~60

VC++에서 디버그 모드로 컴파일 할 때는 new/malloc이 다른 버전으로 치환이 되어 메모리릭 추가 코드도 넣어주고 0xbaadf00d와 같은 값을 넣어서 체크하기도 하죠. HeapAlloc Win32 API 자체는 변함이 없습니다. 한 때 제 전공 분야라 답변이 길어졌습니다. -_-</description>
		<content:encoded><![CDATA[<p>memcpy_s&#8230;. 네 역시나 그랬군요. 저 코드 짠 친구를 잠시 불러서 약간의 담화를 나누시는 것이 좋을 듯 합니다. </p>
<p>그리고 제가 잘못 알았네요. Valgrind의 방식도 역시나 인스트루멘테이션해서 메모리 주소 값을 계속 측정하는 거네요. 하기야 Valgrind의 slowdown이 x30 이상이니 그런 식으로 해야죠.</p>
<p>이건 사실 만들기가 어렵지 않습니다. 아주 심심하시다면 PIN이라는 dynamic binary instrumentation 툴로 뚝딱(!) 만들어 낼 수 있습니다. PIN을 이용하면 메모리에 접근하는 명령어를 가로채서 그 주소를 가져올 수 있죠. 스택 영역은 이제 VC++ 컴파일러가 넣어주는 코드만으로도 충분히 버그를 잡고 힙은 정확히 하려면 말씀대로 Valgrind 방식을 써야 합니다. 대신 무진장 느립니다. 보통 x5 이상 늦어지면 고객들로부터 욕이 튀어나오죠. 그래서 multithread 버그 검출 (재현이 힘든 버그들) 프로그램 등이 실용화되기 매우 힘듭니다. 보통 50배 이상 느려지거든요. (모든 힙 영역 메모리 엑세스를 검출하면 한 30~60</p>
<p>VC++에서 디버그 모드로 컴파일 할 때는 new/malloc이 다른 버전으로 치환이 되어 메모리릭 추가 코드도 넣어주고 0xbaadf00d와 같은 값을 넣어서 체크하기도 하죠. HeapAlloc Win32 API 자체는 변함이 없습니다. 한 때 제 전공 분야라 답변이 길어졌습니다. -_-</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32879</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Fri, 20 Jun 2008 01:22:38 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32879</guid>
		<description>홍민희 / 저도(...)

ipkn / 자연어의 복잡도가 너무 커서; 근데 난 아직은(?) python 정도만되어도 편하게 써서 ㅎㅎ;</description>
		<content:encoded><![CDATA[<p>홍민희 / 저도(&#8230;)</p>
<p>ipkn / 자연어의 복잡도가 너무 커서; 근데 난 아직은(?) python 정도만되어도 편하게 써서 ㅎㅎ;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 飛烏</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32878</link>
		<dc:creator>飛烏</dc:creator>
		<pubDate>Fri, 20 Jun 2008 01:22:30 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32878</guid>
		<description>VS에서 디버거 붙일 때랑 안붙일 때랑 heap 할당 방식이 다르다는 걸 몰랐네요. 앞으로 디버거 붙이면 안생기는 버그를 해결할 때 참고할 것이 늘었군요. ㅎ</description>
		<content:encoded><![CDATA[<p>VS에서 디버거 붙일 때랑 안붙일 때랑 heap 할당 방식이 다르다는 걸 몰랐네요. 앞으로 디버거 붙이면 안생기는 버그를 해결할 때 참고할 것이 늘었군요. ㅎ</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ipkn</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32877</link>
		<dc:creator>ipkn</dc:creator>
		<pubDate>Fri, 20 Jun 2008 01:22:02 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32877</guid>
		<description>인간이 바로 이해하기 힘든 식으로 (또는 두번 생각해야 하는 식으로) 되어있다는게 문제겠죠.. 자연어로 프로그래밍이 되는 그날까지[?]</description>
		<content:encoded><![CDATA[<p>인간이 바로 이해하기 힘든 식으로 (또는 두번 생각해야 하는 식으로) 되어있다는게 문제겠죠.. 자연어로 프로그래밍이 되는 그날까지[?]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 홍민희</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32869</link>
		<dc:creator>홍민희</dc:creator>
		<pubDate>Fri, 20 Jun 2008 00:12:09 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32869</guid>
		<description>저는 저런 문제를 떠나서, 그냥 단지 편하다는 이유 때문에 `std::string`, `std::wstring`만 사용합니다;</description>
		<content:encoded><![CDATA[<p>저는 저런 문제를 떠나서, 그냥 단지 편하다는 이유 때문에 `std::string`, `std::wstring`만 사용합니다;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32862</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Thu, 19 Jun 2008 23:27:24 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32862</guid>
		<description>object / 그렇죠;; 저라면 C++에선 저거 안 쓰고 C라면 맘편히(?) strdup을 -_-;;

네 저도 댓글 보고 이상해서 고민하면서 출근했는데, 고치기 전 코드를 보니 strcpy_s가 아니라 memcpy_s네요. NULL만 빼놓고 복사한건 마찬가지 -_-;;;

데브파트너는 안써봐서 -- Valgrind 비슷한거 없냐고 했더니 그거 라이센스를 줘서; 근데 Windows Server 2003/x64 라고 설치가 안되는 문제가 -- 모르겠고, Valgrind는 MemCheck로 돌리면 아예 VM용 컴파일을 하고 VM 위에서 메모리 접근을 계산해서 스택 영역은 몰라도(이건 아마도 canary 값 검사) 힙 영역은 상당히 잘 잡아내던데요;;;

피앙 / 난 습관이고 자시고 문자열 길이를 내가 계산 안한다. std::string/wstring 쓰던가 strdup을 쓴단다[...]</description>
		<content:encoded><![CDATA[<p>object / 그렇죠;; 저라면 C++에선 저거 안 쓰고 C라면 맘편히(?) strdup을 -_-;;</p>
<p>네 저도 댓글 보고 이상해서 고민하면서 출근했는데, 고치기 전 코드를 보니 strcpy_s가 아니라 memcpy_s네요. NULL만 빼놓고 복사한건 마찬가지 -_-;;;</p>
<p>데브파트너는 안써봐서 &#8212; Valgrind 비슷한거 없냐고 했더니 그거 라이센스를 줘서; 근데 Windows Server 2003/x64 라고 설치가 안되는 문제가 &#8212; 모르겠고, Valgrind는 MemCheck로 돌리면 아예 VM용 컴파일을 하고 VM 위에서 메모리 접근을 계산해서 스택 영역은 몰라도(이건 아마도 canary 값 검사) 힙 영역은 상당히 잘 잡아내던데요;;;</p>
<p>피앙 / 난 습관이고 자시고 문자열 길이를 내가 계산 안한다. std::string/wstring 쓰던가 strdup을 쓴단다[...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 피앙</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32860</link>
		<dc:creator>피앙</dc:creator>
		<pubDate>Thu, 19 Jun 2008 23:22:04 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32860</guid>
		<description>제가 코딩할 때는 습관적으로 +1을 하는데, 남의 코드 봐서는 어디가 문제인지 모르겠군요 허허 ...</description>
		<content:encoded><![CDATA[<p>제가 코딩할 때는 습관적으로 +1을 하는데, 남의 코드 봐서는 어디가 문제인지 모르겠군요 허허 &#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: object</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32836</link>
		<dc:creator>object</dc:creator>
		<pubDate>Thu, 19 Jun 2008 17:36:44 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32836</guid>
		<description>흠... 솔직히 C 문자열 길이 + 1 만큼 할당해야하는 건 기본인데;; 아쉽군요.

MSDN을 보니

The strcpy_s function copies the contents in the address of strSource, including the terminating null character, to the location specified by strDestination.

널을 포함해서 카피한다고 나와있는데요. 그리고 이상하게 위의 코드를 그대로 돌려보면 디버그 모드에서 strcpy_s를 실행하면 버퍼가 부족하다고 assertion이 뜨네요. *_s 함수군들이 어설션이 풍부해서 사실 버퍼 부족 문제는 디버그 시간에 잡힐 수도 있었을 것 같은데 좀 의아하네요. new/malloc이 non-debug 버전으로 링크되었나 싶기도 하네요.

그리고 힙 영역이 망가지는 건 밸그린드, 데브파트너가 특별히 똑똑하게 하는 건 없구요. (설마 메모리 억세스를 다 디텍트해서 바운더리 넘는가를 체크할 수는 없겠죠. 현재의 하드웨어로는 거의 불가능합니다.) 디버그 모드의 힙 라이브러리처럼 그냥 canary value가 망가진 것 보고 디텍트 하는 정도입니다. 그래서 힙 관련 에러는 디버그 힙 라이브러리로도 보통 충분히 검출은 되죠.</description>
		<content:encoded><![CDATA[<p>흠&#8230; 솔직히 C 문자열 길이 + 1 만큼 할당해야하는 건 기본인데;; 아쉽군요.</p>
<p>MSDN을 보니</p>
<p>The strcpy_s function copies the contents in the address of strSource, including the terminating null character, to the location specified by strDestination.</p>
<p>널을 포함해서 카피한다고 나와있는데요. 그리고 이상하게 위의 코드를 그대로 돌려보면 디버그 모드에서 strcpy_s를 실행하면 버퍼가 부족하다고 assertion이 뜨네요. *_s 함수군들이 어설션이 풍부해서 사실 버퍼 부족 문제는 디버그 시간에 잡힐 수도 있었을 것 같은데 좀 의아하네요. new/malloc이 non-debug 버전으로 링크되었나 싶기도 하네요.</p>
<p>그리고 힙 영역이 망가지는 건 밸그린드, 데브파트너가 특별히 똑똑하게 하는 건 없구요. (설마 메모리 억세스를 다 디텍트해서 바운더리 넘는가를 체크할 수는 없겠죠. 현재의 하드웨어로는 거의 불가능합니다.) 디버그 모드의 힙 라이브러리처럼 그냥 canary value가 망가진 것 보고 디텍트 하는 정도입니다. 그래서 힙 관련 에러는 디버그 힙 라이브러리로도 보통 충분히 검출은 되죠.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32832</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Thu, 19 Jun 2008 15:05:10 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32832</guid>
		<description>valgrind 좋죠. Win32/64 개발하면서 정적/제어된 실행 환경이 필요했는데, DevPartner는 64bit에서 안 돌아서 쓰질 못하고 있어요(...)

근데 항상 좋은게 아닌게 debian 개발자들이 openssh에 valgrind 돌리고는 어째서인지(...) 임의성;randomness를 부여해야할 배열 하나를 통채로 초기화(?)해버려서, 보안 문제를 일으킨 일도 있음....(...)</description>
		<content:encoded><![CDATA[<p>valgrind 좋죠. Win32/64 개발하면서 정적/제어된 실행 환경이 필요했는데, DevPartner는 64bit에서 안 돌아서 쓰질 못하고 있어요(&#8230;)</p>
<p>근데 항상 좋은게 아닌게 debian 개발자들이 openssh에 valgrind 돌리고는 어째서인지(&#8230;) 임의성;randomness를 부여해야할 배열 하나를 통채로 초기화(?)해버려서, 보안 문제를 일으킨 일도 있음&#8230;.(&#8230;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: deisys</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32831</link>
		<dc:creator>deisys</dc:creator>
		<pubDate>Thu, 19 Jun 2008 14:58:37 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32831</guid>
		<description>valgrind에 올렸더니 1초만에 324만개의 오류가 발생했던 코드를 본적이 있었... (일명 전설의 코드)</description>
		<content:encoded><![CDATA[<p>valgrind에 올렸더니 1초만에 324만개의 오류가 발생했던 코드를 본적이 있었&#8230; (일명 전설의 코드)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rein</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32830</link>
		<dc:creator>rein</dc:creator>
		<pubDate>Thu, 19 Jun 2008 14:57:41 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32830</guid>
		<description>전 그런 일 몇 번 겪고나니 아예 C에서 문자열 다루는걸 피하게 되더라고요; C문자열은 강제성이 너무 없어서 혼자 집중한다고 되는게 아님;;;

요즘은 C++로 코어짜고, 한 두번 실행될 부분 -- 데이터 파싱 같은 것 -- 은 아예 lua나 python 임베딩 시켜서 처리하고 있어요(...)</description>
		<content:encoded><![CDATA[<p>전 그런 일 몇 번 겪고나니 아예 C에서 문자열 다루는걸 피하게 되더라고요; C문자열은 강제성이 너무 없어서 혼자 집중한다고 되는게 아님;;;</p>
<p>요즘은 C++로 코어짜고, 한 두번 실행될 부분 &#8212; 데이터 파싱 같은 것 &#8212; 은 아예 lua나 python 임베딩 시켜서 처리하고 있어요(&#8230;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 미나즈키</title>
		<link>http://rein.kr/blog/archives/1009/comment-page-1#comment-32827</link>
		<dc:creator>미나즈키</dc:creator>
		<pubDate>Thu, 19 Jun 2008 14:53:26 +0000</pubDate>
		<guid isPermaLink="false">http://rein.kr/blog/?p=1009#comment-32827</guid>
		<description>아 저도 예전에 일할때 비슷한 상황으로 고생한적 있었어요.
무슨 검색엔진 연동소스를 작성했었는데, 검색몇번하면 검색서버가 죽어버리는 쓰라린 체험을 했었죠.
나중에 알고보니 strncpy 에서 길이 잘못줘서 그랬던거였음 ㅜㅜ</description>
		<content:encoded><![CDATA[<p>아 저도 예전에 일할때 비슷한 상황으로 고생한적 있었어요.<br />
무슨 검색엔진 연동소스를 작성했었는데, 검색몇번하면 검색서버가 죽어버리는 쓰라린 체험을 했었죠.<br />
나중에 알고보니 strncpy 에서 길이 잘못줘서 그랬던거였음 ㅜㅜ</p>
]]></content:encoded>
	</item>
</channel>
</rss>

