diff --git a/.gitignore b/.gitignore index c886a93..7d914b0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ compile_commands.json .vscode report.txt zms_testeur +fuzz +*CORPUS +crash-* diff --git a/Makefile b/Makefile index d16cdec..29e4b5d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ NAME = minishell -DEBUG = -g -O0 +FUZZ = fuzz +DEBUG = -g -O1 # -fno-omit-frame-pointer is to prevent malloc stacktraces from being truncated, # see "My malloc stacktraces are too short" here: # https://github.com/google/sanitizers/wiki/AddressSanitizer @@ -118,6 +119,7 @@ srcs = \ objs = $(srcs:.c=.o) export objs minishell_objs = $(addsuffix .o,src/$(NAME)) $(objs) +fuzz_objs = $(addsuffix .o,src/$(FUZZ)) $(objs) all_objs = $(minishell_objs) deps = $(all_objs:.o=.d) @@ -131,6 +133,10 @@ all: $(NAME) $(NAME): $(minishell_objs) $(LIBFT) $(CC) $(CFLAGS) -o $@ $(minishell_objs) $(LINCLUDE) $(LDLIBS) +$(FUZZ): CFLAGS += -fsanitize=fuzzer,address,undefined +$(FUZZ): $(fuzz_objs) $(LIBFT) + $(CC) $(CFLAGS) -o $@ $(fuzz_objs) $(LINCLUDE) $(LDLIBS) + $(LIBFT): CFLAGS+=-DBUFFER_SIZE=1 $(LIBFT): +$(MAKE) -C $(LIBFTDIR) diff --git a/fuzz_hand_tester b/fuzz_hand_tester new file mode 100755 index 0000000..a140687 Binary files /dev/null and b/fuzz_hand_tester differ diff --git a/src/fuzz.c b/src/fuzz.c new file mode 100644 index 0000000..58655e4 --- /dev/null +++ b/src/fuzz.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* fuzz.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kcolin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/30 16:01:18 by kcolin #+# #+# */ +/* Updated: 2025/04/30 17:13:17 by kcolin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "fcntl.h" +#include "minishell.h" +#include "parser/cmd/cmd_destroy.h" +#include "parser/cmd_parsing.h" +#include "unistd.h" +#include +#include +#include +#include + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + t_minishell app; + bzero(&app, sizeof(t_minishell)); + int null = open("/dev/null", O_RDONLY, 0); + + char *line = (char *)calloc(size + 1, sizeof(char)); + memcpy(line, data, size); + + dup2(null, STDIN_FILENO); + close(null); + t_cmd *cmd = minishell_parse(&app, line); + + cmd_destroy(cmd); + free(line); + + return (0); // Values other than 0 and -1 are reserved for future use. +}