src/test/SDL_test_fuzzer.c
author Andreas Schiffler
Sat, 22 Dec 2012 16:06:55 -0800
changeset 6763 9cbd31a3450b
parent 6760 04dcce3081e6
child 6789 7177d421bb07
permissions -rw-r--r--
Test lib updates: updated harness to support filtering, added surface comparer, updated interface to test images; added Render test suite from GSOC project
aschiffler@6711
     1
/*
aschiffler@6711
     2
  Simple DirectMedia Layer
aschiffler@6711
     3
  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
aschiffler@6711
     4
aschiffler@6711
     5
  This software is provided 'as-is', without any express or implied
aschiffler@6711
     6
  warranty.  In no event will the authors be held liable for any damages
aschiffler@6711
     7
  arising from the use of this software.
aschiffler@6711
     8
aschiffler@6711
     9
  Permission is granted to anyone to use this software for any purpose,
aschiffler@6711
    10
  including commercial applications, and to alter it and redistribute it
aschiffler@6711
    11
  freely, subject to the following restrictions:
aschiffler@6711
    12
aschiffler@6711
    13
  1. The origin of this software must not be misrepresented; you must not
aschiffler@6711
    14
     claim that you wrote the original software. If you use this software
aschiffler@6711
    15
     in a product, an acknowledgment in the product documentation would be
aschiffler@6711
    16
     appreciated but is not required.
aschiffler@6711
    17
  2. Altered source versions must be plainly marked as such, and must not be
aschiffler@6711
    18
     misrepresented as being the original software.
aschiffler@6711
    19
  3. This notice may not be removed or altered from any source distribution.
aschiffler@6711
    20
*/
aschiffler@6711
    21
aschiffler@6711
    22
/* 
aschiffler@6711
    23
aschiffler@6711
    24
  Data generators for fuzzing test data in a reproducible way.
aschiffler@6711
    25
 
aschiffler@6711
    26
*/
aschiffler@6711
    27
aschiffler@6711
    28
#include "SDL_config.h"
aschiffler@6711
    29
aschiffler@6711
    30
#include <stdint.h>
aschiffler@6711
    31
#include <stdio.h>
aschiffler@6711
    32
#include <stdlib.h>
aschiffler@6711
    33
#include <limits.h>
aschiffler@6711
    34
#include <float.h>
aschiffler@6711
    35
aschiffler@6711
    36
#include "SDL_test.h"
aschiffler@6711
    37
aschiffler@6711
    38
/** 
aschiffler@6711
    39
 *Counter for fuzzer invocations
aschiffler@6711
    40
 */
aschiffler@6757
    41
static int fuzzerInvocationCounter = 0;
aschiffler@6711
    42
aschiffler@6711
    43
/**
aschiffler@6711
    44
 * Context for shared random number generator
aschiffler@6711
    45
 */
aschiffler@6711
    46
static SDLTest_RandomContext rndContext;
aschiffler@6711
    47
aschiffler@6711
    48
/*
aschiffler@6711
    49
 * Note: doxygen documentation markup for functions is in the header file.
aschiffler@6711
    50
 */
aschiffler@6711
    51
aschiffler@6711
    52
void
aschiffler@6711
    53
SDLTest_FuzzerInit(Uint64 execKey)
aschiffler@6711
    54
{
aschiffler@6757
    55
	Uint32 a = (execKey >> 32) & 0x00000000FFFFFFFF;
aschiffler@6711
    56
	Uint32 b = execKey & 0x00000000FFFFFFFF;
aschiffler@6757
    57
	SDL_memset((void *)&rndContext, 0, sizeof(SDLTest_RandomContext));
aschiffler@6711
    58
	SDLTest_RandomInit(&rndContext, a, b);
aschiffler@6757
    59
	fuzzerInvocationCounter = 0;
aschiffler@6711
    60
}
aschiffler@6711
    61
aschiffler@6711
    62
int
aschiffler@6756
    63
SDLTest_GetFuzzerInvocationCount()
aschiffler@6711
    64
{
aschiffler@6711
    65
	return fuzzerInvocationCounter;
aschiffler@6711
    66
}
aschiffler@6711
    67
aschiffler@6711
    68
Uint8
aschiffler@6711
    69
SDLTest_RandomUint8()
aschiffler@6711
    70
{
aschiffler@6711
    71
	fuzzerInvocationCounter++;
aschiffler@6711
    72
aschiffler@6711
    73
	return (Uint8) SDLTest_RandomInt(&rndContext) & 0x000000FF;
aschiffler@6711
    74
}
aschiffler@6711
    75
