libsheepy

C lib for handling text files, strings and json like data structure with an object oriented system
git clone https://spartatek.se/git/libsheepy.git
Log | Files | Refs | README | LICENSE

commit 0bf7cc66ad10c412ce7b75671e72f6c57c51efdf
parent eeb4dee909f83077dfed2acdf7684562b47238a1
Author: Remy Noulin <loader2x@gmail.com>
Date:   Wed,  6 Jan 2021 15:47:57 +0100

fix problems detected with clang static analyzer 11

release/libsheepySmall.c         | 36 ++++++++++++++++++++++++++++--------
src/clang_static_analyzer.sh     |  2 +-
src/json/libsheepyCSmallDouble.c | 10 ++++++++--
src/json/libsheepyCSmallInt.c    | 10 ++++++++--
src/json/libsheepyCSmallJson.c   | 15 ++++++++++++---
src/libsheepySmall.c             | 36 ++++++++++++++++++++++++++++--------
6 files changed, 85 insertions(+), 24 deletions(-)

Diffstat:
Mrelease/libsheepySmall.c | 36++++++++++++++++++++++++++++--------
Msrc/clang_static_analyzer.sh | 2+-
Msrc/json/libsheepyCSmallDouble.c | 10++++++++--
Msrc/json/libsheepyCSmallInt.c | 10++++++++--
Msrc/json/libsheepyCSmallJson.c | 15++++++++++++---
Msrc/libsheepySmall.c | 36++++++++++++++++++++++++++++--------
6 files changed, 85 insertions(+), 24 deletions(-)

