문제

편집 : 예제의 소스를 추가했습니다.

나는 만났다 이 예:

char source[MAX] = "123456789";
char source1[MAX] = "123456789";
char destination[MAX] = "abcdefg";
char destination1[MAX] = "abcdefg";
char *return_string;
int index = 5;

/* This is how strcpy works */
printf("destination is originally = '%s'\n", destination);
return_string = strcpy(destination, source);
printf("after strcpy, dest becomes '%s'\n\n", destination);

/* This is how strncpy works */
printf( "destination1 is originally = '%s'\n", destination1 );
return_string = strncpy( destination1, source1, index );
printf( "After strncpy, destination1 becomes '%s'\n", destination1 );

이 출력을 생성 한 다음과 같습니다.

destination is originally = 'abcdefg'
After strcpy, destination becomes '123456789'

destination1 is originally = 'abcdefg'
After strncpy, destination1 becomes '12345fg'

왜 누군가 가이 효과를 원하는지 궁금해합니다. 혼란 스러울 것 같습니다. 이 프로그램은 Tom Bro763과 함께 누군가의 이름 (예 : Tom Brokaw)을 기본적으로 복사 할 수 있다고 생각합니다.

사용의 장점은 무엇입니까? strncpy() ~ 위에 strcpy()?

도움이 되었습니까?

해결책

strncpy 길이를 넣어야함으로써 버퍼 오버플로와 싸우십시오. strcpy 후행에 따라 다릅니다 \0, 항상 발생하지는 않을 수 있습니다.

둘째, 7 자 문자열에서 5 자만 복사하기로 선택한 이유는 저를 넘어서지 만 예상되는 행동을 만들어냅니다. 첫 번째는 복사합니다 n 캐릭터, 어디에 n 세 번째 주장입니다.

그만큼 n 함수는 모두 버퍼 오버 플로우에 대한 방어 코딩으로 사용됩니다. 예 : 오래된 기능 대신에 사용하십시오. strcpy.

다른 팁

그만큼 strncpy() 기능은 매우 특별한 문제를 염두에두고 설계되었습니다. 원래 Unix 디렉토리 항목의 방식으로 저장된 문자열 조작. 이들은 고정 크기의 배열을 사용했으며 Nul-terminator는 파일 이름이 어레이보다 짧은 경우에만 사용되었습니다.

그것이 두 가지 이상한 것입니다 strncpy():

  • 완전히 채워진 경우 목적지에 NUL 터미네이터를 넣지 않습니다. 그리고
  • 필요한 경우 항상 밝은 곳으로 목적지를 완전히 채 웁니다.

"더 안전한 strcpy()", 당신은 사용하는 것이 좋습니다 strncat() 그렇게 :

if (dest_size > 0)
{
    dest[0] = '\0';
    strncat(dest, source, dest_size - 1);
}

그것은 항상 결과를 종료하고 필요 이상으로 복사하지 않습니다.

나는 의도를 알고 있지만 strncpy, 그것은 실제로 좋은 기능이 아닙니다. 둘 다 피하십시오. Raymond Chen이 설명합니다.

개인적으로, 나의 결론은 단순히 피하는 것입니다 strncpy 그리고 당신이 널 종료 된 줄을 다루고 있다면 모든 친구들. 이름의 "str"에도 불구하고, 이러한 함수는 무효가 종결 된 문자열을 생성하지 않습니다. 그들은 널 종료 된 문자열을 원시 문자 버퍼로 변환합니다. 두 번째 버퍼가 평범한 잘못이므로 Null-Perminated String이 예상되는 경우를 사용합니다. 소스가 너무 길면 적절한 널 종료를받지 못할뿐만 아니라 소스가 짧은 경우 불필요한 널 패딩이 발생합니다.

또한보십시오 Strncpy가 안전하지 않은 이유는 무엇입니까?

strncpy는 strcpy보다 안전하지 않으며 한 유형의 버그를 다른 유형과 거래합니다. C에서는 C 문자열을 처리 할 때 버퍼의 크기를 알아야합니다. 주위에는 방법이 없습니다. Strncpy는 다른 사람들이 언급 한 디렉토리에 대해 정당화되었지만 그렇지 않으면 사용해서는 안됩니다.

  • 스트링과 버퍼의 길이를 알고 있다면 왜 strncpy를 사용합니까? 그것은 최선의 컴퓨팅 전력 낭비입니다 (쓸모없는 추가 0)
  • 길이를 모르면 줄을 조용히 자울 위험이 있습니다. 버퍼 오버플로보다 훨씬 낫지 않습니다.

