diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index 5e80b94b9318a37eab2a06f13c07419cb824fdf7..4dad1e6224b2a1c17cc0135819d3c4bbffba1616 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -207,6 +207,12 @@ int safe_snprintf(char *dest, const size_t max_len, const char *format, ...);
 int safe_vsnprintf(char *dest, const size_t max_len, const char *format, va_list);
 char *safe_strncpy(char *dest, const char *src, size_t n);
 
+/* Helpers for malloc functions. */
+#define LKT_ALLOC(___struct___)                             (___struct___ *)safe_malloc(sizeof(___struct___))
+#define LKT_ALLOC_STRUCT(___struct___)                      LKT_ALLOC(struct ___struct___)
+#define LKT_ALLOC_ARRAY(___struct___, ___count___)          (___struct___ *) safe_malloc(sizeof(___struct___) * (___count___))
+#define LKT_ALLOC_STRUCT_ARRAY(___struct___, ___count___)   LKT_ALLOC_ARRAY(struct ___struct___, ___count___)
+
 /* Iterate throught a string, copy each element in the dest string.
    The save ptr must contains a null integer. */
 int iter_string(const char *str, const char *sep, char *dest, const size_t dest_len, size_t *save);
diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h
index 0c03c075834e824ed60fd3fdc13f3df40c460c77..63342d02887d6494681f9c35ac8654019af69646 100644
--- a/inc/lektor/queue.h
+++ b/inc/lektor/queue.h
@@ -83,7 +83,7 @@ lkt_queue_new(struct queue *ret)
 
     pthread_mutex_t mxt = PTHREAD_MUTEX_INITIALIZER;
     struct queue _ret   = {
-        .contents  = safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(lkt_event)),
+        .contents  = LKT_ALLOC_ARRAY(lkt_event, LKT_DEFAULT_LIST_SIZE),
         .size      = LKT_DEFAULT_LIST_SIZE,
         .last      = 0,
         .available = 0,
