Better random number generation in selftest

This commit is contained in:
Joseph Henry
2021-03-16 18:02:13 -07:00
parent 04c965f0e5
commit ab32a827a4

View File

@@ -7,14 +7,30 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <ZeroTierSockets.h> #include <ZeroTierSockets.h>
#pragma GCC diagnostic ignored "-Wunused-value" #pragma GCC diagnostic ignored "-Wunused-value"
int random32() {
const int BITS_PER_RAND = (int)(log2(RAND_MAX/2 + 1) + 1.0);
int ret = 0;
for (int i = 0; i < sizeof(int) * CHAR_BIT; i += BITS_PER_RAND) {
ret <<= BITS_PER_RAND;
ret |= rand();
}
return ret;
}
uint64_t random64() {
return ((uint64_t)random32() << 32) | random32();
}
void api_value_arg_test(int8_t i8, int16_t i16, int32_t i32, int64_t i64, void* nullable) void api_value_arg_test(int8_t i8, int16_t i16, int32_t i32, int64_t i64, void* nullable)
{ {
//fprintf(stderr, "%d, %d, %d, %d, %p\n", i8, i16, i32, i64, nullable); //fprintf(stderr, "%d, %d, %d, %lld, %p\n", i8, i16, i32, i64, nullable);
int res = ZTS_ERR_OK; int res = ZTS_ERR_OK;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -141,8 +157,6 @@ void api_value_arg_test(int8_t i8, int16_t i16, int32_t i32, int64_t i64, void*
res == ZTS_ERR_SERVICE)); res == ZTS_ERR_SERVICE));
} }
#include <limits.h>
int main() int main()
{ {
srand(time(NULL)); srand(time(NULL));
@@ -155,11 +169,11 @@ int main()
api_value_arg_test(0,0,0,0,NULL); api_value_arg_test(0,0,0,0,NULL);
// Test wild values // Test wild values
for (int i=0; i<100; i++) { for (int i=0; i<1024; i++) {
int8_t i8 = rand() % (SCHAR_MAX + 1 - SCHAR_MIN) + SCHAR_MIN; int8_t i8 = (uint8_t)random64();
int16_t i16 = rand() % ( SHRT_MAX + 1 - SHRT_MIN) + SHRT_MIN; int16_t i16 = (uint16_t)random64();
int32_t i32 = rand() % ( INT_MAX + 1 - INT_MIN) + INT_MIN; int32_t i32 = (uint32_t)random64();
int64_t i64 = rand() % ( LONG_MAX + 1 - LONG_MIN) + LONG_MIN; int64_t i64 = (uint64_t)random64();
int x; int x;
void* nullable = &x; void* nullable = &x;
api_value_arg_test(i8,i16,i32,i64,nullable); api_value_arg_test(i8,i16,i32,i64,nullable);