mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Overflows in conversions from floating-point to integer are undefined behavior in the C99 standard. (Clause 6.3.1.4: "If the value of the integral part cannot be represented by the integer type, the behavior is undefined.") When UBSAN is enabled, this gets reported at `srand()` calls. (The random seed is usually initialized using the date port API, which represents dates as `double`s. But `srand` takes an `unsigned int`. A simple cast from `double` to `unsigned` becomes undefined behavior if the value is too large. And "now" is too large nowadays. So, effectively, all executions start with an undefined behavior.) This patch fixes this by casting the floating-point value of the date to an integer through a union. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
/* Copyright JS Foundation and other contributors, http://js.foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef TEST_COMMON_H
|
|
#define TEST_COMMON_H
|
|
|
|
#include "jerryscript-port.h"
|
|
|
|
#include <math.h>
|
|
#include <setjmp.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#define JERRY_UNUSED(x) ((void) (x))
|
|
|
|
#define TEST_ASSERT(x) \
|
|
do \
|
|
{ \
|
|
if (JERRY_UNLIKELY (!(x))) \
|
|
{ \
|
|
jerry_port_log (JERRY_LOG_LEVEL_ERROR, \
|
|
"TEST: Assertion '%s' failed at %s(%s):%lu.\n", \
|
|
#x, \
|
|
__FILE__, \
|
|
__func__, \
|
|
(unsigned long) __LINE__); \
|
|
jerry_port_fatal (ERR_FAILED_INTERNAL_ASSERTION); \
|
|
} \
|
|
} while (0)
|
|
|
|
/**
|
|
* Test initialization statement that should be included
|
|
* at the beginning of main function in every unit test.
|
|
*/
|
|
#define TEST_INIT() \
|
|
do \
|
|
{ \
|
|
union { double d; unsigned u; } now = { .d = jerry_port_get_current_time () }; \
|
|
srand (now.u); \
|
|
} while (0)
|
|
|
|
/**
|
|
* Dummy macro to enable the breaking of long string literals into multiple
|
|
* substrings on separate lines. (Style checker doesn't allow it without putting
|
|
* the whole literal into parentheses but the compiler warns about parenthesized
|
|
* string constants.)
|
|
*/
|
|
#define TEST_STRING_LITERAL(x) x
|
|
|
|
#endif /* !TEST_COMMON_H */
|