diff --git a/release/libsheepySmall.c b/release/libsheepySmall.c @@ -508,7 +508,7 @@ smallt* sDuplicateTiny(smallt *obj) { break; case CONTAINER: // data is not copied, same data pointer is used - c = allocSContainer(((sContainert *)obj)->data); + isError(c, allocSContainer(((sContainert *)obj)->data)) return(NULL); c->dataType = ((sContainert *)obj)->dataType; c->free = ((sContainert *)obj)->free; r = (smallt *)c; @@ -529,7 +529,7 @@ smallt* sDuplicateTiny(smallt *obj) { r = (smallt *)sArrayDuplicateTiny((sArrayt *)obj); break; case BYTES: - B = allocSBytes(); + isError(B, allocSBytes()) return(NULL); if (((sBytest *)obj)->count) { sBytesPushBuffer(&B, sBytesGetTiny((sBytest *)obj), ((sBytest *)obj)->count); } @@ -550,6 +550,9 @@ smallt* sDuplicateTiny(smallt *obj) { sDictt* sDictDuplicateTiny(sDictt *dict) { sDictt *d = allocSDict(); + if (!d) { + return(NULL); + } forEachSDict(dict, e) { if (e->key) { @@ -571,6 +574,9 @@ sDictt* sDictDuplicateTiny(sDictt *dict) { sArrayt* sArrayDuplicateTiny(sArrayt *array) { sArrayt *a = allocSArray(); + if (!a) { + return(NULL); + } forEachSArray(array, e) { sArrayPushTiny(&a, sDuplicate(e)); @@ -896,6 +902,13 @@ char* sTypesTiny(smallt* obj) { return(NULL); } sStringt *s = allocSStringTiny(SMALL_TYPE_NAMES[(size_t) b]); + if (!s) { + free(types); + if (a) { + sArrayFreeTiny(a); + } + return(NULL); + } sArrayPushTiny(&a, (smallt *) s); } @@ -1243,7 +1256,9 @@ void sDictPushTiny(sDictt **dict, const char *key, smallt *data) { if (!(*dict)) { // create dict - *dict = allocSDict(); + isError(*dict, allocSDict()) { + return; + } } if (!data) { @@ -1971,6 +1986,7 @@ smallt* sDeserial(sBytest *obj) { * obj small bytes * \return * new deserialized object + * NULL when there is a malloc error */ // TODO reimplement using loops smallt* sDeserialTiny(sBytest *obj) { @@ -2018,7 +2034,7 @@ smallt* sDeserialTiny(sBytest *obj) { sArrayDeserialElementsTiny((sArrayt **)&r, &data); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) return(NULL); data = &(obj->data)+1; count = (uint32_t *)data; s = (char *)data + sizeof(uint32_t); @@ -2060,7 +2076,7 @@ void sDictDeserialElementsTiny(sDictt **dict, char **data) { *data += sizeof(uint32_t); if (!dictCount) { - *dict = allocSDict();; + *dict = allocSDict(); return; } @@ -2115,7 +2131,9 @@ void sDictDeserialElementsTiny(sDictt **dict, char **data) { sDictPushTiny(dict, key, (smallt *) a); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) { + return; + } count = (uint32_t *)(*data); *data += sizeof(uint32_t); s = *data; @@ -2157,7 +2175,7 @@ void sArrayDeserialElementsTiny(sArrayt **array, char **data) { *data += sizeof(uint32_t); if (!arrayCount) { - *array = allocSArray();; + *array = allocSArray(); return; } @@ -2209,7 +2227,9 @@ void sArrayDeserialElementsTiny(sArrayt **array, char **data) { sArrayPushTiny(array, (smallt *) a); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) { + return; + } count = (uint32_t *)(*data); *data += sizeof(uint32_t); s = *data; diff --git a/src/clang_static_analyzer.sh b/src/clang_static_analyzer.sh @@ -1,4 +1,4 @@ -csa=scan-build-7 +csa=scan-build $csa gcc -std=gnu99 -c ../release/libsheepy.c 2> csa.log $csa gcc -std=gnu99 -c libsheepySmall.c 2>> csa.log diff --git a/src/json/libsheepyCSmallDouble.c b/src/json/libsheepyCSmallDouble.c @@ -236,7 +236,10 @@ smallDoublet* allocSmallDouble(double value) { if (!r) { return(NULL); } - r->value = allocSDouble(value); + isError(r->value, allocSDouble(value)) { + terminateO(r); + return(NULL); + } return(r); } @@ -298,7 +301,10 @@ internal smallDoublet* duplicateSmallDouble(smallDoublet *self) { return(NULL); } if (self->value) { - isError(dup->value, allocSDouble(self->value->value)) return(NULL); + isError(dup->value, allocSDouble(self->value->value)) { + terminateO(dup); + return(NULL); + } } return(dup); } diff --git a/src/json/libsheepyCSmallInt.c b/src/json/libsheepyCSmallInt.c @@ -242,7 +242,10 @@ smallIntt* allocSmallInt(int64_t value) { if (!r) { return(NULL); } - isError(r->value, allocSInt(value)) return(NULL); + isError(r->value, allocSInt(value)) { + terminateO(r); + return(NULL); + } return(r); } @@ -304,7 +307,10 @@ internal smallIntt* duplicateSmallInt(smallIntt *self) { return(NULL); } if (self->value) { - isError(dup->value, allocSInt(self->value->value)) return(NULL); + isError(dup->value, allocSInt(self->value->value)) { + terminateO(dup); + return(NULL); + } } return(dup); } diff --git a/src/json/libsheepyCSmallJson.c b/src/json/libsheepyCSmallJson.c @@ -8301,7 +8301,10 @@ internal smallJsont* sliceSmallJson(smallJsont *self, intmax_t start, intmax_t e s[n] = 0; } - setTopNFreeStringSmallJson(self, s); + if (!setTopNFreeStringSmallJson(self, s)) { + free(s); + return(NULL); + } break; } return(self); @@ -16774,7 +16777,10 @@ internal smallJsont* trimSmallJson(smallJsont *self) { r = strncpy(r, workingS, len - 1); r[len - 1] = 0; - setTopNFreeStringSmallJson(self, r); + if (!setTopNFreeStringSmallJson(self, r)) { + free(r); + return(NULL); + } break; } return(self); @@ -16802,7 +16808,10 @@ internal smallJsont* lTrimSmallJson(smallJsont *self) { r = strdup(workingS);; - setTopNFreeStringSmallJson(self, r); + if (!setTopNFreeStringSmallJson(self, r)) { + free(r); + return(NULL); + } return(self); } diff --git a/src/libsheepySmall.c b/src/libsheepySmall.c @@ -508,7 +508,7 @@ smallt* sDuplicateTiny(smallt *obj) { break; case CONTAINER: // data is not copied, same data pointer is used - c = allocSContainer(((sContainert *)obj)->data); + isError(c, allocSContainer(((sContainert *)obj)->data)) return(NULL); c->dataType = ((sContainert *)obj)->dataType; c->free = ((sContainert *)obj)->free; r = (smallt *)c; @@ -529,7 +529,7 @@ smallt* sDuplicateTiny(smallt *obj) { r = (smallt *)sArrayDuplicateTiny((sArrayt *)obj); break; case BYTES: - B = allocSBytes(); + isError(B, allocSBytes()) return(NULL); if (((sBytest *)obj)->count) { sBytesPushBuffer(&B, sBytesGetTiny((sBytest *)obj), ((sBytest *)obj)->count); } @@ -550,6 +550,9 @@ smallt* sDuplicateTiny(smallt *obj) { sDictt* sDictDuplicateTiny(sDictt *dict) { sDictt *d = allocSDict(); + if (!d) { + return(NULL); + } forEachSDict(dict, e) { if (e->key) { @@ -571,6 +574,9 @@ sDictt* sDictDuplicateTiny(sDictt *dict) { sArrayt* sArrayDuplicateTiny(sArrayt *array) { sArrayt *a = allocSArray(); + if (!a) { + return(NULL); + } forEachSArray(array, e) { sArrayPushTiny(&a, sDuplicate(e)); @@ -896,6 +902,13 @@ char* sTypesTiny(smallt* obj) { return(NULL); } sStringt *s = allocSStringTiny(SMALL_TYPE_NAMES[(size_t) b]); + if (!s) { + free(types); + if (a) { + sArrayFreeTiny(a); + } + return(NULL); + } sArrayPushTiny(&a, (smallt *) s); } @@ -1243,7 +1256,9 @@ void sDictPushTiny(sDictt **dict, const char *key, smallt *data) { if (!(*dict)) { // create dict - *dict = allocSDict(); + isError(*dict, allocSDict()) { + return; + } } if (!data) { @@ -1971,6 +1986,7 @@ smallt* sDeserial(sBytest *obj) { * obj small bytes * \return * new deserialized object + * NULL when there is a malloc error */ // TODO reimplement using loops smallt* sDeserialTiny(sBytest *obj) { @@ -2018,7 +2034,7 @@ smallt* sDeserialTiny(sBytest *obj) { sArrayDeserialElementsTiny((sArrayt **)&r, &data); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) return(NULL); data = &(obj->data)+1; count = (uint32_t *)data; s = (char *)data + sizeof(uint32_t); @@ -2060,7 +2076,7 @@ void sDictDeserialElementsTiny(sDictt **dict, char **data) { *data += sizeof(uint32_t); if (!dictCount) { - *dict = allocSDict();; + *dict = allocSDict(); return; } @@ -2115,7 +2131,9 @@ void sDictDeserialElementsTiny(sDictt **dict, char **data) { sDictPushTiny(dict, key, (smallt *) a); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) { + return; + } count = (uint32_t *)(*data); *data += sizeof(uint32_t); s = *data; @@ -2157,7 +2175,7 @@ void sArrayDeserialElementsTiny(sArrayt **array, char **data) { *data += sizeof(uint32_t); if (!arrayCount) { - *array = allocSArray();; + *array = allocSArray(); return; } @@ -2209,7 +2227,9 @@ void sArrayDeserialElementsTiny(sArrayt **array, char **data) { sArrayPushTiny(array, (smallt *) a); break; case BYTES: - B = allocSBytes();; + isError(B, allocSBytes()) { + return; + } count = (uint32_t *)(*data); *data += sizeof(uint32_t); s = *data;