strncat
의 Microsoft 구현과 관련된 흥미로운 문제점을 발견했습니다. 그것은 소스 버퍼를 1 바이트 넘어 닿는다. 다음 코드를 고려Microsoft의 strncat이 소스 버퍼 경계를 넘어 바이트를 읽음
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
void main()
{
char dstBuf[1024];
char* src = malloc(112);
memset(src, 'a', 112);
dstBuf[0] = 0;
strncat(dstBuf, src, 112);
}
strncat
1 바이트 후의 112 바이트의 블록을 판독한다. 따라서 잘못된 페이지 경계에 할당 할만큼 운이 없다면 응용 프로그램이 충돌합니다. 대형 응용 프로그램은 이러한 장소에서 일시적으로 중단 될 수 있습니다. (이러한 조건 GFLAGS에 pageheap 설정하여 시뮬레이션 될 수 있음에 유의 블록 크기 적절한 정렬 포인터 크기로 나눌 수 있습니다.)
이 예상 된 동작이나 버그? 그걸 확인하는 어떤 링크?
업데이트 (증거에 대한 질문에 대답) (... 나는 strncat
의 몇 가지 설명을 읽을 수 있지만 그들은 마음의 초기 설정에 따라 두 가지 방법으로 해석 될 수있다) : 나는 그것이 분명하지 않은 경우 사과 위의 텍스트이지만 실험적인 사실입니다. strncat
주소 src + srcBufSize에서 애플리케이션의 간헐적 인 충돌이 발생합니다. 이 작은 예제에서는 과 함께 gflags PageHeap 충돌시 일관되게 (100 %) 재생산합니다. 그래서 내가 볼 수있는 한, 증거는 매우 견고합니다.
업데이트 2 (컴파일러 정보) MS Visual Studio 2005 버전 8.0.50727.867. 빌드 플랫폼 : 64 비트 릴리스 (32 비트의 경우 repro 없음). 충돌을 재현하는 데 사용되는 OS : Windows Server 2008 R2.
업데이트 3 문제는 MS 비주얼 스튜디오에 내장 된 바이너리로 재현 2012 11.0.50727.1
업데이트 4Link to issue on Microsoft Connect; link to discussion on MSDN Forums
업데이트 5 문제는 다음 VS 릴리스에서 수정 될 예정입니다. 이전 버전에 대한 수정은 계획되어 있지 않습니다. 위의 "Microsoft Connect"링크를 참조하십시오.
는이 주장에 대한 증거가 무엇입니까? – EJP
에게 아이디어를 :'memcpy()' – Dariusz
나는 사랑한다. 이런 식으로 행동하는 바이너리를보십시오. 또한, 어떤 버전의 컴파일러/라이브러리를 사용하고 있습니까? –