diff --git a/src/common/io.h b/src/common/io.h index b4640bedb..35a70675f 100644 --- a/src/common/io.h +++ b/src/common/io.h @@ -19,6 +19,6 @@ bool ffFileExists(const char* fileName, mode_t mode); // Not thread safe! void ffSuppressIO(bool suppress); -void ffGetTerminalResponse(const char* request, const char* format, ...); +FF_C_SCANF(2, 3) void ffGetTerminalResponse(const char* request, const char* format, ...); #endif diff --git a/src/common/printing.h b/src/common/printing.h index 7eb6ffae6..9a734634b 100644 --- a/src/common/printing.h +++ b/src/common/printing.h @@ -9,8 +9,8 @@ void ffPrintLogoAndKey(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat); void ffPrintFormatString(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* format, uint32_t numArgs, const FFformatarg* arguments); void ffPrintFormat(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, uint32_t numArgs, const FFformatarg* arguments); -void ffPrintErrorString(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* customErrorFormat, const char* message, ...); -void ffPrintError(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, const char* message, ...); +FF_C_PRINTF(6, 7) void ffPrintErrorString(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFstrbuf* customKeyFormat, const FFstrbuf* customErrorFormat, const char* message, ...); +FF_C_PRINTF(5, 6) void ffPrintError(FFinstance* instance, const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, const char* message, ...); void ffPrintColor(const FFstrbuf* colorValue); void ffPrintCharTimes(char c, uint32_t times); void ffPrintUserString(const char* str); diff --git a/src/modules/opencl.c b/src/modules/opencl.c index 49e8bbf1e..6b9c0a643 100644 --- a/src/modules/opencl.c +++ b/src/modules/opencl.c @@ -118,5 +118,5 @@ void ffPrintOpenCL(FFinstance* instance) #endif if(error != NULL) - ffPrintError(instance, FF_OPENCL_MODULE_NAME, 0, &instance->config.openCL, error); + ffPrintError(instance, FF_OPENCL_MODULE_NAME, 0, &instance->config.openCL, "%s", error); } diff --git a/src/modules/opengl.c b/src/modules/opengl.c index fdab25a2a..9e263779e 100644 --- a/src/modules/opengl.c +++ b/src/modules/opengl.c @@ -453,5 +453,5 @@ void ffPrintOpenGL(FFinstance* instance) #endif if(error != NULL) - ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, error); + ffPrintError(instance, FF_OPENGL_MODULE_NAME, 0, &instance->config.openGL, "%s", error); } diff --git a/src/modules/terminalfont.c b/src/modules/terminalfont.c index 561d1163c..b2e8dc178 100644 --- a/src/modules/terminalfont.c +++ b/src/modules/terminalfont.c @@ -123,7 +123,7 @@ static void printKonsole(FFinstance* instance) if(profile.length == 0) { - ffPrintError(instance, FF_TERMFONT_MODULE_NAME, 0, &instance->config.terminalFont, "Couldn't find \"DefaultProfile=%[^\\n]\" in \".config/konsolerc\""); + ffPrintError(instance, FF_TERMFONT_MODULE_NAME, 0, &instance->config.terminalFont, "%s", "Couldn't find \"DefaultProfile=%[^\\n]\" in \".config/konsolerc\""); ffStrbufDestroy(&profile); return; } diff --git a/src/modules/vulkan.c b/src/modules/vulkan.c index 53285d1c7..4b3d19fea 100644 --- a/src/modules/vulkan.c +++ b/src/modules/vulkan.c @@ -11,7 +11,7 @@ void ffPrintVulkan(FFinstance* instance) if(vulkan->error) { - ffPrintError(instance, FF_VULKAN_MODULE_NAME, 0, &instance->config.vulkan, vulkan->error); + ffPrintError(instance, FF_VULKAN_MODULE_NAME, 0, &instance->config.vulkan, "%s", vulkan->error); return; } diff --git a/src/util/FFcheckmacros.h b/src/util/FFcheckmacros.h new file mode 100644 index 000000000..1ed61cf82 --- /dev/null +++ b/src/util/FFcheckmacros.h @@ -0,0 +1,24 @@ +#pragma once + +#ifndef FASTFETCH_INCLUDED_FFCHECKMACROS +#define FASTFETCH_INCLUDED_FFCHECKMACROS + +#if defined(__GNUC__) || defined(__clang__) + #define FF_C_NODISCARD __attribute__((warn_unused_result)) +#else + #define FF_C_NODISCARD +#endif + +#if defined(__GNUC__) || defined(__clang__) + #define FF_C_PRINTF(formatStrIndex, argsStartIndex) __attribute__((__format__ (printf, formatStrIndex, argsStartIndex))) +#else + #define FF_C_PRINTF(formatStrIndex, argsStartIndex) +#endif + +#if defined(__GNUC__) || defined(__clang__) + #define FF_C_SCANF(formatStrIndex, argsStartIndex) __attribute__((__format__ (scanf, formatStrIndex, argsStartIndex))) +#else + #define FF_C_SCANF(formatStrIndex, argsStartIndex) +#endif + +#endif diff --git a/src/util/FFlist.h b/src/util/FFlist.h index 30cef1b7a..8f477dd54 100644 --- a/src/util/FFlist.h +++ b/src/util/FFlist.h @@ -3,6 +3,8 @@ #ifndef FF_INCLUDED_FFLIST #define FF_INCLUDED_FFLIST +#include "FFcheckmacros.h" + #include #include @@ -19,11 +21,11 @@ typedef struct FFlist void ffListInit(FFlist* list, uint32_t elementSize); void ffListInitA(FFlist* list, uint32_t elementSize, uint32_t capacity); -void* ffListGet(const FFlist* list, uint32_t index); +FF_C_NODISCARD void* ffListGet(const FFlist* list, uint32_t index); void* ffListAdd(FFlist* list); -uint32_t ffListFirstIndexComp(const FFlist* list, void* compElement, bool(*compFunc)(const void*, const void*)); +FF_C_NODISCARD uint32_t ffListFirstIndexComp(const FFlist* list, void* compElement, bool(*compFunc)(const void*, const void*)); void ffListDestroy(FFlist* list); diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index 0dec7cd40..0c0b9020b 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -3,6 +3,8 @@ #ifndef FASTFETCH_INCLUDED_FFSTRBUF #define FASTFETCH_INCLUDED_FFSTRBUF +#include "FFcheckmacros.h" + #include #include #include @@ -25,7 +27,7 @@ void ffStrbufInitCopy(FFstrbuf* strbuf, const FFstrbuf* src); void ffStrbufEnsureFree(FFstrbuf* strbuf, uint32_t free); -uint32_t ffStrbufGetFree(const FFstrbuf* strbuf); +FF_C_NODISCARD uint32_t ffStrbufGetFree(const FFstrbuf* strbuf); void ffStrbufClear(FFstrbuf* strbuf); @@ -37,7 +39,7 @@ void ffStrbufAppendS(FFstrbuf* strbuf, const char* value); void ffStrbufAppendNS(FFstrbuf* strbuf, uint32_t length, const char* value); void ffStrbufAppendNSExludingC(FFstrbuf* strbuf, uint32_t length, const char* value, char exclude); void ffStrbufAppendTransformS(FFstrbuf* strbuf, const char* value, int(*transformFunc)(int)); -void ffStrbufAppendF(FFstrbuf* strbuf, const char* format, ...); +FF_C_PRINTF(2, 3) void ffStrbufAppendF(FFstrbuf* strbuf, const char* format, ...); void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments); void ffStrbufPrependS(FFstrbuf* strbuf, const char* value); @@ -46,11 +48,11 @@ void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value); void ffStrbufSet(FFstrbuf* strbuf, const FFstrbuf* value); void ffStrbufSetS(FFstrbuf* strbuf, const char* value); -int ffStrbufComp(const FFstrbuf* strbuf, const FFstrbuf* comp); -int ffStrbufCompS(const FFstrbuf* strbuf, const char* comp); +FF_C_NODISCARD int ffStrbufComp(const FFstrbuf* strbuf, const FFstrbuf* comp); +FF_C_NODISCARD int ffStrbufCompS(const FFstrbuf* strbuf, const char* comp); -int ffStrbufIgnCaseComp(const FFstrbuf* strbuf, const FFstrbuf* comp); -int ffStrbufIgnCaseCompS(const FFstrbuf* strbuf, const char* comp); +FF_C_NODISCARD int ffStrbufIgnCaseComp(const FFstrbuf* strbuf, const FFstrbuf* comp); +FF_C_NODISCARD int ffStrbufIgnCaseCompS(const FFstrbuf* strbuf, const char* comp); void ffStrbufTrimLeft(FFstrbuf* strbuf, char c); void ffStrbufTrimRight(FFstrbuf* strbuf, char c); @@ -62,16 +64,16 @@ void ffStrbufRemoveStringsA(FFstrbuf* strbuf, uint32_t numStrings, const char* s void ffStrbufRemoveStringsV(FFstrbuf* strbuf, uint32_t numStrings, va_list arguments); void ffStrbufRemoveStrings(FFstrbuf* strbuf, uint32_t numStrings, ...); -uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c); -uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str); +FF_C_NODISCARD uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c); +FF_C_NODISCARD uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str); -uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c); -uint32_t ffStrbufFirstIndex(const FFstrbuf* strbuf, const FFstrbuf* searched); -uint32_t ffStrbufFirstIndexS(const FFstrbuf* strbuf, const char* str); +FF_C_NODISCARD uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c); +FF_C_NODISCARD uint32_t ffStrbufFirstIndex(const FFstrbuf* strbuf, const FFstrbuf* searched); +FF_C_NODISCARD uint32_t ffStrbufFirstIndexS(const FFstrbuf* strbuf, const char* str); -uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c); +FF_C_NODISCARD uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c); -uint32_t ffStrbufLastIndexC(const FFstrbuf* strbuf, char c); +FF_C_NODISCARD uint32_t ffStrbufLastIndexC(const FFstrbuf* strbuf, char c); void ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index); void ffStrbufSubstrBeforeFirstC(FFstrbuf* strbuf, char c); @@ -89,7 +91,7 @@ bool ffStrbufStartsWithIgnCaseS(const FFstrbuf* strbuf, const char* start); bool ffStrbufEndsWithC(const FFstrbuf* strbuf, char c); bool ffStrbufEndsWithS(const FFstrbuf* strbuf, const char* end); -uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c); +FF_C_NODISCARD uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c); bool ffStrbufRemoveIgnCaseEndS(FFstrbuf* strbuf, const char* end); @@ -98,8 +100,8 @@ void ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c); void ffStrbufWriteTo(const FFstrbuf* strbuf, FILE* file); void ffStrbufPutTo(const FFstrbuf* strbuf, FILE* file); -double ffStrbufToDouble(const FFstrbuf* strbuf); -uint16_t ffStrbufToUInt16(const FFstrbuf* strbuf, uint16_t defaultValue); +FF_C_NODISCARD double ffStrbufToDouble(const FFstrbuf* strbuf); +FF_C_NODISCARD uint16_t ffStrbufToUInt16(const FFstrbuf* strbuf, uint16_t defaultValue); void ffStrbufDestroy(FFstrbuf* strbuf); diff --git a/src/util/FFvaluestore.h b/src/util/FFvaluestore.h index 58f0b714b..c59b584a6 100644 --- a/src/util/FFvaluestore.h +++ b/src/util/FFvaluestore.h @@ -3,12 +3,13 @@ #ifndef FASTFETCH_INCLUDED_FFVALUESTORE #define FASTFETCH_INCLUDED_FFVALUESTORE -#include "util/FFlist.h" +#include "FFlist.h" +#include "FFcheckmacros.h" typedef FFlist FFvaluestore; void ffValuestoreInit(FFvaluestore* vs, uint32_t valueSize); -void* ffValuestoreGet(FFvaluestore* vs, const char* key); +FF_C_NODISCARD void* ffValuestoreGet(FFvaluestore* vs, const char* key); void* ffValuestoreSet(FFvaluestore* vs, const char* key, bool* created); //created may be NULL void ffValuestoreDestroy(FFvaluestore* vs);