strtok()이 안전하지 않은 것으로 간주되는 이유는 무엇입니까?
의 어떤 특징strtok(버퍼 오버플로와 관련하여) 안전하지 않습니까?
제가 좀 이상한 건strtok_sVisual C++에서 ("안전한") 추가적인 "상황" 매개변수가 있지만, 다른 면에서는 동일한 것으로...똑같습니까, 아니면 실제로 다른가요?
이 문서의 strtok_s 섹션에 따르면 다음과 같습니다.
6.7.3.1 strtok_s function strtok_s function strtok_s function은 strtok function의 두 가지 문제를 해결합니다.
- s1max라는 새로운 매개 변수는 strtok_s가 토큰화되는 문자열 외부에 저장되지 않도록 합니다. (strtok_s는 null 문자를 문자열에 저장하므로 토큰으로 분할되는 문자열은 함수의 입력이자 출력입니다.)
- 새로운 매개 변수인 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
'programing' 카테고리의 다른 글
| cursor. execute는 django에서 아무것도 반환하지 않지만 mysql에서 작동합니다. (0) | 2023.10.29 |
|---|---|
| 이 jQuery ready 기능들의 차이점은 무엇입니까? (0) | 2023.10.29 |
| 모든 열에 대한 Oracle 열 너비 (0) | 2023.10.29 |
| 두 개의 열이 포함된 각 그룹에서 마지막 레코드를 가져오는 MySQL 쿼리 (0) | 2023.10.29 |
| .htaccess rewrite url에 변수 2개 포함 (0) | 2023.10.29 |