1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-08 17:59:55 +00:00

Fix some -fsanitize=undefined behavior for #1475

Also fix issue with os/clock and default values that were incorrect.
The api shold have been a little nicer here to prevent this issue.
This commit is contained in:
Calvin Rose 2024-07-17 08:50:02 -05:00
parent ecc4da5113
commit 771956b5b6
3 changed files with 10 additions and 10 deletions

View File

@ -140,7 +140,7 @@ void janet_bytecode_remove_noops(JanetFuncDef *def) {
/* relative pc is in DS field of instruction */ /* relative pc is in DS field of instruction */
old_jump_target = i + (((int32_t)instr) >> 8); old_jump_target = i + (((int32_t)instr) >> 8);
new_jump_target = pc_map[old_jump_target]; new_jump_target = pc_map[old_jump_target];
instr += (new_jump_target - old_jump_target + (i - j)) << 8; instr += (uint32_t)(new_jump_target - old_jump_target + (i - j)) << 8;
break; break;
case JOP_JUMP_IF: case JOP_JUMP_IF:
case JOP_JUMP_IF_NIL: case JOP_JUMP_IF_NIL:
@ -149,7 +149,7 @@ void janet_bytecode_remove_noops(JanetFuncDef *def) {
/* relative pc is in ES field of instruction */ /* relative pc is in ES field of instruction */
old_jump_target = i + (((int32_t)instr) >> 16); old_jump_target = i + (((int32_t)instr) >> 16);
new_jump_target = pc_map[old_jump_target]; new_jump_target = pc_map[old_jump_target];
instr += (new_jump_target - old_jump_target + (i - j)) << 16; instr += (uint32_t)(new_jump_target - old_jump_target + (i - j)) << 16;
break; break;
default: default:
break; break;

View File

@ -85,10 +85,10 @@ void janet_rng_longseed(JanetRNG *rng, const uint8_t *bytes, int32_t len) {
uint8_t state[16] = {0}; uint8_t state[16] = {0};
for (int32_t i = 0; i < len; i++) for (int32_t i = 0; i < len; i++)
state[i & 0xF] ^= bytes[i]; state[i & 0xF] ^= bytes[i];
rng->a = state[0] + (state[1] << 8) + (state[2] << 16) + (state[3] << 24); rng->a = state[0] + ((uint32_t) state[1] << 8) + ((uint32_t) state[2] << 16) + ((uint32_t) state[3] << 24);
rng->b = state[4] + (state[5] << 8) + (state[6] << 16) + (state[7] << 24); rng->b = state[4] + ((uint32_t) state[5] << 8) + ((uint32_t) state[6] << 16) + ((uint32_t) state[7] << 24);
rng->c = state[8] + (state[9] << 8) + (state[10] << 16) + (state[11] << 24); rng->c = state[8] + ((uint32_t) state[9] << 8) + ((uint32_t) state[10] << 16) + ((uint32_t) state[11] << 24);
rng->d = state[12] + (state[13] << 8) + (state[14] << 16) + (state[15] << 24); rng->d = state[12] + ((uint32_t) state[13] << 8) + ((uint32_t) state[14] << 16) + ((uint32_t) state[15] << 24);
rng->counter = 0u; rng->counter = 0u;
/* a, b, c, d can't all be 0 */ /* a, b, c, d can't all be 0 */
if (rng->a == 0) rng->a = 1u; if (rng->a == 0) rng->a = 1u;

View File

@ -1582,8 +1582,8 @@ JANET_CORE_FN(os_clock,
janet_sandbox_assert(JANET_SANDBOX_HRTIME); janet_sandbox_assert(JANET_SANDBOX_HRTIME);
janet_arity(argc, 0, 2); janet_arity(argc, 0, 2);
JanetKeyword sourcestr = janet_optkeyword(argv, argc, 0, (const uint8_t *) "realtime"); JanetKeyword sourcestr = janet_optkeyword(argv, argc, 0, NULL);
if (janet_cstrcmp(sourcestr, "realtime") == 0) { if (sourcestr == NULL || janet_cstrcmp(sourcestr, "realtime") == 0) {
source = JANET_TIME_REALTIME; source = JANET_TIME_REALTIME;
} else if (janet_cstrcmp(sourcestr, "monotonic") == 0) { } else if (janet_cstrcmp(sourcestr, "monotonic") == 0) {
source = JANET_TIME_MONOTONIC; source = JANET_TIME_MONOTONIC;
@ -1596,8 +1596,8 @@ JANET_CORE_FN(os_clock,
struct timespec tv; struct timespec tv;
if (janet_gettime(&tv, source)) janet_panic("could not get time"); if (janet_gettime(&tv, source)) janet_panic("could not get time");
JanetKeyword formatstr = janet_optkeyword(argv, argc, 1, (const uint8_t *) "double"); JanetKeyword formatstr = janet_optkeyword(argv, argc, 1, NULL);
if (janet_cstrcmp(formatstr, "double") == 0) { if (formatstr == NULL || janet_cstrcmp(formatstr, "double") == 0) {
double dtime = (double)(tv.tv_sec + (tv.tv_nsec / 1E9)); double dtime = (double)(tv.tv_sec + (tv.tv_nsec / 1E9));
return janet_wrap_number(dtime); return janet_wrap_number(dtime);
} else if (janet_cstrcmp(formatstr, "int") == 0) { } else if (janet_cstrcmp(formatstr, "int") == 0) {