여의봉이 늘어나는 이유.

minzkn의 이미지

잘 생각해보면 당연한 에러지만 무아상태에서 작성하다 보면 이런거 간혹 나올수 있겠죠?

void Test(void) 
{ 
char s_MyBuffer[ 32 << 10 ]; 
memset(&s_MyBuffer[0], 0, sizeof(s_MyBuffer)); /* 정말로 이 큰 버퍼 0으로 초기화 했음 */ 

strcpy(&s_MyBuffer[0], "a"); /* 큰 버퍼에 이거 하나 딸랑 복사하다니~ 너무 낭비인가? */ 

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ 

/* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ 

fprintf(stdout, "[%s]\n", s_MyBuffer); 
} 

결과를 보면 참 어처구니 없더라도 참으십시요. 여의봉이 괜히 늘어나는줄 아셨습니까?

아~! 또 잊고 안적었네요.
이건 바로 밑의 글과 약간은 연관된 쓰레드입니다.
해킹관련 내용이라는 말을 하면 사람들 귀가 번쩍일거 같아서 예기안하겠습니다.
예기했나?

Forums: 
lunarainbow의 이미지

이렇게 되면, 모두 0값으로 초기화 되었기 때문에 (일단 0은 NULL 이랑 동일하다고 가정해 둘께요.) 1개의 a가 복사된 다음에 끝나야 할 테지만...

복사를 하고 0인지 확인하려 드니 어랏? a네? 그래서 또 하고...

모.. 그런것의 반복으로 무한히 늘어난다...

이런 말씀 이신가요?

미처 생각지 못한 무한 루프네요.

제가 생각한것이 맞는다면, 정말 잼있는 소스네요. :lol:

arbell의 이미지

잼있네요.
귀찮더라도.. strncpy 를 써야 할까요?

아름다움이란... 열정

Fe.head의 이미지

음.. 무슨 소리신지...
에러없이 잘 돌아가는데요..

컴이 이상한가?.....

[aa] 가 출력되는군요...
리눅스만 해당되나요?
AIX는 해당 안되나?..

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

지리즈의 이미지

fehead wrote:
음.. 무슨 소리신지...
에러없이 잘 돌아가는데요..

컴이 이상한가?.....

[aa] 가 출력되는군요...
리눅스만 해당되나요?
AIX는 해당 안되나?..

컴파일러 특성을 타거나 옵티마이즈 옵션이나 기타옵션에 따라 다르겠지요...

if( a < b || 치명적인조건)// 큐나 소트 알고리듬 예제 등에 잘 등장하는 조건절

이런 문법도 허용이 되는 컴파일러가 있고, 오류가 나는 컴파일러가 이더군요.

There is no spoon. Neo from the Matrix 1999.

bleu의 이미지

코드: 

void Test(void) 
{ 
char s_MyBuffer[ 32 << 10 ]; 
memset(&s_MyBuffer[0], 0, sizeof(s_MyBuffer)); /* 정말로 이 큰 버퍼 0으로 초기화 했음 */ 

strcpy(&s_MyBuffer[0], "a"); /* 큰 버퍼에 이거 하나 딸랑 복사하다니~ 너무 낭비인가? */ 

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ 

/* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ 

fprintf(stdout, "[%s]\n", s_MyBuffer); 
}  

음..
어떻게 말씀 드려야 할지 난감한데..
도발적으로 들리실지 모르겠지만..
minzkn님이 모르시면서 올리셨다고 하기엔 너무 난감한 문제라..

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ 

/* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ 

여기서 strcpy를 한건 한바이트가 아니죠..당연히 에러가 나야하는건데..
(보통 에러가 안나죠..결국 그래서 오버 플로우가 생기는거지만...)
오버플로우에서 기본적인 부분 아닌지?
사이즈가 다른 문자열을 복사해넣는 부분인데..
이걸 단순히

strcpy(&s_MyBuffer[0], "a"); /* 큰 버퍼에 이거 하나 딸랑 복사하다니~ 너무 낭비인가? */ 

라 표현했다고..문자 하나만을 복사해넣는다고 표현하신게..참..
어떻게 받아 들여야할지..

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ 

/* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ 

이 부분에서 실제로 복사 되는 부분은..s_MyBuffer[0](32768)을
s_MyBuffer[1](32767)로 복사해 넣겠다는 말인데..

굳이 저리 쓸데 없는 부분을 넣으셔서 설명을 해야했는지..

받아들이기 힘든 부분이네요..

아무튼 잘 봤습니다..감사합니다..

pynoos의 이미지

fehead wrote:
음.. 무슨 소리신지...
에러없이 잘 돌아가는데요..

컴이 이상한가?.....

[aa] 가 출력되는군요...
리눅스만 해당되나요?
AIX는 해당 안되나?..

저도 AIX 에서 해보니 Linux와 다른 것을 보았습니다. PPC assembler 좀 보면서 disassemble 을 분석하면 알 수 있을것 같은데.. PPC는 안해봐서리..

그냥 PPC assembler로 검색해보니 아래가 잡히는 군요...(AIX는 아니고 Mac OS X이긴한데.. 같은 PPC 라면.. 뭐..) 암튼.. 나중에 시간날때...

http://developer.apple.com/documentation/DeveloperTools/Reference/Assembler/AssemblerTOC.html

분석은 안해봤지만, 아마 원본이 전송될 위치에 덮이는지를 확인하는 부분이 들어가는 것이 겠죠.

일단 올려봅니다.

(gdb) disass strcpy
Dump of assembler code for function strcpy:
0x10000600 <strcpy>:    lwz     r11,88(r2)
0x10000604 <strcpy+4>:  lwz     r12,4(r11)
0x10000608 <strcpy+8>:  li      r0,32
0x1000060c <strcpy+12>: andi.   r12,r12,15
0x10000610 <strcpy+16>: beq     0x10000638 <strcpy+56>
0x10000614 <strcpy+20>: mtxer   r0
0x10000618 <strcpy+24>: lscbx.  r5,r0,r4
0x1000061c <strcpy+28>: stswx   r5,r0,r3
0x10000620 <strcpy+32>: beqlr   
0x10000624 <strcpy+36>: lscbx.  r5,r4,r0
0x10000628 <strcpy+40>: stswx   r5,r3,r0
0x1000062c <strcpy+44>: addic   r0,r0,32
0x10000630 <strcpy+48>: bne     0x10000624 <strcpy+36>
0x10000634 <strcpy+52>: blr
0x10000638 <strcpy+56>: andi.   r11,r4,3
0x1000063c <strcpy+60>: lis     r10,32639
0x10000640 <strcpy+64>: subfic  r11,r11,4
0x10000644 <strcpy+68>: addi    r10,r10,32639
0x10000648 <strcpy+72>: mtctr   r11
0x1000064c <strcpy+76>: mr      r5,r3
0x10000650 <strcpy+80>: beq     0x10000670 <strcpy+112>
0x10000654 <strcpy+84>: lbz     r6,0(r4)
0x10000658 <strcpy+88>: cmpwi   r6,0
0x1000065c <strcpy+92>: stb     r6,0(r5)
0x10000660 <strcpy+96>: addi    r4,r4,1
0x10000664 <strcpy+100>:        beqlr   
0x10000668 <strcpy+104>:        addi    r5,r5,1
0x1000066c <strcpy+108>:        bdnz    0x10000654 <strcpy+84>
0x10000670 <strcpy+112>:        lwz     r7,0(r4)
0x10000674 <strcpy+116>:        addic   r5,r5,-4
0x10000678 <strcpy+120>:        and     r9,r7,r10
0x1000067c <strcpy+124>:        addc    r9,r9,r10
0x10000680 <strcpy+128>:        nor.    r12,r9,r10
0x10000684 <strcpy+132>:        bne     0x100006b8 <strcpy+184>
0x10000688 <strcpy+136>:        lwzu    r8,4(r4)
0x1000068c <strcpy+140>:        stwu    r7,4(r5)
0x10000690 <strcpy+144>:        and     r9,r8,r10
0x10000694 <strcpy+148>:        addc    r9,r9,r10
0x10000698 <strcpy+152>:        nor.    r12,r9,r10
0x1000069c <strcpy+156>:        bne     0x100006c8 <strcpy+200>
0x100006a0 <strcpy+160>:        lwzu    r7,4(r4)
0x100006a4 <strcpy+164>:        stwu    r8,4(r5)
0x100006a8 <strcpy+168>:        and     r9,r7,r10
0x100006ac <strcpy+172>:        addc    r9,r9,r10
0x100006b0 <strcpy+176>:        nor.    r12,r9,r10
0x100006b4 <strcpy+180>:        beq     0x10000684 <strcpy+132>
0x100006b8 <strcpy+184>:        nor     r9,r9,r7
0x100006bc <strcpy+188>:        andc.   r9,r9,r10
0x100006c0 <strcpy+192>:        beq     0x10000684 <strcpy+132>
0x100006c4 <strcpy+196>:        b       0x100006d8 <strcpy+216>
0x100006c8 <strcpy+200>:        nor     r9,r9,r8
0x100006cc <strcpy+204>:        andc.   r9,r9,r10
0x100006d0 <strcpy+208>:        beq     0x1000069c <strcpy+156>
0x100006d4 <strcpy+212>:        mr      r7,r8
0x100006d8 <strcpy+216>:        addi    r5,r5,3
0x100006dc <strcpy+220>:        andis.  r6,r7,65280
0x100006e0 <strcpy+224>:        rotlwi  r7,r7,8
0x100006e4 <strcpy+228>:        stbu    r7,1(r5)
0x100006e8 <strcpy+232>:        bne     0x100006dc <strcpy+220>
0x100006ec <strcpy+236>:        blr
0x100006f0 <strcpy+240>:        .long 0x0
0x100006f4 <strcpy+244>:        .long 0xc2040
0x100006f8 <strcpy+248>:        .long 0x0
0x100006fc <strcpy+252>:        .long 0xf0
0x10000700 <strcpy+256>:        .long 0x67374
0x10000704 <strcpy+260>:        andi.   r3,r19,28793
End of assembler dump.
(gdb) quit
kuma의 이미지

여의봉 효과가 있다면 strcpy1 과 같은 소스이겠고....., 아니라면 strcpy2 와 같은 소스로 구성되지 않을까요? 여하튼 10년을 넘게 코딩을 하면서 짚고 넘어가지 않았던 부분에 대한 경각심은 참신하네요...

char* strcpy1( char* dest, char* src )
{
	char* ret = dest;

	while( *src ) {
		*dest = *src;
		dest ++;
		src ++;
	}

	*dest = '\0';

	return ret;
}

char* strcpy2( char* dest, char* src )
{
	int len =0;

	while( src[len] ) len ++;

	for( int i = 0; i < len; i ++ )
		dest[ i ] = src[ i ];

	dest[i] = '\0';

	return dest;
}
minzkn의 이미지

kuma wrote:
여의봉 효과가 있다면 strcpy1 과 같은 소스이겠고....., 아니라면 strcpy2 와 같은 소스로 구성되지 않을까요? 여하튼 10년을 넘게 코딩을 하면서 짚고 넘어가지 않았던 부분에 대한 경각심은 참신하네요...

char* strcpy1( char* dest, char* src )
{
	char* ret = dest;

	while( *src ) {
		*dest = *src;
		dest ++;
		src ++;
	}

	*dest = '\0';

	return ret;
}

char* strcpy2( char* dest, char* src )
{
	int len =0;

	while( src[len] ) len ++;

	for( int i = 0; i < len; i ++ )
		dest[ i ] = src[ i ];

	dest[i] = '\0';

	return dest;
}

kuma님께서 가장 정확한 지적과 예를 들어주셨군요.

앞으로도 제가 올린글에 대한 답변은 바로 kuma님과 같이
정확한 원인에 대해서 생각해보는 댓글이 올라왔으면 좋겠습니다.
아니~! 저도 생각해보지 못한 그러한 부분이 올라왔으면 하는 욕심이 있네요.

그래야 생각을 깊이 해볼수 있고 좋은 프로그램을 만들수 있지 않겠습니까?
그리고 재미도 있고~

물론 제가 여기 글을 올리는 이유는 또 몇가지가 있기는 하지만
그때되면 말씀드릴께요~

도구의 결함은 장인의 손으로 극복한다.

pynoos의 이미지

굳이 strcpy2 를 그렇게 하지 않아도 strcpy1에 단 하나만 넣어도 같은 효과입니다.

char* strcpy2( char* dest, char* src )
{
	char* ret = dest;

	while( *src && src < ret ) {
		*dest = *src;
		dest ++;
		src ++;
	}

	*dest = '\0';

	return ret;
}
click012의 이미지

char* strcpy2( char* dest, char* src ) 
{ 
   char* ret = dest; 

   while( *src && src < ret ) { 
      *dest = *src; 
      dest ++; 
      src ++; 
   } 

   *dest = '\0'; 

   return ret; 
} 

아래 예제에서만 제대로 작동하는 strcpy2가 되겠네요...
그냥 실수하신거 같아서 말씀드렸습니다.

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */

pynoos님 글 잘 읽고 있습니다.
좋은글 많이 부탁드립니다^^

cdpark의 이미지

kuma 님이나 pynoos 님이 제시한 소스는 어떤 경우엔 동작하지 않을 수 있습니다. (혹은 원하지 않는 결과를 얻을 수 있습니다.)

kuma 님의 소스나 pynoos님의 소스는 dest 주소가 src 주소보다 큰 경우에만 원하는대로 동작하는군요.

간단히

char *strcpy2(char *dest, const char *src);
{
    return (char *) memmove((void *)dest, (const void *)src, strlen((const char *) src) + 1);
}

로 해결될 듯 싶습니다. memmove는 overlap이 있는 경우에도 제대로 동작하도록 보장하니깐요. (macro로 구현해도 되겠군요.)
voider의 이미지

요새 minzkn 님이 약간의 소동(?)을 일으켜서
자세히 읽긴 했는데
이 스레드에 이만큼 많은 답글이 있을 필요도 없을것 같은데요

그냥 이런류의 코드는 잘못될수 있으니 주의하자 라는 간단한 팁일듯..

이런류에 실수는 흔한것 아닌가요?
어쨓든 minzkn님의 글은 한번더 자세히 보게 되네요 ㅋㅋ
농담입니다
오해 없으시길.....

-- 아쉬운 하루 되세요 --

탱탱의 이미지

온라인 상에서의
오해 마시길 이라는 단어 하나로
분위기가 험악해 질 수 있습니다
워낙에 오해가 판치는 온라인 아니겠습니까...

Quote:

이 스레드에 이만큼 많은 답글이 있을 필요도 없을것 같은데요

오해의 여지가 있다기 보다는
공격성 발언이라고 사료됩니다
자중해주시길

난 세상의 떨거집니다
더 알 필요가 있겠습니까? 나에 대해서??

bugiii의 이미지

minzkn 님만 보세요.


한번 더 말씀드리지만,
바보이기도 한 저는 참을성도 없습니다.

minzkn 님!

퀴즈를 내시려거든 목적을 그렇게 밝히시든지,
누구를 시험하시려거든 목적을 그렇게 밝히시든지,
자신의 지식을 알리고자 하시려거든 목적을 그렇게 밝히시든지,
누구를 깔아뭉게실려거든 목적을 그렇게 밝히시든지
해주십시오.

의도적인 어떤 목적이 아니라 순수한 목표라면 그렇게 표현을 하시든가요. 아니면, 괜한 꼬투리 잡히지 않게 말씀을 하시든가요.

괜히 시비거는 것은 아닐까해서 몇번이나 답글을 썼다가 제출하지 못하고 백버튼 누르는 저같은 사람 생각 좀 해주세요. 네? (<- 이건 분명히 짜증 섞인 음절입니다.)

minzkn의 이미지

bugiii wrote:
minzkn 님만 보세요.


한번 더 말씀드리지만,
바보이기도 한 저는 참을성도 없습니다.

minzkn 님!

퀴즈를 내시려거든 목적을 그렇게 밝히시든지,
누구를 시험하시려거든 목적을 그렇게 밝히시든지,
자신의 지식을 알리고자 하시려거든 목적을 그렇게 밝히시든지,
누구를 깔아뭉게실려거든 목적을 그렇게 밝히시든지
해주십시오.

의도적인 어떤 목적이 아니라 순수한 목표라면 그렇게 표현을 하시든가요. 아니면, 괜한 꼬투리 잡히지 않게 말씀을 하시든가요.

괜히 시비거는 것은 아닐까해서 몇번이나 답글을 썼다가 제출하지 못하고 백버튼 누르는 저같은 사람 생각 좀 해주세요. 네? (<- 이건 분명히 짜증 섞인 음절입니다.)

To bugiii

꼬투리 잡힌다라고 생각하세요?
음... 잡혀도 아직은 때가 아닌듯.
꼬투리 잡으실분은 따로 쓰레드 만드셔서 계속 꼬투리 잡아주시길. 저는 無言

도구의 결함은 장인의 손으로 극복한다.

lsj0713의 이미지

minzkn wrote:
잘 생각해보면 당연한 에러지만 무아상태에서 작성하다 보면 이런거 간혹 나올수 있겠죠?

void Test(void) 
{ 
char s_MyBuffer[ 32 << 10 ]; 
memset(&s_MyBuffer[0], 0, sizeof(s_MyBuffer)); /* 정말로 이 큰 버퍼 0으로 초기화 했음 */ 

strcpy(&s_MyBuffer[0], "a"); /* 큰 버퍼에 이거 하나 딸랑 복사하다니~ 너무 낭비인가? */ 

strcpy(&s_MyBuffer[1], &s_MyBuffer[0]); /* 오른쪽으로 이거 복사해서 좀 늘리자~ */ 

/* 어랏? 여기서 죽네 ? 난 이거 한바이트 복사했는데.... */ 

fprintf(stdout, "[%s]\n", s_MyBuffer); 
} 

결과를 보면 참 어처구니 없더라도 참으십시요. 여의봉이 괜히 늘어나는줄 아셨습니까?

아~! 또 잊고 안적었네요.
이건 바로 밑의 글과 약간은 연관된 쓰레드입니다.
해킹관련 내용이라는 말을 하면 사람들 귀가 번쩍일거 같아서 예기안하겠습니다.
예기했나?

han.comp.lang.c 식으로 재미없게 답하자면, "위 코드는 정의되지 않은 동작을 갖습니다."

C99 표준문서의 7.21.2.3 The strcpy function 중 한 부분을 인용하겠습니다.

"...If copying takes place between objects that overlap, the behavior is undefined."

위와 같은 코드에서 뭔가 의미있는 행동을 바란다는 것 자체가 무리입니다. 다만 왜 저런 코드를 써서는 안되는가(또는 표준문서의 위 구절이 왜 나왔는가)에 대한 하나의 예제는 될 수가 있겠죠.

ps. 앞으로도 minzkn님의 글에 답글을 달 기회가 생기면, 늘 본문 전체를 인용하겠습니다. 저는 토론 과정에서 누군가의 일방적인 삭제로 다른 사람들이 작성한 유용한 글들이 모두 무의미하게 되어버리는 것을 바라지 않습니다.

unipro의 이미지

kuma wrote:
여의봉 효과가 있다면 strcpy1 과 같은 소스이겠고....., 아니라면 strcpy2 와 같은 소스로 구성되지 않을까요? 여하튼 10년을 넘게 코딩을 하면서 짚고 넘어가지 않았던 부분에 대한 경각심은 참신하네요...

char* strcpy1( char* dest, char* src )
{
	char* ret = dest;

	while( *src ) {
		*dest = *src;
		dest ++;
		src ++;
	}

	*dest = '\0';

	return ret;
}

char* strcpy2( char* dest, char* src )
{
	int len =0;

	while( src[len] ) len ++;

	for( int i = 0; i < len; i ++ )
		dest[ i ] = src[ i ];

	dest[i] = '\0';

	return dest;
}

strcpy2를 조금 수정해보겠습니다. ^^

char* strcpy2( char* dest, char* src )
{
	if (src == desc) {
		return dest;
	} else {
		int len =0;

		while( src[len] ) len ++;

		if (dest > src) {
			for( int i = len - 1; i >= 0; i -- )
				dest[ i ] = src[ i ];
		} else {
			for( int i = 0; i < len; i ++ )
				dest[ i ] = src[ i ];
		}

		dest[len] = '\0';
	}

	return dest;
}

내 블로그: http://unipro.tistory.com

pynoos의 이미지

사족이지만..

두번째 인자는

const char* src

로 해야 정상이지요..

cedar의 이미지

unipro wrote:
strcpy2를 조금 수정해보겠습니다. ^^

char* strcpy2( char* dest, const char* src )
{
	if (src == desc) {
		return dest;
	} else {
		int len =0;

		while( src[len] ) len ++;

		if (dest > src) {
			for( int i = len - 1; i >= 0; i -- )
				dest[ i ] = src[ i ];
		} else {
			for( int i = 0; i < len; i ++ )
				dest[ i ] = src[ i ];
		}

		dest[len] = '\0';
	}

	return dest;
}

음냐... 제가 올리려고 한 코드와 유사하군요. :oops:
overlapping이 가능한 copy를 수행하는 memmove()가 바로 이런 식으로 구현되어 있습니다. overlap되는 위치에 따라 복사 방향을 바꾸어주면 overlapping을 피할 수 있는 원리지요.
그래서 STL 알고리듬 중에도 copy와 copy_backward가 함께 존재하는 것이 이런 이유입니다.

댓글 달기

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