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:
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;