#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);
}