diff --git a/src/base/commands.c b/src/base/commands.c
index ad5bfb3e3fc6583115b39de51c890171c0120509..a520b1a722baaf3585e43befcbd05079e2d7fb3e 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -25,7 +25,7 @@ command_restart(struct lkt_state *srv, size_t c, char UNUSED *__argv[LKT_MESSAGE
     env_set(LKT_ENV_RESTART, "1");
     int len = long_length(LONG_MAX);
     if (len > 0) {
-        char *pos = safe_malloc(len * sizeof(char));
+        char *pos = LKT_ALLOC_ARRAY(char, len);
         safe_snprintf(pos, len, "%d", sta.current);
         env_set(LKT_ENV_CURRENT, pos);
         free(pos);
diff --git a/src/base/stack.c b/src/base/stack.c
index 02123ebeed423c6778859cae3b2a659e5a6a3b6f..6071f0795612ec49d79627c223a9ed84aea863fc 100644
--- a/src/base/stack.c
+++ b/src/base/stack.c
@@ -9,7 +9,7 @@ stack_new(struct stack *ret)
     assert(ret);
 
     struct stack _ret = {
-        .contents = safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(void *)),
+        .contents = LKT_ALLOC_ARRAY(volatile void *, LKT_DEFAULT_LIST_SIZE),
         .size     = LKT_DEFAULT_LIST_SIZE,
         .len      = 0,
     };
diff --git a/src/base/uri.c b/src/base/uri.c
index e07866c9c0b624625c5baafa21f3a5f130728a7a..cc8b9b1543ce227d78e95487339d98d7a64318ac 100644
--- a/src/base/uri.c
+++ b/src/base/uri.c
@@ -93,7 +93,7 @@ lkt_uri_from_list(struct lkt_uri *ret, char **list)
     if ('\0' == *(char *)ret->value)
         return false;
 
-    char *buffer = (char *)safe_malloc(sizeof(char) * (strlen(ret->value) + 1));
+    char *buffer = LKT_ALLOC_ARRAY(char, strlen(ret->value) + 1);
     strcpy(buffer, ret->value);
 
     for (i = 1; list[i]; ++i) {
diff --git a/src/database/find.c b/src/database/find.c
index 5d905a51d6f8b4786039401259d047eba8aaba1b..192b7c3dafd299c79db1d3600f126633c763bc46 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -77,7 +77,7 @@ database_search_new(struct lkt_state *srv, size_t c, int cont, function_ptr call
 {
     /* Minus 3 for control messages. If no server do it `X` by `X`. */
     size_t msg_count           = srv != NULL ? lkt_remaining_msg(srv, c) - 3 : LKT_DB_DEFAULT_ITERATION_MAX;
-    struct lkt_search *ret_ptr = safe_malloc(sizeof(struct lkt_search));
+    struct lkt_search *ret_ptr = LKT_ALLOC_STRUCT(lkt_search);
     struct lkt_search ret      = {
         .srv          = srv,
         .c            = c,
@@ -95,7 +95,7 @@ database_search_new(struct lkt_state *srv, size_t c, int cont, function_ptr call
 struct lkt_search *
 database_search_new_from(struct lkt_search *from)
 {
-    struct lkt_search *ret_ptr = safe_malloc(sizeof(struct lkt_search));
+    struct lkt_search *ret_ptr = LKT_ALLOC_STRUCT(lkt_search);
     memcpy(ret_ptr, from, sizeof(struct lkt_search));
     ret_ptr->stmt = NULL; /* Omit that one, the returned search is not initialized. */
     return ret_ptr;
@@ -415,7 +415,7 @@ ___get_all_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len, const char *SQL_
     }
     sqlite3_finalize(stmt);
     stmt     = NULL;
-    *ret_ids = (int *)safe_malloc((*ret_ids_len) * sizeof(int));
+    *ret_ids = LKT_ALLOC_ARRAY(int, *ret_ids_len);
 
     /* Get all the IDs */
     SQLITE_PREPARE(db, stmt, SQL_DATA, error);
diff --git a/src/database/open.c b/src/database/open.c
index ff1be74c36cf8e9fc49819c815bc6bdf42aa2c59..1d99f29d3e36b9ed80ed6a4afef2cf64d5f8f811 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -72,7 +72,7 @@ ___inc(lkt_db *db, const char *name, bool check)
         db_stack_init = 1;
     }
 
-    struct named_db *item = safe_malloc(sizeof(struct stack));
+    struct named_db *item = LKT_ALLOC_STRUCT(named_db);
     item->name            = strdup(name);
     item->db              = db;
     stack_push(&db_stack, item);
diff --git a/src/database/update.c b/src/database/update.c
index 09235c94716f76a475ea41112fa6b01b1c8072d4..79b6245076527b1f2791dff53d9e261b01daf889 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -257,7 +257,7 @@ database_deleted_kara(lkt_db *db, int **kara_id, size_t *len)
     static const char *SQL = "SELECT kara.id, file_path FROM kara WHERE kara.id NOT IN"
                              "(SELECT kara_id FROM updates JOIN misc ON job = update_job);";
     sqlite3_stmt *stmt = NULL;
-    *kara_id           = (int *)safe_malloc(LKT_DEFAULT_LIST_SIZE * sizeof(int));
+    *kara_id           = LKT_ALLOC_ARRAY(int, LKT_DEFAULT_LIST_SIZE);
     *len               = 0;
     RETURN_UNLESS(*kara_id, "Out of memory", NOTHING);
     SQLITE_PREPARE(db, stmt, SQL, out);
diff --git a/src/main/server.c b/src/main/server.c
index 9ccaa832c6bb8f33fe553d02f30cac8331e6096d..8eb87d838b1f409c31d1d84995f731a55e0e950b 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -96,8 +96,11 @@ main(int argc, char *argv[])
     RETURN_UNLESS(setlocale(LC_CTYPE, ""), "Failed to set LC_CTYPE", 1);
     RETURN_UNLESS(setlocale(LC_NUMERIC, "C"), "Failed to set LC_NUMERIC for mpv", 1);
 
-    int autoclear, check_exclusive = 1, opt, dump_and_abort = 0;
-    char *conf_file = safe_malloc(PATH_MAX * sizeof(char));
+    int autoclear;
+    int opt;
+    int check_exclusive = 1;
+    int dump_and_abort = 0;
+    char *conf_file = LKT_ALLOC_ARRAY(char, PATH_MAX);
     cmd_set_executable_name("lektord");
 
     /* Check args */
diff --git a/src/mkv/utils.c b/src/mkv/utils.c
index d998ddff196baad15381436e0adec706bddc9f43..904785e146308be11c18c0d10c35563f6d848a01 100644
--- a/src/mkv/utils.c
+++ b/src/mkv/utils.c
@@ -9,7 +9,7 @@ mdtcat(struct kara_metadata *mdt, char **ret)
     size_t size = strlen(mdt->song_name) + strlen(mdt->source_name) + strlen(mdt->category) + strlen(mdt->language) +
                   strlen(mdt->author_name) + strlen(mdt->song_type) +
                   /* Null byte */ 1 + /* Separators */ 12 + 5 + long_length(mdt->song_number);
-    *ret = safe_malloc(sizeof(char) * size);
+    *ret = LKT_ALLOC_ARRAY(char, size);
     safe_snprintf(*ret, size, "%s - %s / %s - %s%d - %s [%s]", mdt->category, mdt->language, mdt->source_name,
                   mdt->song_type, mdt->song_number, mdt->song_name, mdt->author_name);
 }
diff --git a/src/module/module_repo.c b/src/module/module_repo.c
index d3276b6761e5bc01532fd998b62c45bf455c75be..7ad0de78626943f740d6dbb32e9993b69860712e 100644
--- a/src/module/module_repo.c
+++ b/src/module/module_repo.c
@@ -752,13 +752,13 @@ module_repo_new(struct module_repo_internal *repo_, struct queue *queue, lkt_db
         .queue          = queue,
         .db             = db,
         .updating       = 0,
-        .name           = safe_malloc(LKT_LINE_MAX * sizeof(char)),
-        .kara_dir       = safe_malloc(PATH_MAX * sizeof(char)),
-        .get_id_json    = safe_malloc(LKT_LINE_MAX * sizeof(char)),
-        .get_id_file    = safe_malloc(LKT_LINE_MAX * sizeof(char)),
-        .get_fav_json   = safe_malloc(LKT_LINE_MAX * sizeof(char)),
-        .get_all_json   = safe_malloc(LKT_LINE_MAX * sizeof(char)),
-        .base_url       = safe_malloc(LKT_LINE_MAX * sizeof(char)),
+        .name           = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
+        .kara_dir       = LKT_ALLOC_ARRAY(char, PATH_MAX),
+        .get_id_json    = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
+        .get_id_file    = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
+        .get_fav_json   = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
+        .get_all_json   = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
+        .base_url       = LKT_ALLOC_ARRAY(char, LKT_LINE_MAX),
         .craft_filename = obfuscate ? ___craft_filename_obfuscate : ___craft_filename_non_obfuscate,
     };
 
@@ -806,7 +806,7 @@ mod_new(va_list *va)
         LOG_ERROR("REPO", "Can't init two times the module");
         return 1;
     }
-    *repo = safe_malloc(sizeof(struct module_repo_internal));
+    *repo = LKT_ALLOC_STRUCT(module_repo_internal);
 
     bool ret = module_repo_new(*repo, queue, db);
     lkt_queue_make_available(queue, LKT_EVENT_DB_UPDATING);
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 91aa7c164b273abefeb644ce850d0a2ebd1f9957..9330844ee6019dc1c9ea5eb7eb30508de2a04acb 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -480,7 +480,7 @@ module_sdl2_new(struct module_sdl2_window **win, struct queue *queue, lkt_db *db
         (*win)->set_seek = -1;
 
         /* Start the SDL thread */
-        arg = safe_malloc(sizeof(struct poller_thread_arg));
+        arg = LKT_ALLOC_STRUCT(poller_thread_arg);
         RETURN_UNLESS(arg, "Out of memory", false);
         arg->args = *win;
         RETURN_IF(poller_new(&(*win)->self, sdl_thread__, arg), "Failed to launch the SDL thread", false);
diff --git a/src/module/thread.h b/src/module/thread.h
index 4a7129555050cd15b9713bda796231b06430d41b..5c2907b52ac2cad54985f10b8b7385c07074016c 100644
--- a/src/module/thread.h
+++ b/src/module/thread.h
@@ -54,7 +54,7 @@ poller_new(struct poller_thread *th, void *(*func)(struct poller_thread_arg *),
 
     struct ___poller_thread_args *__args;
     *th               = th_;
-    __args            = safe_malloc(sizeof(struct ___poller_thread_args));
+    __args            = LKT_ALLOC_STRUCT(___poller_thread_args);
     __args->start     = func;
     __args->arg       = args;
     __args->arg->self = th;
diff --git a/src/module/worker.c b/src/module/worker.c
index 509f6a7964c695b2df5e1e2eb7b164e99eab4c34..2c248723c29cb81c704e6d37d2e03fbfeb650866 100644
--- a/src/module/worker.c
+++ b/src/module/worker.c
@@ -73,9 +73,9 @@ worker_pool_new(struct worker_pool *ret, size_t init_size, size_t thread_count)
     if (!thread_count)
         thread_count = get_nprocs_conf();
     struct worker_pool __ret = {
-        .functions   = safe_malloc(sizeof(worker_function) * init_size),
-        .args        = safe_malloc(sizeof(void *) * init_size),
-        .threads     = safe_malloc(sizeof(pthread_t) * thread_count),
+        .functions   = LKT_ALLOC_ARRAY(worker_function, init_size),
+        .args        = LKT_ALLOC_ARRAY(volatile void *, init_size),
+        .threads     = LKT_ALLOC_ARRAY(pthread_t, thread_count),
         .size        = init_size,
         .thread_size = thread_count,
         .len         = 0u,
diff --git a/src/net/listen.c b/src/net/listen.c
index 2b36e961be829e751e84d47db52a2c6f24491933..4e2ec3ed63611ec1fa51ee2fa1e8bf839cf25d51 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -45,7 +45,7 @@ static struct cmd_trie_node *cmd_trie_root = NULL;
 PRIVATE_FUNCTION struct cmd_trie_node *
 cmd_trie_new(void)
 {
-    struct cmd_trie_node *ret = safe_malloc(sizeof(struct cmd_trie_node));
+    struct cmd_trie_node *ret = LKT_ALLOC_STRUCT(cmd_trie_node);
 
     for (size_t i = 0; i < CHARS_MAX; ++i) {
         ret->children[i] = NULL;
@@ -1007,7 +1007,7 @@ redo:
     // clang-format off
     switch (evt.type) {
     __CASE(PLAY_POS, {
-        string = safe_malloc(BUFFER_MAX * sizeof(char));
+        string = LKT_ALLOC_ARRAY(char, BUFFER_MAX);
         safe_snprintf(string, BUFFER_MAX, "%ld", (size_t)evt.attr);
         command_play(srv, &string);
         free(string);
@@ -1026,7 +1026,7 @@ redo:
     __CASE(PROP_TIME, database_config_queue(srv->db, "elapsed",  (size_t)evt.attr))
 
     __CASE(SKIP_CURRENT, {
-        string = safe_malloc(PATH_MAX * sizeof(char));
+        string = LKT_ALLOC_ARRAY(char, PATH_MAX);
         database_queue_skip_current(srv->db, string);
         MOD_CALL(srv->window_mod, "load", string);
         free(string);
@@ -1161,8 +1161,8 @@ lkt_listen(struct lkt_state *srv)
     assert(database_config_get(srv->db, "server", "max_clients", &fds_max_config));
 
     srv->fds_max = fds_max_config;
-    srv->fds     = safe_malloc(srv->fds_max * sizeof(struct pollfd));
-    srv->clients = safe_malloc(srv->fds_max * sizeof(struct lkt_client));
+    srv->fds     = LKT_ALLOC_STRUCT_ARRAY(pollfd, srv->fds_max);
+    srv->clients = LKT_ALLOC_STRUCT_ARRAY(lkt_client, srv->fds_max);
 
     LOG_INFO("INIT", "Register signal handlers for signals...");
     srv->__signal_INT  = __lkt_handle_INT;
diff --git a/src/net/message.c b/src/net/message.c
index ccceb0d9dec33581f4b5b8c542ff02253b6c46da..ebc5ea826f49514d260b183758ef0920628a0a2e 100644
--- a/src/net/message.c
+++ b/src/net/message.c
@@ -12,7 +12,7 @@ struct lkt_message {
 struct lkt_message *
 lkt_message_new(void)
 {
-    struct lkt_message *res = safe_malloc(sizeof(struct lkt_message));
+    struct lkt_message *res = LKT_ALLOC_STRUCT(lkt_message);
     res->ref_count          = 1;
     *(res->data)            = 0;
     res->data_len           = 0;