From 2e9385adb316bcb49b0fff662d1f7084cdb153cb Mon Sep 17 00:00:00 2001 From: SIGMazer Date: Sun, 26 Jan 2025 21:45:13 +0200 Subject: [PATCH] memory checks Signed-off-by: SIGMazer --- ast.c | 14 +++++++------- lang.y | 4 ++-- lib/mem.c | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ast.c b/ast.c index 2aea597..1101bf1 100644 --- a/ast.c +++ b/ast.c @@ -101,27 +101,27 @@ bool set_array_variable(char *name, int length, TypeModifiers mods, VarType type { case VAR_INT: var->value.iarray = SAFE_MALLOC_ARRAY(int, length); - memset(var->value.iarray, 0, length * sizeof(int)); + if(length) memset(var->value.iarray, 0, length * sizeof(int)); break; case VAR_SHORT: var->value.sarray = SAFE_MALLOC_ARRAY(short, length); - memset(var->value.sarray, 0, length * sizeof(short)); + if(length) memset(var->value.sarray, 0, length * sizeof(short)); break; case VAR_FLOAT: var->value.farray = SAFE_MALLOC_ARRAY(float, length); - memset(var->value.farray, 0, length * sizeof(float)); + if(length) memset(var->value.farray, 0, length * sizeof(float)); break; case VAR_DOUBLE: var->value.darray = SAFE_MALLOC_ARRAY(double, length); - memset(var->value.darray, 0, length * sizeof(double)); + if(length) memset(var->value.darray, 0, length * sizeof(double)); break; case VAR_BOOL: var->value.barray = SAFE_MALLOC_ARRAY(bool, length); - memset(var->value.barray, 0, length * sizeof(bool)); + if(length) memset(var->value.barray, 0, length * sizeof(bool)); break; case VAR_CHAR: var->value.carray = SAFE_MALLOC_ARRAY(char, length); - memset(var->value.carray, 0, length * sizeof(char)); + if(length) memset(var->value.carray, 0, length * sizeof(char)); break; default: break; @@ -3635,7 +3635,7 @@ void handle_return_statement(ASTNode *expr) } } // skibidi main function do not have jump buffer - if (CURRENT_JUMP_BUFFER() != NULL) + if (jump_buffer && CURRENT_JUMP_BUFFER() != NULL) LONGJMP(); } diff --git a/lang.y b/lang.y index e624ba9..788c939 100644 --- a/lang.y +++ b/lang.y @@ -526,7 +526,6 @@ int main(int argc, char *argv[]) { } void yyerror(const char *s) { - extern char *yytext; fprintf(stderr, "Error: %s at line %d\n", s, yylineno - 1); } @@ -562,7 +561,6 @@ void baka(const char* format, ...) { } char slorp_char(char chr) { - size_t chars_read; input_status status; status = input_char(&chr); @@ -625,6 +623,7 @@ int slorp_int(int val) { fprintf(stderr, "Error reading integer: %d\n", status); exit(EXIT_FAILURE); } + return 0; } short slorp_short(short val) { @@ -649,6 +648,7 @@ short slorp_short(short val) { fprintf(stderr, "Error reading short: %d\n", status); exit(EXIT_FAILURE); } + return 0; } float slorp_float(float var) { diff --git a/lib/mem.c b/lib/mem.c index c559fbc..59318f1 100644 --- a/lib/mem.c +++ b/lib/mem.c @@ -1,4 +1,5 @@ #include "mem.h" +#include /** * @brief Retrieves the memory block header from a user pointer @@ -319,8 +320,8 @@ void *safe_memcpy(void *dest, const void *src, size_t n) } // Check for buffer overlap - if ((src < dest && (const char *)src + n > dest) || - (dest < src && (char *)dest + n > src)) + if ((src < dest && (uintptr_t)src + n > (uintptr_t)dest) || + (dest < src && (uintptr_t)dest + n > (uintptr_t)src)) { errno = EINVAL; return NULL;