mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-10 14:12:04 +08:00
engine: first attempts on fuzzing the engine
This commit is contained in:
@@ -566,4 +566,25 @@ void Test_RunImagelib( void )
|
||||
Z_Free( rgb.buffer );
|
||||
}
|
||||
|
||||
#define IMPLEMENT_IMAGELIB_FUZZ_TARGET( export, target ) \
|
||||
int EXPORT export( const uint8_t *Data, size_t Size ) \
|
||||
{ \
|
||||
rgbdata_t *rgb; \
|
||||
host.type = HOST_NORMAL; \
|
||||
Memory_Init(); \
|
||||
Image_Init(); \
|
||||
if( target( "#internal", Data, Size )) \
|
||||
{ \
|
||||
rgb = ImagePack(); \
|
||||
FS_FreeImage( rgb ); \
|
||||
} \
|
||||
Image_Shutdown(); \
|
||||
return 0; \
|
||||
} \
|
||||
|
||||
IMPLEMENT_IMAGELIB_FUZZ_TARGET( Fuzz_Image_LoadBMP, Image_LoadBMP )
|
||||
IMPLEMENT_IMAGELIB_FUZZ_TARGET( Fuzz_Image_LoadPNG, Image_LoadPNG )
|
||||
IMPLEMENT_IMAGELIB_FUZZ_TARGET( Fuzz_Image_LoadDDS, Image_LoadDDS )
|
||||
IMPLEMENT_IMAGELIB_FUZZ_TARGET( Fuzz_Image_LoadTGA, Image_LoadTGA )
|
||||
|
||||
#endif /* XASH_ENGINE_TESTS */
|
||||
|
||||
@@ -278,3 +278,25 @@ void FS_FreeStream( stream_t *stream )
|
||||
|
||||
stream->format->freefunc( stream );
|
||||
}
|
||||
|
||||
#if XASH_ENGINE_TESTS
|
||||
|
||||
#define IMPLEMENT_SOUNDLIB_FUZZ_TARGET( export, target ) \
|
||||
int EXPORT export( const uint8_t *Data, size_t Size ) \
|
||||
{ \
|
||||
wavdata_t *wav; \
|
||||
host.type = HOST_NORMAL; \
|
||||
Memory_Init(); \
|
||||
Sound_Init(); \
|
||||
if( target( "#internal", Data, Size )) \
|
||||
{ \
|
||||
wav = SoundPack(); \
|
||||
FS_FreeSound( wav ); \
|
||||
} \
|
||||
Sound_Shutdown(); \
|
||||
return 0; \
|
||||
} \
|
||||
|
||||
IMPLEMENT_SOUNDLIB_FUZZ_TARGET( Fuzz_Sound_LoadMPG, Sound_LoadMPG )
|
||||
IMPLEMENT_SOUNDLIB_FUZZ_TARGET( Fuzz_Sound_LoadWAV, Sound_LoadWAV )
|
||||
#endif
|
||||
|
||||
@@ -15,21 +15,20 @@ extern struct tests_stats_s tests_stats;
|
||||
x; \
|
||||
Msg( "Finished " #x "\n" )
|
||||
|
||||
#define TASSERT( exp ) \
|
||||
if(!( exp )) \
|
||||
#define _TASSERT( exp, msg ) \
|
||||
if( exp ) \
|
||||
{ \
|
||||
tests_stats.failed++; \
|
||||
Msg( S_ERROR "assert failed at %s:%i\n", __FILE__, __LINE__ ); \
|
||||
msg; \
|
||||
} \
|
||||
else tests_stats.passed++;
|
||||
|
||||
#define TASSERT( exp ) \
|
||||
_TASSERT( !(exp), Msg( S_ERROR "assert failed at %s:%i\n", __FILE__, __LINE__ ) )
|
||||
#define TASSERT_EQi( val1, val2 ) \
|
||||
_TASSERT( ( val1 ) != ( val2 ), Msg( S_ERROR "assert failed at %s:%i, \"%d\" != \"%d\"\n", __FILE__, __LINE__, #val1, #val2 ))
|
||||
#define TASSERT_STR( str1, str2 ) \
|
||||
if( Q_strcmp(( str1 ), ( str2 ))) \
|
||||
{ \
|
||||
tests_stats.failed++; \
|
||||
Msg( S_ERROR "assert failed at %s:%i, \"%s\" != \"%s\"\n", __FILE__, __LINE__, ( str1 ), ( str2 )); \
|
||||
} \
|
||||
else tests_stats.passed++;
|
||||
_TASSERT( Q_strcmp(( str1 ), ( str2 )), Msg( S_ERROR "assert failed at %s:%i, \"%s\" != \"%s\"\n", __FILE__, __LINE__, ( str1 ), ( str2 )))
|
||||
|
||||
void Test_RunImagelib( void );
|
||||
void Test_RunLibCommon( void );
|
||||
|
||||
@@ -32,6 +32,9 @@ def options(opt):
|
||||
grp.add_option('--enable-engine-tests', action = 'store_true', dest = 'ENGINE_TESTS', default = False,
|
||||
help = 'embed tests into the engine, jump into them by -runtests command line switch [default: %default]')
|
||||
|
||||
grp.add_option('--enable-engine-fuzz', action = 'store_true', dest = 'ENGINE_FUZZ', default = False,
|
||||
help = 'add LLVM libFuzzer [default: %default]' )
|
||||
|
||||
opt.load('sdl2')
|
||||
|
||||
def configure(conf):
|
||||
@@ -87,6 +90,10 @@ def configure(conf):
|
||||
|
||||
conf.env.ENGINE_TESTS = conf.options.ENGINE_TESTS
|
||||
|
||||
if conf.options.ENGINE_FUZZ:
|
||||
conf.env.append_unique('CFLAGS', '-fsanitize=fuzzer-no-link')
|
||||
conf.env.append_unique('LINKFLAGS', '-fsanitize=fuzzer')
|
||||
|
||||
conf.define_cond('XASH_ENGINE_TESTS', conf.env.ENGINE_TESTS)
|
||||
conf.define_cond('XASH_STATIC_LIBS', conf.env.STATIC_LINKING)
|
||||
conf.define_cond('XASH_CUSTOM_SWAP', conf.options.CUSTOM_SWAP)
|
||||
|
||||
Reference in New Issue
Block a user