aschiffler@6711
    76
Sint8
aschiffler@6711
    77
SDLTest_RandomSint8()
aschiffler@6711
    78
{
aschiffler@6711
    79
	fuzzerInvocationCounter++;
aschiffler@6711
    80
aschiffler@6711
    81
	return (Sint8) SDLTest_RandomInt(&rndContext) & 0x000000FF;
aschiffler@6711
    82
}
aschiffler@6711
    83
aschiffler@6711
    84
Uint16
aschiffler@6711
    85
SDLTest_RandomUint16()
aschiffler@6711
    86
{
aschiffler@6711
    87
	fuzzerInvocationCounter++;
aschiffler@6711
    88
aschiffler@6711
    89
	return (Uint16) SDLTest_RandomInt(&rndContext) & 0x0000FFFF;
aschiffler@6711
    90
}
aschiffler@6711
    91
aschiffler@6711
    92
Sint16
aschiffler@6711
    93
SDLTest_RandomSint16()
aschiffler@6711
    94
{
aschiffler@6711
    95
	fuzzerInvocationCounter++;
aschiffler@6711
    96
aschiffler@6711
    97
	return (Sint16) SDLTest_RandomInt(&rndContext) & 0x0000FFFF;
aschiffler@6711
    98
}
aschiffler@6711
    99
aschiffler@6711
   100
Sint32
aschiffler@6711
   101
SDLTest_RandomSint32()
aschiffler@6711
   102
{
aschiffler@6711
   103
	fuzzerInvocationCounter++;
aschiffler@6711
   104
aschiffler@6711
   105
	return (Sint32) SDLTest_RandomInt(&rndContext);
aschiffler@6711
   106
}
aschiffler@6711
   107
aschiffler@6711
   108
Uint32
aschiffler@6711
   109
SDLTest_RandomUint32()
aschiffler@6711
   110
{
aschiffler@6711
   111
	fuzzerInvocationCounter++;
aschiffler@6711
   112
aschiffler@6711
   113
	return (Uint32) SDLTest_RandomInt(&rndContext);
aschiffler@6711
   114
}
aschiffler@6711
   115
aschiffler@6711
   116
Uint64
aschiffler@6711
   117
SDLTest_RandomUint64()
aschiffler@6711
   118
{
aschiffler@6763
   119
	Uint64 value = 0;
aschiffler@6763
   120
	Uint32 *vp = (void *)&value;
aschiffler@6711
   121
aschiffler@6711
   122
	fuzzerInvocationCounter++;
aschiffler@6711
   123
aschiffler@6711
   124
	vp[0] = SDLTest_RandomSint32();
aschiffler@6711
   125
	vp[1] = SDLTest_RandomSint32();
aschiffler@6711
   126
aschiffler@6711
   127
	return value;
aschiffler@6711
   128
}
aschiffler@6711
   129
aschiffler@6711
   130
Sint64
aschiffler@6711
   131
SDLTest_RandomSint64()
aschiffler@6711
   132
{
aschiffler@6763
   133
	Uint64 value = 0;
aschiffler@6763
   134
	Uint32 *vp = (void *)&value;
aschiffler@6711
   135
aschiffler@6711
   136
	fuzzerInvocationCounter++;
aschiffler@6711
   137
aschiffler@6711
   138
	vp[0] = SDLTest_RandomSint32();
aschiffler@6711
   139
	vp[1] = SDLTest_RandomSint32();
aschiffler@6711
   140
aschiffler@6711
   141
	return value;
aschiffler@6711
   142
}
aschiffler@6711
   143
aschiffler@6711
   144
aschiffler@6711
   145
aschiffler@6711
   146
Sint32
aschiffler@6711
   147
SDLTest_RandomIntegerInRange(Sint32 pMin, Sint32 pMax)
aschiffler@6711
   148
{
aschiffler@6711
   149
	Sint64 min = pMin;
aschiffler@6711
   150
	Sint64 max = pMax;
aschiffler@6711
   151
	Sint64 temp;
aschiffler@6711
   152
	Sint64 number;
aschiffler@6711
   153
aschiffler@6711
   154
	if(pMin > pMax) {
aschiffler@6711
   155
		temp = min;
aschiffler@6711
   156
		min = max;
aschiffler@6711
   157
		max = temp;
aschiffler@6711
   158
	} else if(pMin == pMax) {
aschiffler@6711
   159
		return (Sint32)min;
aschiffler@6711
   160
	}
aschiffler@6711
   161
aschiffler@6711
   162
	number = SDLTest_RandomUint32(); // invocation count increment in there
aschiffler@6711
   163
aschiffler@6711
   164
	return (Sint32)((number % ((max + 1) - min)) + min);
aschiffler@6711
   165
}
aschiffler@6711
   166
