programing

strtok()이 안전하지 않은 것으로 간주되는 이유는 무엇입니까?

itmemos 2023. 10. 29. 19:03
반응형

strtok()이 안전하지 않은 것으로 간주되는 이유는 무엇입니까?

의 어떤 특징strtok(버퍼 오버플로와 관련하여) 안전하지 않습니까?

제가 좀 이상한 건strtok_sVisual C++에서 ("안전한") 추가적인 "상황" 매개변수가 있지만, 다른 면에서는 동일한 것으로...똑같습니까, 아니면 실제로 다른가요?

이 문서의 strtok_s 섹션에 따르면 다음과 같습니다.

6.7.3.1 strtok_s function strtok_s function strtok_s function은 strtok function의 두 가지 문제를 해결합니다.

  1. s1max라는 새로운 매개 변수는 strtok_s가 토큰화되는 문자열 외부에 저장되지 않도록 합니다. (strtok_s는 null 문자를 문자열에 저장하므로 토큰으로 분할되는 문자열은 함수의 입력이자 출력입니다.)
  2. 새로운 매개 변수인 ptr은 strtok이 재진입되는 것을 막는 정적 내부 상태를 제거합니다(하위 절 1.1.12). (ISO/IEC 9899 함수 wcstok과 ISO/IEC 9945 (POSIX) 함수 strtok_r은 이 문제를 동일하게 해결합니다.)

그것은 전혀 안전하지 않습니다.어떻게 작동하는지, 어떻게 사용하는지 이해하면 됩니다.코드와 유닛 테스트를 작성한 후에는 valgrind로 유닛 테스트를 다시 실행하여 메모리 한계 내에서 작동하는지 확인하는 데 몇 분 정도만 더 소요됩니다.맨 페이지에 다 나와 있네요

벅스

이러한 기능을 사용할 때는 주의해야 합니다.사용하는 경우 다음 사항에 유의하십시오.

  • 이러한 함수는 첫 번째 인수를 수정합니다.
  • 이러한 함수는 일정한 문자열에서는 사용할 수 없습니다.
  • 구분 문자의 ID가 손실되었습니다.
  • strtok()함수는 구문 분석하는 동안 정적 버퍼를 사용하므로 스레드 안전하지 않습니다. 사용합니다.strtok_r()이것이 당신에게 중요하다면.

strtok은 스레드 로컬 스토리지를 사용하여 호출 간 상태를 저장하므로 Visual C++에서는 안전합니다.다른 모든 곳에서는 strtok() 상태를 저장하기 위해 전역 변수를 사용합니다.

그러나 strtok이 스레드 안전한 VC++에서도 여전히 약간 이상합니다. strtok()을 동일한 스레드의 다른 문자열에서 동시에 사용할 수 없습니다.예를 들어, 이것은 잘 작동하지 않습니다.

     token = strtok( string, seps );
     while(token)
     {
        printf("token=%s\n", token)
        token2 = strtok(string2, seps);
        while(token2)  
        {
            printf("token2=%s", token2);
            token2 = strtok( NULL, seps );
        }
        token = strtok( NULL, seps );
     }

이것이 잘 작동하지 않는 이유 - 모든 스레드에 대해 단일 상태만 스레드 로컬 저장소에 저장할 수 있으며 여기서 하나는 첫 번째 문자열과 두 번째 문자열에 대해 두 가지 상태가 필요합니다.따라서 strtok은 VC++로 스레드 세이프이지만 재진입하지는 않습니다.

strtok_s(또는 strtok_r)가 제공하는 기능 - 명시적 상태이며 해당 strtok을 사용하면 재진입이 됩니다.

null 종료 문자열이 제대로 없으면 버퍼 오버플로가 발생합니다.또한 (이것은 내가 힘들게 배운 것입니다) strtok은 내부 문자열에 신경 쓰지 않는 것 같습니다."hello"/"world"를 가진 IE는 "hello"/"world"를 파싱하는 반면 "hello/world"는 "hello world"를 파싱합니다./에서 분할되며 괄호 안에 있다는 사실을 무시합니다.

언급URL : https://stackoverflow.com/questions/5999418/why-is-strtok-considered-unsafe

반응형