# HG changeset patch # User Mike Becker # Date 1750583753 -7200 # Node ID d3598c834f9b2e742347679bb3a9396213115831 # Parent 4c8b9c6d241f88386d59f488f7cb0aea652c4507 improve NULL-safety - fixes #690 diff -r 4c8b9c6d241f -r d3598c834f9b src/2d.c --- a/src/2d.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/2d.c Sun Jun 22 11:15:53 2025 +0200 @@ -65,9 +65,8 @@ return NULL; } AscRectangleShader *shader = asc_shader_create(codes, sizeof(*shader)); - if (asc_has_error()) { + if (shader == NULL) { asc_shader_free_codes(codes); - // TODO: must not return NULL or must add error handling on caller site return NULL; } shader->size = glGetUniformLocation(shader->program.gl_id, "size"); diff -r 4c8b9c6d241f -r d3598c834f9b src/ascension/input.h --- a/src/ascension/input.h Sat Jun 21 22:10:54 2025 +0200 +++ b/src/ascension/input.h Sun Jun 22 11:15:53 2025 +0200 @@ -32,11 +32,11 @@ typedef struct asc_input_s { /** - * The last X position of the mouse in \c mouse_window. + * The last X position of the mouse in @c mouse_window. */ int mouse_x; /** - * The last Y position of the mouse in \c mouse_window. + * The last Y position of the mouse in @c mouse_window. */ int mouse_y; /** diff -r 4c8b9c6d241f -r d3598c834f9b src/ascension/shader.h --- a/src/ascension/shader.h Sat Jun 21 22:10:54 2025 +0200 +++ b/src/ascension/shader.h Sun Jun 22 11:15:53 2025 +0200 @@ -166,7 +166,7 @@ * @param id the custom ID of the shader * @param create_func the function that creates the shader * @param create_flags flags passed to create_func - * @return the shader created by the @c create_func + * @return the shader created by the @c create_func or @c NULL when shader compilation failed * @see asc_shader_lookup() */ const void *asc_shader_register(unsigned int id, asc_shader_create_func create_func, int create_flags); @@ -196,7 +196,7 @@ * @param id the custom ID of the shader * @param create_func the function to create the shader * @param create_flags flags passed to create_func - * @return the found shader or the newly created shader + * @return the found shader or the newly created shader or @c NULL when shader compilation failed * @see asc_shader_lookup() * @see asc_shader_register() */ diff -r 4c8b9c6d241f -r d3598c834f9b src/ascension/ui/font.h --- a/src/ascension/ui/font.h Sat Jun 21 22:10:54 2025 +0200 +++ b/src/ascension/ui/font.h Sun Jun 22 11:15:53 2025 +0200 @@ -73,7 +73,7 @@ * Ascension UI elements are loading the required fonts for you. * * @param font the font description - * @return a pointer to the SDL TTF font handle, or \c NULL on error + * @return a pointer to the SDL TTF font handle, or @c NULL on error */ TTF_Font *asc_font_load(AscFont font); diff -r 4c8b9c6d241f -r d3598c834f9b src/behavior.c --- a/src/behavior.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/behavior.c Sun Jun 22 11:15:53 2025 +0200 @@ -27,12 +27,13 @@ #include "ascension/behavior.h" #include "ascension/context.h" -#include "ascension/error.h" #include "ascension/scene.h" #include #include +#include + static void asc_behavior_destroy(void *b) { AscBehavior *behavior = b; if (behavior->destroy_func) { @@ -52,11 +53,7 @@ node->behaviors = asc_behavior_new_list(); } AscBehavior *behavior = cxListEmplace(node->behaviors); - if (behavior == NULL) { - const cxstring node_name = asc_scene_node_get_name(node); - asc_error("Failed to add behavior to scene node %"CX_PRIstr, CX_SFMT(node_name)); - return NULL; - } + assert(behavior != NULL); behavior->enabled = true; behavior->node = node; behavior->func = args.func; diff -r 4c8b9c6d241f -r d3598c834f9b src/shader.c --- a/src/shader.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/shader.c Sun Jun 22 11:15:53 2025 +0200 @@ -155,19 +155,27 @@ AscShaderProgram *prog = cxZallocDefault(mem_size); unsigned shader[2]; unsigned n = 0; + bool shader_compile_error = false; + // TODO: clean up this pp mess by introducing proper nested structs if (codes.vtx) { - shader[n++] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); + shader[n] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); + shader_compile_error |= shader[n] == 0; + n++; } if (codes.frag) { - shader[n++] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); + shader[n] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); + shader_compile_error |= shader[n] == 0; + n++; } - if (asc_shader_link(shader, n, prog)) { + if (shader_compile_error || asc_shader_link(shader, n, prog)) { cxFreeDefault(prog); prog = NULL; } for (unsigned i = 0; i < n; i++) { - asc_dprintf("Delete shader: %u", shader[i]); - glDeleteShader(shader[i]); + if (shader[i] > 0) { + asc_dprintf("Delete shader: %u", shader[i]); + glDeleteShader(shader[i]); + } } return prog; } diff -r 4c8b9c6d241f -r d3598c834f9b src/sprite.c --- a/src/sprite.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/sprite.c Sun Jun 22 11:15:53 2025 +0200 @@ -53,7 +53,7 @@ return NULL; } AscSpriteShader *shader = asc_shader_create(codes, sizeof(*shader)); - if (asc_has_error()) { + if (shader == NULL) { asc_shader_free_codes(codes); return NULL; } diff -r 4c8b9c6d241f -r d3598c834f9b src/text.c --- a/src/text.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/text.c Sun Jun 22 11:15:53 2025 +0200 @@ -40,6 +40,7 @@ // Render text onto a surface TTF_Font *font = asc_font_load(text->font); + if (font == NULL) return; static int alignments[] = { TTF_WRAPPED_ALIGN_LEFT, TTF_WRAPPED_ALIGN_CENTER,