aschiffler@6711
   167
/*!
aschiffler@6711
   168
 * Generates boundary values between the given boundaries.
aschiffler@6711
   169
 * Boundary values are inclusive. See the examples below.
aschiffler@6711
   170
 * If boundary2 < boundary1, the values are swapped.
aschiffler@6711
   171
 * If boundary1 == boundary2, value of boundary1 will be returned
aschiffler@6711
   172
 *
aschiffler@6711
   173
 * Generating boundary values for Uint8:
aschiffler@6711
   174
 * BoundaryValues(sizeof(Uint8), 10, 20, True) -> [10,11,19,20]
aschiffler@6711
   175
 * BoundaryValues(sizeof(Uint8), 10, 20, False) -> [9,21]
aschiffler@6711
   176
 * BoundaryValues(sizeof(Uint8), 0, 15, True) -> [0, 1, 14, 15]
aschiffler@6711
   177
 * BoundaryValues(sizeof(Uint8), 0, 15, False) -> [16]
aschiffler@6711
   178
 * BoundaryValues(sizeof(Uint8), 0, 255, False) -> NULL
aschiffler@6711
   179
 *
aschiffler@6711
   180
 * Generator works the same for other types of unsigned integers.
aschiffler@6711
   181
 *
aschiffler@6711
   182
 * Note: outBuffer will be allocated and needs to be freed later.
aschiffler@6711
   183
 * If outbuffer != NULL, it'll be freed.
aschiffler@6711
   184
 *
aschiffler@6711
   185
 * \param maxValue The biggest value that is acceptable for this data type.
aschiffler@6711
   186
 * 					For instance, for Uint8 -> 255, Uint16 -> 65536 etc.
aschiffler@6711
   187
 * \param pBoundary1 defines lower boundary
aschiffler@6711
   188
 * \param pBoundary2 defines upper boundary
aschiffler@6711
   189
 * \param validDomain Generate only for valid domain (for the data type)
aschiffler@6711
   190
 *
aschiffler@6711
   191
 * \param outBuffer The generated boundary values are put here
aschiffler@6711
   192
 *
aschiffler@6711
   193
 * \returns Returns the number of elements in outBuffer or -1 in case of error
aschiffler@6711
   194
 */
aschiffler@6711
   195
Uint32
aschiffler@6711
   196
SDLTest_GenerateUnsignedBoundaryValues(const Uint64 maxValue,
aschiffler@6711
   197
					Uint64 pBoundary1, Uint64 pBoundary2, SDL_bool validDomain,
aschiffler@6711
   198
					Uint64 *outBuffer)
aschiffler@6711
   199
{
aschiffler@6711
   200
	Uint64 boundary1 = pBoundary1, boundary2 = pBoundary2;
aschiffler@6711
   201
	Uint64 temp;
aschiffler@6711
   202
	Uint64 tempBuf[4];
aschiffler@6711
   203
	int index;
aschiffler@6711
   204
aschiffler@6711
   205
	if(outBuffer != NULL) {
aschiffler@6711
   206
		SDL_free(outBuffer);
aschiffler@6711
   207
	}
aschiffler@6711
   208
aschiffler@6711
   209
	if(boundary1 > boundary2) {
aschiffler@6711
   210
		temp = boundary1;
aschiffler@6711
   211
		boundary1 = boundary2;
aschiffler@6711
   212
		boundary2 = temp;
aschiffler@6711
   213
	}
aschiffler@6711
   214
aschiffler@6711
   215
	index = 0;
aschiffler@6711
   216
	if(boundary1 == boundary2) {
aschiffler@6711
   217
		tempBuf[index++] = boundary1;
aschiffler@6711
   218
	}
aschiffler@6711
   219
	else if(validDomain) {
aschiffler@6711
   220
		tempBuf[index++] = boundary1;
aschiffler@6711
   221
aschiffler@6711
   222
		if(boundary1 < UINT64_MAX)
aschiffler@6711
   223
			tempBuf[index++] = boundary1 + 1;
aschiffler@6711
   224
aschiffler@6711
   225
		tempBuf[index++] = boundary2 - 1;
aschiffler@6711
   226
		tempBuf[index++] = boundary2;
aschiffler@6711
   227
	}
aschiffler@6711
   228
	else {
aschiffler@6711
   229
		if(boundary1 > 0) {
aschiffler@6711
   230
			tempBuf[index++] = boundary1 - 1;
aschiffler@6711
   231
		}
aschiffler@6711
   232
aschiffler@6711
   233
		if(boundary2 < maxValue && boundary2 < UINT64_MAX) {
aschiffler@6711
   234
			tempBuf[index++] = boundary2 + 1;
aschiffler@6711
   235
		}
aschiffler@6711
   236
	}
aschiffler@6711
   237
aschiffler@6711
   238
	if(index == 0) {
aschiffler@6711
   239
		// There are no valid boundaries
aschiffler@6711
   240
		return 0;
aschiffler@6711
   241
	}
aschiffler@6711
   242
aschiffler@6711
   243
	// Create the return buffer
aschiffler@6711
   244
	outBuffer = (Uint64 *)SDL_malloc(index * sizeof(Uint64));
aschiffler@6711
   245
	if(outBuffer == NULL) {
aschiffler@6711
   246
		return 0;
aschiffler@6711
   247
	}
aschiffler@6711
   248
aschiffler@6711
   249
	SDL_memcpy(outBuffer, tempBuf, index * sizeof(Uint64));
aschiffler@6711
   250
aschiffler@6711
   251
	return index;
aschiffler@6711
   252
}
aschiffler@6711
   253
