From ddabaeba7f7549defda4c67038733c0ecc488055 Mon Sep 17 00:00:00 2001 From: Namonay Date: Mon, 18 Mar 2024 10:12:30 +0100 Subject: [PATCH] Fixed a lot of segfaults and bad practices --- .gitignore | 1 - Makefile | 3 +- ft_read.s | 4 +-- ft_strcmp.s | 9 ++--- ft_strcpy.s | 7 ++-- ft_strdup.s | 25 +++++++++++++ ft_strlen.s | 6 ++-- ft_write.s | 4 +-- libasm.a | Bin 3918 -> 5042 bytes test.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 146 insertions(+), 15 deletions(-) create mode 100644 ft_strdup.s create mode 100644 test.c diff --git a/.gitignore b/.gitignore index 927e2b2..8e736c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ *.o -*.c *.out *.a \ No newline at end of file diff --git a/Makefile b/Makefile index c11a989..1edd1d9 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ SRCS = ft_strlen.s \ ft_read.s \ ft_strcpy.s \ ft_strcmp.s \ - + ft_strdup.s \ + OBJS = ${SRCS:.s=.o} CC = nasm diff --git a/ft_read.s b/ft_read.s index 6aed3c1..7522ee8 100644 --- a/ft_read.s +++ b/ft_read.s @@ -1,7 +1,7 @@ -global _read +global ft_read extern __errno_location -_read: +ft_read: mov eax, 0x11 syscall test rax, rax diff --git a/ft_strcmp.s b/ft_strcmp.s index bfc9dfa..93bc1b7 100644 --- a/ft_strcmp.s +++ b/ft_strcmp.s @@ -1,9 +1,10 @@ -extern _strcmp +global ft_strcmp +extern _malloc - -_strcmp: +ft_strcmp: xor rax, rax xor rbx, rbx + .count: mov rax, [rdi + rbx] sub rax, [rsi + rbx] @@ -13,4 +14,4 @@ _strcmp: jmp .count .end: - ret + ret \ No newline at end of file diff --git a/ft_strcpy.s b/ft_strcpy.s index 82dfb2f..d2ea71d 100644 --- a/ft_strcpy.s +++ b/ft_strcpy.s @@ -1,10 +1,10 @@ -extern _strcpy +global ft_strcpy -_strcpy: +ft_strcpy: xor rbx, rbx .cpy: - cmp dword [rsi + rbx], 0 + cmp byte [rsi + rbx], 0 je .end mov rax, [rsi + rbx] mov [rdi + rbx], rax @@ -12,5 +12,6 @@ _strcpy: jmp .cpy .end: + mov byte [rdi + rbx], 0 mov rax, rdi ret diff --git a/ft_strdup.s b/ft_strdup.s new file mode 100644 index 0000000..e790de2 --- /dev/null +++ b/ft_strdup.s @@ -0,0 +1,25 @@ +global ft_strdup + +extern ft_strlen +extern ft_strcpy +extern malloc +extern __errno_location + +ft_strdup: + cmp rdi, 0 + je .end + mov r12, rdi + call ft_strlen + inc rax + mov rdi, rax + call malloc wrt ..plt + test rax, rax + je .end + mov rdi, rax + mov rsi, r12 + call ft_strcpy + ret + +.end: + xor rax, rax + ret \ No newline at end of file diff --git a/ft_strlen.s b/ft_strlen.s index 0b1a5b4..b9d2a94 100644 --- a/ft_strlen.s +++ b/ft_strlen.s @@ -1,11 +1,13 @@ -global _strlen +global ft_strlen -_strlen: +ft_strlen: xor rax, rax + .cmp_char: cmp byte [rdi + rax], 0 je .end inc rax jmp .cmp_char + .end: ret \ No newline at end of file diff --git a/ft_write.s b/ft_write.s index 50a29db..f0cb24a 100644 --- a/ft_write.s +++ b/ft_write.s @@ -1,7 +1,7 @@ -global _write +global ft_write extern __errno_location -_write: +ft_write: mov eax, 0x1 syscall test rax, rax diff --git a/libasm.a b/libasm.a index 39ce1eb830921aef2280957199f6745e115f2611..5ed300b5dfa670074afe3061d25f9b745b1f97b3 100644 GIT binary patch delta 1056 zcmZ`&OK1~O6n!s~Niz9pL_#9fOiN8#5}4R%npp(YMRA0xbR}+#As_tYGfXE)T^J>Z zgmzK53&Bl65D_Si?9_9&04o6_c9~ZLfnf)L#7+n^wyFKvPtA=){ zEn}Cf>BP|uvM(vUcG%Q4kPjtN?OkGqD{U5YL`!1KNHj$j^>$C&?Do-m@7P&AYZt8e z?k^0=#X4ftrYwh&_$Y}u!+CptIC+8dDM*jEV2{7VeL(Cjt z(v0C|D_Uymupvzes(K0)dkJw*5bAWA?!cP+tTfIw>B1{#R@&y?Io=r&X`FYa21!v? zw057ECogvPezGgHepl;k+VD}=^rJK1`C<7zZKlhLJ_*a>)e~teAW9NEu)z>O5Clq( zicDA=O$-p7hAYxo3$w%w_66dPjlZp0p;~PexhA-5h%Bwx<7LLOVr{U;ii#FuBpTyb VDF=Lvk!Wnah#&F+YXc*h{RNaD8fE|h delta 462 zcmdm_eok(Jg}a%N0u&^0F)%Q&0&x=q1G66k16vmZ1Lrmd2A-z);*z4A)I5gx@}kU= zREGGX)Wj49kYI8_C4|o1IDI}NqtWF3?DCVtm^v6mC*NlhXH=W~oykTEt{Y;CUUF_h zd~!x&5m+bCSiRJ|6rim@usN1_DI=rdWP6T;$;qtKC!29fOcrAE6@l3cwq7r_s3^aP zVe)!TqsdFz^cYPi3vjt@zQ?S>$fyU@Y0h|IvNfy5lRb0!NyoeOd_MDOH! zHnqtQIrS!qxt`s8@+YniMqQBOr92F8H`~ZDl<<0Vv&eaLvdDYz +#include +#include +#include +#include +#include +#include + +extern ssize_t ft_write(int fd, const void *buf, size_t count); + +extern int ft_strcmp(const char *s1, const char *s2); + +extern char *ft_strcpy(char *dest, const char *src); + +extern size_t ft_strlen(const char *s); + +extern ssize_t ft_read(int fd, void *buf, size_t count); + +extern char *ft_strdup(const char *s); + +void Test_read(char *filename, int len) +{ + char buffer[100] = {0}; + + int fd = open(filename, O_RDONLY); + printf("READ : %ld | ", read(fd, buffer, len)); + printf("%s\n", buffer); + close(fd); + bzero(buffer, len); + + fd = open(filename, O_RDONLY); + printf("READ : %ld | ", ft_read(fd, buffer, len)); + printf("%s\n", buffer); + close(fd); +} + +void Test_write(char *buffer, int len) +{ + printf(" | WRITE : %ld\n", write(1, buffer, len)); + printf(" | WRITE : %ld\n", ft_write(1, buffer, len)); +} + +void Test_strdup(char *buffer) +{ + char *newbuffer; + + newbuffer = strdup(buffer); + printf("STRDUP : %s\n", newbuffer); + free(newbuffer); + + newbuffer = ft_strdup(buffer); + printf("FT_STRDUP : %s\n", newbuffer); + free(newbuffer); +} + +void Test_strlen(char *str) +{ + int len = strlen(str); + int ft_len = ft_strlen(str); + + printf("STRLEN : %s\n", (len == ft_len) ? "OK" : "KO"); +} + +void Test_strcpy(char *buffer) +{ + char cpybuffer[strlen(buffer) + 1]; + + bzero(cpybuffer, strlen(buffer) + 1); + strcpy(cpybuffer, buffer); + printf("STRCPY : %s\n", cpybuffer); + + bzero(cpybuffer, strlen(buffer) + 1); + ft_strcpy(cpybuffer, buffer); + printf("FT_STRCPY : %s\n", cpybuffer); +} + +void Test_strcmp(char *str1, char *str2) +{ + int res1 = strcmp(str1, str2); + int res2 = ft_strcmp(str1, str2); + + printf("STRCMP : %d FT_STRCMP : %d | %s\n", res1, res2, (res1 == res2) ? "OK" : "KO"); +} + +int main() +{ + int returnval[2]; + int fd = open("mauvaisdavid.txt", O_RDONLY); + char buffer[100] = {0}; + + Test_strlen("clafete"); + + Test_read("mauvaisdavid.txt", 15); + + Test_write("youpipouic", 10); + + Test_strcpy("jesuislevilainbebe"); + + Test_strdup("youpilolololol"); + + Test_strcmp("vilain", "vilain"); +} \ No newline at end of file