NUL 문자를 종료하는 문자열의 공간을 할당하지 않습니다.
// allocate memory for 1st part, slash, 2nd part and terminating NUL char
fullPath = malloc(strlen(path) + 1 + strlen(fileData->d_name) + 1);
참고 또한, C에이 malloc
의 반환 값을 캐스팅 나쁜 연습, 그래서 나는 그것을 제거 : 그래서 여기에 할당을 변경합니다.
하지만이 경우에는 의견의 문제가 될 수있다, 경우에 당신은 잘못된 길이를 계산 snprintf
을 사용하여 개선 될 수 있습니다. 어쨌든, 다음 코드는
// size for 1st part, slash, 2nd part and terminating NUL char
size_t bufsize = strlen(path) + 1 + strlen(fileData->d_name) + 1;
fullPath = malloc(bufsize);
//...
snprintf(fullPath, bufsize, "%s/%s", path, fileData->d_name);
는 그런 버그가
정의되지 않은 동작 발생하지 것이다 될 것이다, 대신 끝에서의 다진 문자와 경로를 생성한다. 이것은 파일 이름을 인쇄하고 어떻게 옳지 않은지를 볼 수있을 때 디버깅하기가 훨씬 쉬우면서도 랜덤 크래쉬보다 훨씬 좋은 오류 상황 (파일을 찾을 수없는 오류)입니다.
일부 설명 : 당신이 너무 적은 1 바이트를 할당하기 때문에 질문의 코드에서, 당신은 너무 기본적으로 어떤 일이 일어날 수 정의되지 않은 동작 인 overlow 버퍼 원인이된다. 1 바이트 버퍼 오버 플로우의 경우, 아무런 문제가 발생하지 않을 가능성이 높습니다. 은 할당이 끝날 때 사용되지 않은 바이트가 될 수 있습니다. 이렇게 당신은 이것을 아주 일찌기 붙잡아서 진짜 운이 좋다. 문자열 길이가 16의 배수이고 다른 경우에만 프로그램이 충돌 할 때 버그를 찾는 것이 얼마나 힘든지 상상할 수 있습니다. 다행히도 이와 같은 것을 탐지하는 도구가 있지만 최선의 방어는 현자 C 프로그래머가되는 것입니다 , 누가 좋은 코드를 작성하기 위해 노력하고 ...
당신은 또한 null을 종료하기 위해 메모리를 할당해야합니다 ... –
나는 당신이 호출 한 함수 중 하나가'fullPath'의 메모리에 대한 포인터를 저장하고 있다고 의심합니다. 해지 된 후에 액세스하려고합니다 (실패한 경우). – Alexander
'malloc (strlen (path) + 1/*'/ '*/+ strlen (fileData-> d_name) + 1)/* null * /); ' – chux