aschiffler@6711
   254
Uint8
aschiffler@6711
   255
SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain)
aschiffler@6711
   256
{
aschiffler@6711
   257
	Uint64 *buffer = NULL;
aschiffler@6711
   258
	Uint32 size;
aschiffler@6711
   259
	Uint32 index;
aschiffler@6711
   260
	Uint8 retVal;
aschiffler@6711
   261
aschiffler@6711
   262
	// max value for Uint8
aschiffler@6711
   263
	const Uint64 maxValue = UINT8_MAX;
aschiffler@6711
   264
aschiffler@6711
   265
	size = SDLTest_GenerateUnsignedBoundaryValues(maxValue,
aschiffler@6711
   266
				(Uint64) boundary1, (Uint64) boundary2,
aschiffler@6711
   267
				validDomain, buffer);
aschiffler@6719
   268
	if (buffer == NULL || size == 0) {
aschiffler@6711
   269
		return 0;
aschiffler@6711
   270
	}
aschiffler@6711
   271
aschiffler@6711
   272
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   273
	retVal = (Uint8)buffer[index];
aschiffler@6711
   274
aschiffler@6711
   275
	SDL_free(buffer);
aschiffler@6711
   276
aschiffler@6711
   277
	fuzzerInvocationCounter++;
aschiffler@6711
   278
aschiffler@6711
   279
	return retVal;
aschiffler@6711
   280
}
aschiffler@6711
   281
aschiffler@6711
   282
Uint16
aschiffler@6711
   283
SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain)
aschiffler@6711
   284
{
aschiffler@6711
   285
	Uint64 *buffer = NULL;
aschiffler@6711
   286
	Uint32 size;
aschiffler@6711
   287
	Uint32 index;
aschiffler@6711
   288
	Uint16 retVal;
aschiffler@6711
   289
aschiffler@6711
   290
	// max value for Uint16
aschiffler@6711
   291
	const Uint64 maxValue = UINT16_MAX;
aschiffler@6711
   292
aschiffler@6711
   293
	size = SDLTest_GenerateUnsignedBoundaryValues(maxValue,
aschiffler@6711
   294
				(Uint64) boundary1, (Uint64) boundary2,
aschiffler@6711
   295
				validDomain, buffer);
aschiffler@6719
   296
	if (buffer == NULL || size == 0) {
aschiffler@6711
   297
		return 0;
aschiffler@6711
   298
	}
aschiffler@6711
   299
aschiffler@6711
   300
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   301
	retVal = (Uint16) buffer[index];
aschiffler@6711
   302
aschiffler@6711
   303
	SDL_free(buffer);
aschiffler@6711
   304
aschiffler@6711
   305
	fuzzerInvocationCounter++;
aschiffler@6711
   306
aschiffler@6711
   307
	return retVal;
aschiffler@6711
   308
}
aschiffler@6711
   309
aschiffler@6711
   310
Uint32
aschiffler@6711
   311
SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain)
aschiffler@6711
   312
{
aschiffler@6711
   313
	Uint64 *buffer = NULL;
aschiffler@6711
   314
	Uint32 size;
aschiffler@6711
   315
	Uint32 index;
aschiffler@6711
   316
	Uint32 retVal;
aschiffler@6711
   317
aschiffler@6711
   318
	// max value for Uint32
aschiffler@6711
   319
	const Uint64 maxValue = UINT32_MAX;
aschiffler@6711
   320
aschiffler@6711
   321
	size = SDLTest_GenerateUnsignedBoundaryValues(maxValue,
aschiffler@6711
   322
				(Uint64) boundary1, (Uint64) boundary2,
aschiffler@6711
   323
				validDomain, buffer);
aschiffler@6719
   324
	if (buffer == NULL || size == 0) {
aschiffler@6711
   325
		return 0;
aschiffler@6711
   326
	}
aschiffler@6711
   327
aschiffler@6711
   328
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   329
	retVal = (Uint32) buffer[index];
aschiffler@6711
   330
aschiffler@6711
   331
	SDL_free(buffer);
aschiffler@6711
   332
aschiffler@6711
   333
	fuzzerInvocationCounter++;
aschiffler@6711
   334
aschiffler@6711
   335
	return retVal;
aschiffler@6711
   336
}
aschiffler@6711
   337
aschiffler@6711
   338
Uint64
aschiffler@6711
   339
SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain)
aschiffler@6711
   340
{
aschiffler@6711
   341
	Uint64 *buffer = NULL;
aschiffler@6711
   342
	Uint32 size;
aschiffler@6711
   343
	Uint32 index;
aschiffler@6711
   344
	Uint64 retVal;
aschiffler@6711
   345
aschiffler@6711
   346
	// max value for Uint64
aschiffler@6711
   347
	const Uint64 maxValue = UINT64_MAX;
aschiffler@6711
   348
aschiffler@6711
   349
	size = SDLTest_GenerateUnsignedBoundaryValues(maxValue,
aschiffler@6711
   350
				(Uint64) boundary1, (Uint64) boundary2,
aschiffler@6711
   351
				validDomain, buffer);
aschiffler@6719
   352
	if (buffer == NULL || size == 0) {
aschiffler@6711
   353
		return 0;
aschiffler@6711
   354
	}
aschiffler@6711
   355
aschiffler@6711
   356
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   357
	retVal = (Uint64) buffer[index];
aschiffler@6711
   358
aschiffler@6711
   359
	SDL_free(buffer);
aschiffler@6711
   360
aschiffler@6711
   361
	fuzzerInvocationCounter++;
aschiffler@6711
   362
aschiffler@6711
   363
	return retVal;
aschiffler@6711
   364
}
aschiffler@6711
   365
aschiffler@6711
   366
/*!
aschiffler@6711
   367
 * Generates boundary values between the given boundaries.
aschiffler@6711
   368
 * Boundary values are inclusive. See the examples below.
aschiffler@6711
   369
 * If boundary2 < boundary1, the values are swapped.
aschiffler@6711
   370
 * If boundary1 == boundary2, value of boundary1 will be returned
aschiffler@6711
   371
 *
aschiffler@6711
   372
 * Generating boundary values for Sint8:
aschiffler@6711
   373
 * SignedBoundaryValues(sizeof(Sint8), -10, 20, True) -> [-11,-10,19,20]
aschiffler@6711
   374
 * SignedBoundaryValues(sizeof(Sint8), -10, 20, False) -> [-11,21]
aschiffler@6711
   375
 * SignedBoundaryValues(sizeof(Sint8), -30, -15, True) -> [-30, -29, -16, -15]
aschiffler@6711
   376
 * SignedBoundaryValues(sizeof(Sint8), -128, 15, False) -> [16]
aschiffler@6711
   377
 * SignedBoundaryValues(sizeof(Sint8), -128, 127, False) -> NULL
aschiffler@6711
   378
 *
aschiffler@6711
   379
 * Generator works the same for other types of signed integers.
aschiffler@6711
   380
 *
aschiffler@6711
   381
 * Note: outBuffer will be allocated and needs to be freed later.
aschiffler@6711
   382
 * If outbuffer != NULL, it'll be freed.
aschiffler@6711
   383
 *
aschiffler@6711
   384
 *
aschiffler@6711
   385
 * \param minValue The smallest value  that is acceptable for this data type.
aschiffler@6711
   386
 *					For instance, for Uint8 -> -128, Uint16 -> -32,768 etc.
aschiffler@6711
   387
 * \param maxValue The biggest value that is acceptable for this data type.
aschiffler@6711
   388
 * 					For instance, for Uint8 -> 127, Uint16 -> 32767 etc.
aschiffler@6711
   389
 * \param pBoundary1 defines lower boundary
aschiffler@6711
   390
 * \param pBoundary2 defines upper boundary
aschiffler@6711
   391
 * \param validDomain Generate only for valid domain (for the data type)
aschiffler@6711
   392
 *
aschiffler@6711
   393
 * \param outBuffer The generated boundary values are put here
aschiffler@6711
   394
 *
aschiffler@6711
   395
 * \returns Returns the number of elements in outBuffer or -1 in case of error
aschiffler@6711
   396
 */