당신이 찾고있는 것은 기능입니다 strlcpy() 이것은 항상 0으로 문자열을 종료하고 버퍼를 초기화합니다. 또한 오버플로를 감지 할 수 있습니다. 유일한 문제, 그것은 휴대용이 아니며 일부 시스템 (BSD, Solaris)에만 존재합니다. 이 기능의 문제는 토론에서 볼 수있는 다른 벌레 캔을 열어줍니다.http://en.wikipedia.org/wiki/strlcpy

내 개인적인 의견은 strncpy() 그리고 strcpy(). 성능이 향상되고 좋은 동반자입니다. snprintf(). 가지고 있지 않은 플랫폼의 경우 비교적 구현하기 쉽습니다. (응용 프로그램의 개발 단계를 위해이 두 기능을 대체합니다 (snprintf() 그리고 strlcpy()) 버퍼 오버플로 또는 잘린 프로그램의 프로그램을 잔인하게 중단하는 트래핑 버전으로. 이것은 최악의 범죄자를 빠르게 잡을 수있게합니다. 특히 다른 사람의 코드베이스에서 작업하는 경우.

편집하다: strlcpy() 쉽게 구현할 수 있습니다 :

size_t strlcpy(char *dst, const char *src, size_t dstsize)
{
  size_t len = strlen(src);
  if(dstsize) {
    size_t bl = (len < dstsize-1 ? len : dstsize-1);
    ((char*)memcpy(dst, src, bl))[bl] = 0;
  }
  return len;
}

그만큼 strncpy() 기능은 더 안전합니다. 대상 버퍼가 허용 할 수있는 최대 길이를 통과해야합니다. 그렇지 않으면 소스 문자열이 올바르게 종료되지 않아야합니다.이 경우 strcpy() 기능은 대상에 더 많은 문자를 쓸 수있어 대상 버퍼 후 메모리에있는 모든 것을 손상시킬 수 있습니다. 이것은 많은 익스플로잇에 사용되는 버퍼 오버 런 문제입니다

또한 POSIX API 기능과 같은 기능도 있습니다 read() 종단 0을 버퍼에 넣지 않지만 읽은 바이트 수를 반환하면 0을 수동으로 올리거나 사용하여 복사합니다. strncpy().

예제 코드에서 index 실제로 색인이 아니라 a count - 얼마나 많은 캐릭터가 알려줍니다 많으면 소스에서 대상으로 복사합니다. 소스의 첫 번째 n 바이트 사이에 널 바이트가없는 경우 대상에 배치 된 문자열은 널 종료되지 않습니다.

strncpy는 소스의 크기에 대한 ' 0'으로 대상을 채우고, 목적지의 크기가 더 작습니다 ....

맨 페이지 :

SRC의 길이가 N보다 작 으면 strncpy ()는 나머지 목적지를 널 바이트로 패드합니다.

그리고 나머지도 ... N 캐릭터에 도달 할 때 까지이 후에. 따라서 당신은 오버플로를 얻습니다 ... (Man Page 구현 참조)

이것은 원래 문자열의 일부만 대상으로 복사 해야하는 다른 많은 시나리오에서 사용될 수 있습니다. strncpy ()를 사용하면 strcpy ()와 반대로 원래 문자열의 한정 부분을 복사 할 수 있습니다. 나는 당신이 내린 코드가 publib.boulder.ibm.com.

그것은 우리의 요구 사항에 따라 다릅니다. Windows 사용자의 경우

우리는 전체 문자열을 복사하지 않을 때마다 strncpy를 사용하거나 n 수의 문자 만 복사하려고합니다. 그러나 strcpy는 널 문자를 종료하는 것을 포함하여 전체 문자열을 복사합니다.

이 링크는 strcpy 및 strncpy와 우리가 사용할 수있는 곳에 대해 더 많이 알 수 있도록 도와줍니다.

strcpy에 대해

strncpy에 대해

Strncpy는 Strcpy의 더 안전한 버전입니다. 실제로 STRCPY를 사용해서는 안되는 버퍼를 사용하지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top