#include <unistd.h>
char *ft_strncat(char *dest, char *src, unsigned int nb)
{
char* dest2 = dest;
while (*dest != '\\0')
{
dest++;
}
while (nb-- && *src != '\\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\\0';
return (dest2);
}
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[20] = "apple";
char b[] = "pie";
char c[20] = "apple";
char d[] = "pie";
printf("%s", ft_strncat(a, b, 1));
printf("%c", '\\n');
printf("%s", strncat(c, d, 1));
}
수정한 코드
#include <unistd.h>
char *ft_strncat(char *dest, char *src, unsigned int nb)
{
unsigned int i;
unsigned int j;
i = 0;
while (dest[i] != '\\0')
i++;
j = 0;
while (j < nb)
{
dest[i + j] = src[j];
j++;
}
dest[i + j] = '\\0';
return (dest);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char dest[10] = "bbb";
char dest2[10] = "bbb";
char src[5] = "asdf";
//printf("%p %s | %s\\n", dest, dest, strncat(dest, src, 10));
printf("%p %s | %s\\n", dest2, dest2, ft_strncat(dest2, src, 10));
}
여기서 ex03: Segmentation fault 오류가 발생했다.
-g -fsanitize=address를 컴파일 할 때 옵션을 사용해 본 결과 어느정도 이유를 유추할 수 있었다.
This frame has 3 object(s):
[32, 42) 'dest' (line 39)
[64, 74) 'dest2' (line 40)
[96, 101) 'src' (line 41) <== Memory access at offset 101 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow ft_strncat.c:26 in ft_strncat
41번 라인에 있는 src에서 문제가 발생했다는 것인데, 아마도 src의 길이보다 nb의 길이가 더 길 경우에
오프셋 101에서 메모리 액세스가 이 변수를 오버플로우 한다는 것으로 봐서 src의 길이보다 nb의 길이가 더 길 경우를 예외처리 해 주면 문제를 해결할 수 있을 것 같다.
<참고 링크>
만일, source
의 문자열의 길이가 num
보다 작다면, source
의 NULL
문자 까지만 붙여진다.
수정한 코드 2
#include <unistd.h>
int ft_strlen(char *str)
{
int i;
i = 0;
while (str[i] != '\\0')
{
i++;
}
return (i);
}
char *ft_strncat(char *dest, char *src, unsigned int nb)
{
unsigned int i;
unsigned int j;
i = 0;
while (dest[i] != '\\0')
i++;
j = 0;
while (j < nb && src[j] != '\\0')
{
dest[i + j] = src[j];
j++;
}
if (nb != 0)
{
dest[i + j] = '\\0';
}
return (dest);
}
#include <stdio.h>
#include <string.h>
int main(void)
{
char dest[10] = "afd";
char src[] = "adf";
char dest2[10] = "afd";
ft_strncat(dest, src, 9);
printf("%s\\n", dest);
strncat(dest2, src, 9);
printf("%s\\n", dest2);
}