aschiffler@6711
   397
Uint32
aschiffler@6711
   398
SDLTest_GenerateSignedBoundaryValues(const Sint64 minValue, const Sint64 maxValue,
aschiffler@6711
   399
					Sint64 pBoundary1, Sint64 pBoundary2, SDL_bool validDomain,
aschiffler@6711
   400
					Sint64 *outBuffer)
aschiffler@6711
   401
{
aschiffler@6711
   402
	int index;
aschiffler@6711
   403
	Sint64 tempBuf[4];
aschiffler@6711
   404
	Sint64 boundary1 = pBoundary1, boundary2 = pBoundary2;
aschiffler@6711
   405
aschiffler@6711
   406
	if(outBuffer != NULL) {
aschiffler@6711
   407
		SDL_free(outBuffer);
aschiffler@6711
   408
	}
aschiffler@6711
   409
aschiffler@6711
   410
	if(boundary1 > boundary2) {
aschiffler@6711
   411
		Sint64 temp = boundary1;
aschiffler@6711
   412
		boundary1 = boundary2;
aschiffler@6711
   413
		boundary2 = temp;
aschiffler@6711
   414
	}
aschiffler@6711
   415
aschiffler@6711
   416
	index = 0;
aschiffler@6711
   417
	if(boundary1 == boundary2) {
aschiffler@6711
   418
		tempBuf[index++] = boundary1;
aschiffler@6711
   419
	}
aschiffler@6711
   420
	else if(validDomain) {
aschiffler@6711
   421
		tempBuf[index++] = boundary1;
aschiffler@6711
   422
aschiffler@6711
   423
		if(boundary1 < LLONG_MAX)
aschiffler@6711
   424
			tempBuf[index++] = boundary1 + 1;
aschiffler@6711
   425
aschiffler@6711
   426
		if(boundary2 > LLONG_MIN)
aschiffler@6711
   427
			tempBuf[index++] = boundary2 - 1;
aschiffler@6711
   428
aschiffler@6711
   429
		tempBuf[index++] = boundary2;
aschiffler@6711
   430
	}
aschiffler@6711
   431
	else {
aschiffler@6711
   432
		if(boundary1 > minValue &&  boundary1 > LLONG_MIN) {
aschiffler@6711
   433
			tempBuf[index++] = boundary1 - 1;
aschiffler@6711
   434
		}
aschiffler@6711
   435
aschiffler@6711
   436
		if(boundary2 < maxValue && boundary2 < UINT64_MAX) {
aschiffler@6711
   437
			tempBuf[index++] = boundary2 + 1;
aschiffler@6711
   438
		}
aschiffler@6711
   439
	}
aschiffler@6711
   440
aschiffler@6711
   441
	if(index == 0) {
aschiffler@6711
   442
		// There are no valid boundaries
aschiffler@6711
   443
		return 0;
aschiffler@6711
   444
	}
aschiffler@6711
   445
aschiffler@6711
   446
	// Create the return buffer
aschiffler@6711
   447
	outBuffer = (Sint64 *)SDL_malloc(index * sizeof(Sint64));
aschiffler@6711
   448
	if(outBuffer == NULL) {
aschiffler@6711
   449
		return 0;
aschiffler@6711
   450
	}
aschiffler@6711
   451
aschiffler@6711
   452
	SDL_memcpy((void *)outBuffer, (void *)tempBuf, index * sizeof(Sint64));
aschiffler@6711
   453
aschiffler@6711
   454
	return (Uint32)index;
aschiffler@6711
   455
}
aschiffler@6711
   456
aschiffler@6711
   457
Sint8
aschiffler@6711
   458
SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain)
aschiffler@6711
   459
{
aschiffler@6711
   460
	// min & max values for Sint8
aschiffler@6711
   461
	const Sint64 maxValue = CHAR_MAX;
aschiffler@6711
   462
	const Sint64 minValue = CHAR_MIN;
aschiffler@6711
   463
aschiffler@6711
   464
	Sint64 *buffer = NULL;
aschiffler@6711
   465
	Uint32 size;
aschiffler@6711
   466
	Uint32 index;
aschiffler@6711
   467
	Sint8 retVal;
aschiffler@6711
   468
aschiffler@6711
   469
	size = SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,
aschiffler@6711
   470
				(Sint64) boundary1, (Sint64) boundary2,
aschiffler@6711
   471
				validDomain, buffer);
