aboutsummaryrefslogtreecommitdiffstats
path: root/src/reader.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2022-01-02 14:12:54 -0500
committerDavid Robillard <d@drobilla.net>2022-01-28 21:57:05 -0500
commit155fceabe7070b6610d577734734d038d097b088 (patch)
tree5bbbf327a00c2637f85f006c4b429ecc3b3cb1a3 /src/reader.c
parent1159aea45d9bc4ade2e82856be403d58e050f32d (diff)
downloadserd-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.c16
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;
}