programing

strcpy 대신 strncpy를 사용해야 하는 이유는 무엇입니까?

nicescript 2022. 8. 16. 22:18
반응형

strcpy 대신 strncpy를 사용해야 하는 이유는 무엇입니까?

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

우연히를 보게 되었습니다.

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 );

다음과 같은 출력이 생성되었습니다.

대상은 원래 = 'substoredefg'입니다.strcpy 후 수신처는 '123456789'가 됩니다.
destination1은 원래 = 'destinationdefg'입니다.strncpy 후 destination1은 '12345fg'가 됩니다.

왜 이런 효과를 원하는지 궁금하네요헷갈릴 것 같아요.이 프로그램은 기본적으로 다른 사람의 이름을 복사할 수 있다고 생각하게 합니다(예:Tom Brokaw)와 Tom Bro763.

를 사용하는 장점은 무엇입니까? strncpy() 에 걸쳐서 strcpy()?

strncpy()이 함수는 매우 특별한 문제를 염두에 두고 설계되었습니다.즉, 원래의 UNIX 디렉토리 엔트리의 방법으로 저장된 문자열을 조작하는 것입니다.이들은 짧은 고정 크기 배열(14바이트)을 사용했으며 nul-terminator는 파일 이름이 배열보다 짧은 경우에만 사용되었습니다.

그게 바로 이 두 가지 이상한 점의 배후에 있는 것이다.strncpy():

  • 완전히 채워진 경우 수신처에 nul-terminator를 배치하지 않습니다.
  • 필요한 경우 항상 목적지를 null로 완전히 채웁니다.

'안전'을 위해strcpy()" 를 사용하는 것이 좋습니다.strncat()다음과 같이 합니다.

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

그러면 항상 결과가 종료되고 필요 이상으로 복사되지 않습니다.

strncpy는 버퍼 오버플로의 길이를 입력하도록 요구함으로써 버퍼 오버플로를 처리합니다. strcpy후행 여부에 따라 다르다\0항상 발생하는 것은 아닙니다.

둘째, 왜 당신이 7개의 문자열에 5개의 문자만 복사하기로 선택했는지 이해할 수 없지만, 그것은 예상된 동작을 만들어 내고 있습니다.첫 번째에 복사만 하면 됩니다.n문자, 위치n세 번째 인수입니다.

n모든 함수는 버퍼 오버플로우에 대한 방어 코딩으로 사용됩니다.다음과 같은 오래된 기능 대신 사용하세요.strcpy.

이면의 의도는 알고 있지만strncpy, 이것은 그다지 좋은 기능은 아닙니다.둘 다 피하세요.Raymond Chen이 설명합니다.

개인적으로, 제 결론은 간단히 말해서strncpyNULL 종단 문자열을 다루고 있는 경우 해당 문자열의 모든 친구가 됩니다.이름의 "str"에도 불구하고 이러한 함수는 늘 종단 문자열을 생성하지 않습니다.NULL 종단 문자열은 원시 문자 버퍼로 변환됩니다.두 번째 버퍼로서 늘 종단 문자열이 예상되는 곳에서 이러한 문자열을 사용하는 것은 명백히 잘못된 것입니다.소스가 너무 길면 적절한 null 종단을 얻을 수 없을 뿐만 아니라 소스가 짧으면 불필요한 null 패딩이 발생합니다.

또한 왜strncpy 낯을 보여?

뭐 찾고 있는 것은 기능이다.strlcpy()항상 0과 버퍼를 사용하여 초기화합니다 문자열을 해지한다.그것은 또한 넘치를 찾아낼 수 있다.오직 문제가 아니(정말)서 휴대용과 일부 시스템(BSD, 솔라리스)에만 존재한다.이 기능에 문제는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;
}

Strncpystrcpy보다, 그냥 다른 벌레 한 종류의 무역업을 합니다. 안전하지 않다.때 C문자열 처리 C에서는, 당신이 당신의 버퍼의 사이즈를 알고, 그 주변에 그럴 리가 없어요 strncpy 디렉터리를 것은 다른 사람들에 의해 언급한 정당화됐고, 있겠지만, 그렇지 않다면, 당신은 그것을 사용해서는 안돼:필요가 있다.

  • 만약 당신이 당신의 문자열과 버퍼의 길이를 알고 있다면, 왜 strncpy를 사용합니까?기껏해야 계산 능력의 낭비입니다(쓸데없는 0을 더하면).
  • 길이를 모르면 문자열이 소리 없이 잘릴 위험이 있습니다.이것은 버퍼 오버플로와 크게 다르지 않습니다.

strncpy()능이보하다행선지 버퍼가 허용할 수 있는 최대 길이를 통과해야 합니다. 않으면 종료되지 않을 수이, 「0」은 「0」으로 종료됩니다.★★★★★★★★★★★★★★★★★★·strcpy()이 함수는 대상에 더 많은 문자를 쓸 수 있으며 대상 버퍼 뒤에 있는 메모리에 있는 모든 문자를 손상시킬 수 있습니다.은 많은 입니다.

, 의 경우, POSIX API의 경우, POSIX API의 경우, POSIX API의 경우 등입니다.read() 0을 사용하여 합니다.이 명령어는 0을 수동으로 넣거나 다음 명령어를 사용하여 복사합니다.strncpy().

「」라고 하는 코드입니다.index '인덱스입니다.count- 소스에서 대상으로 복사할 수 있는 최대 문자 수를 나타냅니다.소스의 첫 번째 n바이트 사이에 늘바이트가 없는 경우 수신처에 배치된 문자열은 늘 종단되지 않습니다.

strncpy는 strcpy의 보다 안전한 버전입니다.strcpy의 잠재적인 버퍼 오버플로 취약성 때문에 모든 종류의 공격에 취약합니다.

strncpy는 대상 크기를 "\0"으로 채웁니다.대상 크기는 작아도...

manpage:

src 길이가 n보다 작을 경우 strncpy()는 수신처의 나머지 부분을 늘바이트로 채웁니다.

그리고 나머지뿐만 아니라...또한 n글자에 도달할 때까지 계속합니다.그래서 넘치게 되고...(맨 페이지의 실장 참조)

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

strncpy는 스트링 전체를 복사하지 않거나 n개의 문자만 복사하고 싶을 때 사용합니다.단, strcpy는 null 문자의 종료를 포함한 문자열 전체를 복사합니다.

이러한 링크는 strcpy 및 strncpy에 대한 자세한 내용과 사용할 수 있는 위치를 알아보는 데 도움이 됩니다.

strcpy에 대해서

strncpy에 대해서

이것은, 원래의 문자열의 일부만을 행선지에 카피할 필요가 있는 그 외의 많은 시나리오에서 사용할 수 있습니다.strncpy()를 사용하면 strcpy()와 반대로 원래 문자열의 제한된 부분을 복사할 수 있습니다.당신이 만든 암호는 publib에서 나온 거네요.boulder.ibm.com 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy

반응형