aschiffler@6719
   472
	if (buffer == NULL || size == 0) {
aschiffler@6711
   473
		return CHAR_MIN;
aschiffler@6711
   474
	}
aschiffler@6711
   475
aschiffler@6711
   476
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   477
	retVal = (Sint8) buffer[index];
aschiffler@6711
   478
aschiffler@6711
   479
	SDL_free(buffer);
aschiffler@6711
   480
aschiffler@6711
   481
	fuzzerInvocationCounter++;
aschiffler@6711
   482
aschiffler@6711
   483
	return retVal;
aschiffler@6711
   484
}
aschiffler@6711
   485
aschiffler@6711
   486
Sint16
aschiffler@6711
   487
SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain)
aschiffler@6711
   488
{
aschiffler@6711
   489
	// min & max values for Sint16
aschiffler@6711
   490
	const Sint64 maxValue = SHRT_MAX;
aschiffler@6711
   491
	const Sint64 minValue = SHRT_MIN;
aschiffler@6711
   492
	Sint64 *buffer = NULL;
aschiffler@6711
   493
	Uint32 size;
aschiffler@6711
   494
	Uint32 index;
aschiffler@6711
   495
	Sint16 retVal;
aschiffler@6711
   496
aschiffler@6711
   497
	size = SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,
aschiffler@6711
   498
					(Sint64) boundary1, (Sint64) boundary2,
aschiffler@6711
   499
					validDomain, buffer);
aschiffler@6719
   500
	if (buffer == NULL || size == 0) {
aschiffler@6711
   501
		return SHRT_MIN;
aschiffler@6711
   502
	}
aschiffler@6711
   503
aschiffler@6711
   504
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   505
	retVal = (Sint16) buffer[index];
aschiffler@6711
   506
aschiffler@6711
   507
	SDL_free(buffer);
aschiffler@6711
   508
aschiffler@6711
   509
	fuzzerInvocationCounter++;
aschiffler@6711
   510
aschiffler@6711
   511
	return retVal;
aschiffler@6711
   512
}
aschiffler@6711
   513
aschiffler@6711
   514
Sint32
aschiffler@6711
   515
SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain)
aschiffler@6711
   516
{
aschiffler@6711
   517
	// min & max values for Sint32
aschiffler@6711
   518
	const Sint64 maxValue = INT_MAX;
aschiffler@6711
   519
	const Sint64 minValue = INT_MIN;
aschiffler@6711
   520
aschiffler@6711
   521
	Sint64 *buffer = NULL;
aschiffler@6711
   522
	Uint32 size;
aschiffler@6711
   523
	Uint32 index;
aschiffler@6711
   524
	Sint32 retVal;
aschiffler@6711
   525
aschiffler@6711
   526
	size = SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,
aschiffler@6711
   527
				(Sint64) boundary1, (Sint64) boundary2,
aschiffler@6711
   528
				validDomain, buffer);
aschiffler@6719
   529
	if (buffer == NULL || size == 0) {
aschiffler@6711
   530
		return INT_MIN;
aschiffler@6711
   531
	}
aschiffler@6711
   532
aschiffler@6711
   533
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   534
	retVal = (Sint32) buffer[index];
aschiffler@6711
   535
aschiffler@6711
   536
	SDL_free(buffer);
aschiffler@6711
   537
aschiffler@6711
   538
	fuzzerInvocationCounter++;
aschiffler@6711
   539
aschiffler@6711
   540
	return retVal;
aschiffler@6711
   541
}
aschiffler@6711
   542
aschiffler@6711
   543
Sint64
aschiffler@6711
   544
SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain)
aschiffler@6711
   545
{
aschiffler@6711
   546
	Sint64 *buffer = NULL;
aschiffler@6711
   547
	Uint32 size;
aschiffler@6711
   548
	Uint32 index;
aschiffler@6711
   549
	Sint64 retVal;
aschiffler@6711
   550
aschiffler@6711
   551
	// min & max values for Sint64
aschiffler@6711
   552
	const Sint64 maxValue = LLONG_MAX;
aschiffler@6711
   553
	const Sint64 minValue = LLONG_MIN;
aschiffler@6711
   554
aschiffler@6711
   555
	size = SDLTest_GenerateSignedBoundaryValues(minValue, maxValue,
aschiffler@6711
   556
				(Sint64) boundary1, (Sint64) boundary2,
aschiffler@6711
   557
				validDomain, buffer);
aschiffler@6719
   558
	if (buffer == NULL || size == 0) {
aschiffler@6711
   559
		return LLONG_MIN;
aschiffler@6711
   560
	}
aschiffler@6711
   561
aschiffler@6711
   562
	index = SDLTest_RandomSint32() % size;
aschiffler@6711
   563
	retVal = (Sint64) buffer[index];
aschiffler@6711
   564
aschiffler@6711
   565
	SDL_free(buffer);
aschiffler@6711
   566
aschiffler@6711
   567
	fuzzerInvocationCounter++;
aschiffler@6711
   568
aschiffler@6711
   569
	return retVal;
aschiffler@6711
   570
}
aschiffler@6711
   571
aschiffler@6711
   572
float
aschiffler@6711
   573
SDLTest_RandomUnitFloat()
aschiffler@6711
   574
{
aschiffler@6711
   575
	return (float) SDLTest_RandomUint32() / UINT_MAX;
aschiffler@6711
   576
}
aschiffler@6711
   577
aschiffler@6711
   578
float
aschiffler@6711
   579
SDLTest_RandomFloat()
aschiffler@6711
   580
{
aschiffler@6711
   581
        return (float) (FLT_MIN + SDLTest_RandomUnitDouble() * (FLT_MAX - FLT_MIN));
aschiffler@6711
   582
}
aschiffler@6711
   583
aschiffler@6711
   584
double
aschiffler@6711
   585
SDLTest_RandomUnitDouble()
aschiffler@6711
   586
{
aschiffler@6711
   587
	return (double) (SDLTest_RandomUint64() >> 11) * (1.0/9007199254740992.0);
aschiffler@6711
   588
}
aschiffler@6711
   589
aschiffler@6711
   590
double
aschiffler@6711
   591
SDLTest_RandomDouble()
aschiffler@6711
   592
{
aschiffler@6711
   593
	double r = 0.0;
aschiffler@6711
   594
	double s = 1.0;
aschiffler@6711
   595
	do {
aschiffler@6711
   596
	  s /= UINT_MAX + 1.0;
aschiffler@6711
   597
	  r += (double)SDLTest_RandomInt(&rndContext) * s;
aschiffler@6711
   598
	} while (s > DBL_EPSILON);
aschiffler@6711
   599
	  
aschiffler@6711
   600
	fuzzerInvocationCounter++;
aschiffler@6711
   601
	
aschiffler@6711
   602
	return r;
aschiffler@6711
   603
}
aschiffler@6711
   604
aschiffler@6711
   605
aschiffler@6711
   606
char *
aschiffler@6711
   607
SDLTest_RandomAsciiString()
aschiffler@6711
   608
{
aschiffler@6711
   609
	// note: fuzzerInvocationCounter is increment in the RandomAsciiStringWithMaximumLenght
aschiffler@6711
   610
	return SDLTest_RandomAsciiStringWithMaximumLength(255);
aschiffler@6711
   611
}
aschiffler@6711
   612
aschiffler@6711
   613
char *
aschiffler@6711
   614
SDLTest_RandomAsciiStringWithMaximumLength(int maxSize)
aschiffler@6711
   615
{
aschiffler@6711
   616
	int size;
aschiffler@6711
   617
	char *string;
aschiffler@6711
   618
	int counter;
aschiffler@6711
   619
aschiffler@6711
   620
	fuzzerInvocationCounter++;
aschiffler@6711
   621
aschiffler@6711
   622
	if(maxSize < 1) {
aschiffler@6711
   623
		return NULL;
aschiffler@6711
   624
	}
aschiffler@6711
   625
aschiffler@6711
   626
	size = (SDLTest_RandomUint32() % (maxSize + 1)) + 1;
aschiffler@6711
   627
	string = (char *)SDL_malloc(size * sizeof(char));
aschiffler@6711
   628
	if (string==NULL) {
aschiffler@6711
   629
	  return NULL;
aschiffler@6711
   630
        }
aschiffler@6711
   631
aschiffler@6711
   632
	for(counter = 0; counter < size; ++counter) {
aschiffler@6760
   633
		string[counter] = (char)SDLTest_RandomIntegerInRange(32, 126);
aschiffler@6711
   634
	}
aschiffler@6711
   635
aschiffler@6711
   636
	string[counter] = '\0';
aschiffler@6711
   637
aschiffler@6711
   638
	return string;
aschiffler@6711
   639
}