diff options
author | David Robillard <d@drobilla.net> | 2022-01-02 14:12:54 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-28 21:57:05 -0500 |
commit | 155fceabe7070b6610d577734734d038d097b088 (patch) | |
tree | 5bbbf327a00c2637f85f006c4b429ecc3b3cb1a3 /src/reader.c | |
parent | 1159aea45d9bc4ade2e82856be403d58e050f32d (diff) | |
download | serd-155fceabe7070b6610d577734734d038d097b088.tar.gz serd-155fceabe7070b6610d577734734d038d097b088.tar.bz2 serd-155fceabe7070b6610d577734734d038d097b088.zip |
Add assertions for all non-null pointers in the public API
Clang issues warnings at build time based on the SERD_NONNULL annotations,
which is a much better approach in general. However, it does not cover cases
where the API is being used with another compiler, or without a compiler that
can statically check things at all (such as Python or other dynamic language
bindings).
In those situations, getting a clear assertion message is a lot less confusing
than a random crash somewhere in serd, and it makes it clear that the bug is in
the caller, so I think it's worth the tedious verbosity.
Diffstat (limited to 'src/reader.c')
-rw-r--r-- | src/reader.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/reader.c b/src/reader.c index 91e61f72..7a640cc6 100644 --- a/src/reader.c +++ b/src/reader.c @@ -25,6 +25,7 @@ #include "statement.h" #include "system.h" +#include <assert.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -194,6 +195,8 @@ read_statement(SerdReader* const reader) SerdStatus serd_reader_read_document(SerdReader* const reader) { + assert(reader); + if (!reader->source) { return SERD_ERR_BAD_CALL; } @@ -229,6 +232,10 @@ serd_reader_new(SerdWorld* const world, const SerdSink* const sink, const size_t stack_size) { + assert(world); + assert(env); + assert(sink); + if (stack_size < 3 * sizeof(SerdNode) + 192 + serd_node_align) { return NULL; } @@ -276,6 +283,8 @@ serd_reader_free(SerdReader* const reader) void serd_reader_add_blank_prefix(SerdReader* const reader, const char* const prefix) { + assert(reader); + free(reader->bprefix); reader->bprefix_len = 0; reader->bprefix = NULL; @@ -308,6 +317,9 @@ skip_bom(SerdReader* const me) SerdStatus serd_reader_start(SerdReader* const reader, SerdByteSource* const byte_source) { + assert(reader); + assert(byte_source); + serd_reader_finish(reader); reader->source = byte_source; @@ -330,6 +342,8 @@ serd_reader_prepare(SerdReader* const reader) SerdStatus serd_reader_read_chunk(SerdReader* const reader) { + assert(reader); + SerdStatus st = SERD_SUCCESS; if (!reader->source) { return SERD_ERR_BAD_CALL; @@ -347,6 +361,8 @@ serd_reader_read_chunk(SerdReader* const reader) SerdStatus serd_reader_finish(SerdReader* const reader) { + assert(reader); + reader->source = NULL; return SERD_SUCCESS; } |