avoid some crashes; calloc manage negative number; remove useless flag in Makefile; improve main.c test

This commit is contained in:
Xamora 2026-09-20 16:43:14 +02:00
parent 7b6978c9e2
commit dbcf5e5d57
4 changed files with 41 additions and 28 deletions

View file

@ -1,7 +1,7 @@
CC := gcc CC := gcc
AS := nasm AS := nasm
ASFLAGS := -g -f elf64 -I src/ ASFLAGS := -g -f elf64 -I src/
CFLAGS := -g -Wall -Wextra -std=c2x CFLAGS := -g -std=c2x
MAIN := $(wildcard *.c) MAIN := $(wildcard *.c)
SRC := $(wildcard src/*.s) SRC := $(wildcard src/*.s)
OBJ_DIR := build OBJ_DIR := build
@ -13,7 +13,7 @@ LIB_NAME := asm
PATH_LIB_NAME := $(OBJ_DIR)/lib$(LIB_NAME).a PATH_LIB_NAME := $(OBJ_DIR)/lib$(LIB_NAME).a
LD := $(CC) LD := $(CC)
LDFLAGS := -L$(OBJ_DIR) -l$(LIB_NAME) -fPIC -fPIE LDFLAGS := -L$(OBJ_DIR) -l$(LIB_NAME)
all: $(NAME) all: $(NAME)

48
main.c
View file

@ -40,12 +40,11 @@ test_strlen() {
char *test = "test"; char *test = "test";
printf("test: %ld\n", ft_strlen(test)); printf("test: %ld\n", ft_strlen(test));
char *very_long = calloc(USHRT_MAX, 1); char *very_long = calloc(USHRT_MAX + 1, 1);
very_long = memset(very_long, 'C', USHRT_MAX - 1); very_long = memset(very_long, 'C', USHRT_MAX - 1);
very_long[USHRT_MAX] = '\0'; very_long[USHRT_MAX] = '\0';
printf("very_long: %ld\n", ft_strlen(very_long)); printf("very_long: %ld\n", ft_strlen(very_long));
// printf("%s\n", very_long);
free(very_long); free(very_long);
} }
@ -61,12 +60,11 @@ test_strlen() {
char *test = "test"; char *test = "test";
printf("test: %ld\n", strlen(test)); printf("test: %ld\n", strlen(test));
char *very_long = calloc(USHRT_MAX, 1); char *very_long = calloc(USHRT_MAX + 1, 1);
very_long = memset(very_long, 'C', USHRT_MAX - 1); very_long = memset(very_long, 'C', USHRT_MAX - 1);
very_long[USHRT_MAX] = '\0'; very_long[USHRT_MAX] = '\0';
printf("very_long: %ld\n", strlen(very_long)); printf("very_long: %ld\n", strlen(very_long));
// printf("%s\n", very_long);
free(very_long); free(very_long);
} }
} }
@ -77,7 +75,7 @@ test_strcpy() {
{ {
printf("ft_strcpy:\n"); printf("ft_strcpy:\n");
ft_strcpy(NULL, NULL); printf("error double NULL: %s\n", ft_strcpy(NULL, NULL));
char src_empty[] = ""; char src_empty[] = "";
char dst_empty[] = ""; char dst_empty[] = "";
@ -85,28 +83,20 @@ test_strcpy() {
printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n", printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n",
ret, ret, src_empty, src_empty, dst_empty, dst_empty); ret, ret, src_empty, src_empty, dst_empty, dst_empty);
char null_char[0];
ft_strcpy(null_char, NULL);
ft_strcpy(dst_empty, NULL);
ft_strcpy(NULL, src_empty);
char src[10] = "src"; char src[10] = "src";
char dst[10] = "dst"; char dst[10] = "dst";
printf ("src: %s, dest: %s\n", src, dst); printf ("src: %s, dest: %s\n", src, dst);
ret = ft_strcpy(dst, src); ret = ft_strcpy(dst, src);
printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n", ret, ret, src, src, dst, dst); printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n", ret, ret, src, src, dst, dst);
// printf ("ret: %p, src: %p, dest: %p\n", ret, src, dst);
// char *very_long_src = calloc(USHRT_MAX + 1, 1);
char *very_long_src = calloc(USHRT_MAX, 1); char *very_long_dst = calloc(USHRT_MAX + 1, 1);
char *very_long_dst = calloc(USHRT_MAX, 1);
very_long_src = memset(very_long_src, 'C', USHRT_MAX - 1); very_long_src = memset(very_long_src, 'C', USHRT_MAX - 1);
very_long_src[USHRT_MAX] = '\0'; very_long_src[USHRT_MAX] = '\0';
ret = ft_strcpy(very_long_dst, very_long_src); ret = ft_strcpy(very_long_dst, very_long_src);
printf ("ret: %p, src: %p, dest: %p\n", printf ("long: %p, src: %p, dest: %p\n",
ret, very_long_src, very_long_dst); ret, very_long_src, very_long_dst);
// printf("%s\n", very_long);
free(very_long_src); free(very_long_src);
free(very_long_dst); free(very_long_dst);
} }
@ -117,6 +107,8 @@ test_strcpy() {
{ {
printf("strcpy:\n"); printf("strcpy:\n");
printf("error double NULL: %s\n", strcpy(NULL, NULL));
char src_empty[] = ""; char src_empty[] = "";
char dst_empty[] = ""; char dst_empty[] = "";
char *ret = strcpy(dst_empty, src_empty); char *ret = strcpy(dst_empty, src_empty);
@ -128,14 +120,13 @@ test_strcpy() {
printf ("src: %s, dest: %s\n", src, dst); printf ("src: %s, dest: %s\n", src, dst);
ret = strcpy(dst, src); ret = strcpy(dst, src);
printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n", ret, ret, src, src, dst, dst); printf ("ret: %s_%p, src: %s_%p, dest: %s_%p\n", ret, ret, src, src, dst, dst);
// printf ("ret: %p, src: %p, dest: %p\n", ret, src, dst);
// char *very_long_src = calloc(USHRT_MAX + 1, 1);
char *very_long_src = calloc(USHRT_MAX, 1); char *very_long_dst = calloc(USHRT_MAX + 1, 1);
char *very_long_dst = calloc(USHRT_MAX, 1);
very_long_src = memset(very_long_src, 'C', USHRT_MAX - 1); very_long_src = memset(very_long_src, 'C', USHRT_MAX - 1);
very_long_src[USHRT_MAX] = '\0'; very_long_src[USHRT_MAX] = '\0';
ret = strcpy(very_long_dst, very_long_src); ret = strcpy(very_long_dst, very_long_src);
printf ("ret: %p, src: %p, dest: %p\n", printf ("long: %p, src: %p, dest: %p\n",
ret, very_long_src, very_long_dst); ret, very_long_src, very_long_dst);
// printf("%s\n", very_long); // printf("%s\n", very_long);
@ -151,6 +142,8 @@ test_strcmp() {
{ {
printf("ft_strcmp:\n"); printf("ft_strcmp:\n");
printf("error double NULL: %d\n", ft_strcmp(NULL, NULL));
printf("ret: %d, s1: '', s2: ''\n", ft_strcmp("", "")); printf("ret: %d, s1: '', s2: ''\n", ft_strcmp("", ""));
char *s1 = "test4"; char *s1 = "test4";
@ -170,6 +163,8 @@ test_strcmp() {
{ {
printf("strcmp:\n"); printf("strcmp:\n");
printf("error double NULL: %d\n", strcmp(NULL, NULL));
printf("ret: %d, s1: '', s2: ''\n", strcmp("", "")); printf("ret: %d, s1: '', s2: ''\n", strcmp("", ""));
char *s1 = "test4"; char *s1 = "test4";
@ -220,6 +215,8 @@ test_read() {
{ {
printf("ft_read:\n"); printf("ft_read:\n");
printf("error NULL: %ld\n", ft_read(0, NULL, 0));
// char in[10]; // char in[10];
// ft_read(0, in, 10); // ft_read(0, in, 10);
// printf("%s\n", in); // printf("%s\n", in);
@ -238,6 +235,8 @@ test_read() {
{ {
printf("read:\n"); printf("read:\n");
printf("error NULL: %ld\n", read(0, NULL, 0));
// char in[10]; // char in[10];
// read(0, in, 10); // read(0, in, 10);
// printf("%s\n", in); // printf("%s\n", in);
@ -281,6 +280,7 @@ test_strdup() {
free(copy_long); free(copy_long);
} }
printf("\n");
// strdup // strdup
{ {
@ -316,6 +316,8 @@ test_calloc() {
// ft_calloc // ft_calloc
{ {
printf("ft_calloc\n"); printf("ft_calloc\n");
printf("error NULL: %p\n", ft_calloc(-1, -1));
char *normal = ft_calloc(10, 1); // return "" char *normal = ft_calloc(10, 1); // return ""
printf("normal: %s_%p\n", normal, normal); printf("normal: %s_%p\n", normal, normal);
@ -344,6 +346,8 @@ test_calloc() {
{ {
printf("calloc\n"); printf("calloc\n");
printf("error NULL: %p\n", calloc(-1, -1));
char *normal = ft_calloc(10, 1); char *normal = ft_calloc(10, 1);
printf("normal: %s_%p\n", normal, normal); printf("normal: %s_%p\n", normal, normal);
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)

View file

@ -6,11 +6,13 @@ section .text
global ft_calloc global ft_calloc
; rdi = nitems, rsi = size ; rdi = nitems, rsi = size
ft_calloc: ft_calloc:
; Check if one of arguments are 0 ; Check if one of arguments are 0 or negative
cmp rdi, 0 cmp rdi, 0
je malloc_0 je malloc_0
jl end_null
cmp rsi, 0 cmp rsi, 0
je malloc_0 je malloc_0
jl end_null
; save rbx ; save rbx
push rbx push rbx
@ -21,13 +23,14 @@ section .text
mul rbx, rsi mul rbx, rsi
cmovno rdi, rbx; Move if not overflow cmovno rdi, rbx; Move if not overflow
cmp rdi, 0 cmp rdi, 0
je end_null je end_null_pop
; malloc and security if malloc failed ; malloc and security if malloc failed
call malloc wrt ..plt call malloc wrt ..plt
cmp rax, 0 cmp rax, 0
je end_null je end_null_pop
; set everything to 0
bzero: bzero:
dec rbx dec rbx
mov [rax + rbx], 0 mov [rax + rbx], 0
@ -38,9 +41,10 @@ section .text
pop rbx pop rbx
ret ret
end_null_pop:
pop rbx
end_null: end_null:
xor rax, rax xor rax, rax
pop rbx
ret ret
malloc_0: malloc_0:

View file

@ -8,6 +8,11 @@ section .text
ft_strcmp: ft_strcmp:
mov rax, -1 ; counter mov rax, -1 ; counter
cmp rdi, 0
je endloop
cmp rsi, 0
je endloop
loop: loop:
inc rax inc rax
mov cl, [rdi + rax] ; cl = s1[rax] mov cl, [rdi + rax] ; cl = s1[rax]