Added FCEU printf format specifier macros to enable compiler checking of format strings for custom printf style functions.

This commit is contained in:
harry 2023-01-29 19:38:30 -05:00
parent 0a19794cec
commit f815c849c2
7 changed files with 27 additions and 27 deletions

View File

@ -23,7 +23,7 @@ ArchiveScanRecord FCEUD_ScanArchive(std::string fname);
const char *FCEUD_GetCompilerString(); const char *FCEUD_GetCompilerString();
//This makes me feel dirty for some reason. //This makes me feel dirty for some reason.
void FCEU_printf(const char *format, ...); void FCEU_printf( __FCEU_PRINTF_FORMAT const char *format, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 2 );
#define FCEUI_printf FCEU_printf #define FCEUI_printf FCEU_printf
//Video interface //Video interface
@ -192,7 +192,7 @@ void TaseditorManualFunction(void);
int32 FCEUI_GetDesiredFPS(void); int32 FCEUI_GetDesiredFPS(void);
void FCEUI_SaveSnapshot(void); void FCEUI_SaveSnapshot(void);
void FCEUI_SaveSnapshotAs(void); void FCEUI_SaveSnapshotAs(void);
void FCEU_DispMessage(const char *format, int disppos, ...); void FCEU_DispMessage( __FCEU_PRINTF_FORMAT const char *format, int disppos, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 3 );
#define FCEUI_DispMessage FCEU_DispMessage #define FCEUI_DispMessage FCEU_DispMessage
int FCEUI_DecodePAR(const char *code, int *a, int *v, int *c, int *type); int FCEUI_DecodePAR(const char *code, int *a, int *v, int *c, int *type);

View File

@ -506,11 +506,7 @@ void PrintToWindowConsole(intptr_t hDlgAsInt, const char *str)
updateLuaDisplay = true; updateLuaDisplay = true;
} }
//---------------------------------------------------- //----------------------------------------------------
#ifdef WIN32 int LuaPrintfToWindowConsole( __FCEU_PRINTF_FORMAT const char * format, ...)
int LuaPrintfToWindowConsole(_In_z_ _Printf_format_string_ const char *format, ...)
#else
int LuaPrintfToWindowConsole(const char *__restrict format, ...) throw()
#endif
{ {
int retval; int retval;
va_list args; va_list args;

View File

@ -54,18 +54,7 @@ private slots:
}; };
// Formatted print // Formatted print
#ifdef WIN32 int LuaPrintfToWindowConsole( __FCEU_PRINTF_FORMAT const char *format, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 2 );
int LuaPrintfToWindowConsole(_In_z_ _Printf_format_string_ const char *format, ...);
#elif __linux__
#ifdef __THROWNL
int LuaPrintfToWindowConsole(const char *__restrict format, ...)
__THROWNL __attribute__((__format__(__printf__, 1, 2)));
#else
int LuaPrintfToWindowConsole(const char *__restrict format, ...) throw() __attribute__((__format__(__printf__, 1, 2)));
#endif
#else
int LuaPrintfToWindowConsole(const char *__restrict format, ...) throw();
#endif
void PrintToWindowConsole(intptr_t hDlgAsInt, const char *str); void PrintToWindowConsole(intptr_t hDlgAsInt, const char *str);

View File

@ -1066,7 +1066,7 @@ void FCEU_ResetVidSys(void) {
FCEUS FSettings; FCEUS FSettings;
void FCEU_printf(const char *format, ...) void FCEU_printf( __FCEU_PRINTF_FORMAT const char *format, ...)
{ {
char temp[2048]; char temp[2048];
@ -1086,7 +1086,7 @@ void FCEU_printf(const char *format, ...)
va_end(ap); va_end(ap);
} }
void FCEU_PrintError(const char *format, ...) void FCEU_PrintError( __FCEU_PRINTF_FORMAT const char *format, ...)
{ {
char temp[2048]; char temp[2048];

View File

@ -139,10 +139,10 @@ extern FCEUS FSettings;
bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists
void FCEU_PrintError(const char *format, ...); void FCEU_PrintError( __FCEU_PRINTF_FORMAT const char *format, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 2 );
void FCEU_printf(const char *format, ...); void FCEU_printf( __FCEU_PRINTF_FORMAT const char *format, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 2 );
void FCEU_DispMessage(const char *format, int disppos, ...); void FCEU_DispMessage( __FCEU_PRINTF_FORMAT const char *format, int disppos, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 3 );
void FCEU_DispMessageOnMovie(const char *format, ...); void FCEU_DispMessageOnMovie( __FCEU_PRINTF_FORMAT const char *format, ...) __FCEU_PRINTF_ATTRIBUTE( 1, 2 );
void FCEU_TogglePPU(); void FCEU_TogglePPU();
void SetNESDeemph_OldHacky(uint8 d, int force); void SetNESDeemph_OldHacky(uint8 d, int force);

View File

@ -162,6 +162,21 @@ typedef uint8 (*readfunc)(uint32 A);
#define FCEU_MAYBE_UNUSED #define FCEU_MAYBE_UNUSED
#endif #endif
#if defined(_MSC_VER)
// Microsoft compiler won't catch format issues, but VS IDE can catch on analysis mode
#define __FCEU_PRINTF_FORMAT _In_z_ _Printf_format_string_
#define __FCEU_PRINTF_ATTRIBUTE( fmt, va )
#elif FCEU_HAS_CPP_ATTRIBUTE(format)
// GCC and Clang compilers will perform printf format type checks, useful for catching format errors.
#define __FCEU_PRINTF_FORMAT
#define __FCEU_PRINTF_ATTRIBUTE( fmt, va ) __attribute__((__format__(__printf__, fmt, va)))
#else
#define __FCEU_PRINTF_FORMAT
#define __FCEU_PRINTF_ATTRIBUTE( fmt, va )
#endif
#include "utils/endian.h" #include "utils/endian.h"
#endif #endif

View File

@ -390,7 +390,7 @@ void snapAVI()
FCEUI_AviVideoUpdate(XBuf); FCEUI_AviVideoUpdate(XBuf);
} }
void FCEU_DispMessageOnMovie(const char *format, ...) void FCEU_DispMessageOnMovie( __FCEU_PRINTF_FORMAT const char *format, ...)
{ {
va_list ap; va_list ap;
@ -409,7 +409,7 @@ void FCEU_DispMessageOnMovie(const char *format, ...)
guiMessage.howlong = 0; guiMessage.howlong = 0;
} }
void FCEU_DispMessage(const char *format, int disppos=0, ...) void FCEU_DispMessage( __FCEU_PRINTF_FORMAT const char *format, int disppos=0, ...)
{ {
va_list ap; va_list ap;