Skip to content

Commit b383817

Browse files
committed
Remove undefined behaviors
1 parent 4864565 commit b383817

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+756
-1302
lines changed

libc/fmt/fmt.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ hidden int __fmt(void *fn, void *arg, const char *format, va_list va) {
612612
if (pun.d && prec < 13) {
613613
pun.u[1] |= 0x100000;
614614
if (prec < 5) {
615-
ui = 1 << ((5 - prec) * 4 - 1);
615+
ui = 1u << ((5 - prec) * 4 - 1);
616616
if (pun.u[1] & ui) {
617617
if (pun.u[1] & ((ui - 1) | (ui << 1)) || pun.u[0]) {
618618
pun.u[1] += ui;
@@ -631,7 +631,7 @@ hidden int __fmt(void *fn, void *arg, const char *format, va_list va) {
631631
}
632632
} else {
633633
i1 = (13 - prec) * 4;
634-
ui = 1 << (i1 - 1);
634+
ui = 1u << (i1 - 1);
635635
if (pun.u[0] & ui && pun.u[0] & ((ui - 1) | (ui << 1))) {
636636
pun.u[0] += ui;
637637
if (!(pun.u[0] >> i1)) goto BumpIt;
@@ -640,12 +640,13 @@ hidden int __fmt(void *fn, void *arg, const char *format, va_list va) {
640640
}
641641
} else {
642642
if ((ui = pun.u[0])) {
643-
for (prec = 6; (ui = (ui << 4) & 0xffffffff); ++prec) {
644-
}
643+
ui = __builtin_ctz(ui);
644+
prec = 6 + ((32 - ROUNDDOWN(ui, 4)) >> 2) - 1;
645+
} else if ((ui = pun.u[1] & 0xfffff)) {
646+
ui = __builtin_ctz(ui);
647+
prec = (20 - ROUNDDOWN(ui, 4)) >> 2;
645648
} else {
646-
for (prec = 0, ui = pun.u[1] & 0xfffff; ui;
647-
++prec, ui = (ui << 4) & 0xfffff) {
648-
}
649+
prec = 0;
649650
}
650651
}
651652
bw = 1;

libc/fmt/fmt.mk

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,6 @@ o/$(MODE)/libc/fmt/filetimetotimeval.o: \
6868
OVERRIDE_CFLAGS += \
6969
-O3
7070

71-
o/$(MODE)/libc/fmt/itoa64radix10.greg.o \
72-
o/$(MODE)/libc/fmt/itoa128radix10.greg.o: \
73-
OVERRIDE_CFLAGS += \
74-
-fwrapv
75-
7671
LIBC_FMT_LIBS = $(foreach x,$(LIBC_FMT_ARTIFACTS),$($(x)))
7772
LIBC_FMT_SRCS = $(foreach x,$(LIBC_FMT_ARTIFACTS),$($(x)_SRCS))
7873
LIBC_FMT_HDRS = $(foreach x,$(LIBC_FMT_ARTIFACTS),$($(x)_HDRS))

libc/fmt/itoa128radix10.greg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@ noinline size_t uint128toarray_radix10(uint128_t i, char *a) {
4949
size_t int128toarray_radix10(int128_t i, char *a) {
5050
if (i >= 0) return uint128toarray_radix10(i, a);
5151
*a++ = '-';
52-
return 1 + uint128toarray_radix10(-i, a);
52+
return 1 + uint128toarray_radix10(-(uint128_t)i, a);
5353
}

libc/fmt/itoa64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ noinline size_t uint64toarray(uint64_t i, char *a, int r) {
3535
size_t int64toarray(int64_t i, char *a, int r) {
3636
if (i < 0) {
3737
*a++ = '-';
38-
i = -i;
38+
i = -(uint64_t)i;
3939
}
4040
return uint64toarray(i, a, r);
4141
}

libc/fmt/itoa64radix10.greg.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,10 @@
2727
* @return bytes written w/o nul
2828
*/
2929
noinline size_t uint64toarray_radix10(uint64_t i, char a[hasatleast 21]) {
30-
size_t j;
31-
j = 0;
30+
size_t j = 0;
3231
do {
33-
struct {
34-
uint64_t q, r;
35-
} x = {i / 10, i % 10};
36-
a[j++] = x.r + '0';
37-
i = x.q;
32+
a[j++] = i % 10 + '0';
33+
i = i / 10;
3834
} while (i > 0);
3935
a[j] = '\0';
4036
reverse(a, j);
@@ -49,5 +45,5 @@ noinline size_t uint64toarray_radix10(uint64_t i, char a[hasatleast 21]) {
4945
size_t int64toarray_radix10(int64_t i, char a[hasatleast 21]) {
5046
if (i >= 0) return uint64toarray_radix10(i, a);
5147
*a++ = '-';
52-
return 1 + uint64toarray_radix10(-i, a);
48+
return 1 + uint64toarray_radix10(-(uint64_t)i, a);
5349
}

libc/integral/c.inc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,13 @@ typedef uint64_t uintmax_t;
584584
#define noasan
585585
#endif
586586

587+
#if (__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 408 || \
588+
__has_attribute(__no_sanitize_undefined__)
589+
#define noubsan __attribute__((__no_sanitize_undefined__))
590+
#else
591+
#define noubsan
592+
#endif
593+
587594
#ifndef unreachable
588595
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
589596
#define unreachable __builtin_unreachable()

libc/intrin/asan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ static void *__asan_memset(void *p, int c, size_t n) {
169169
size_t i;
170170
uint64_t x;
171171
b = p;
172-
x = 0x0101010101010101 * (c & 255);
172+
x = 0x0101010101010101ul * (c & 255);
173173
switch (n) {
174174
case 0:
175175
return p;

libc/intrin/intrin.mk

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,11 @@ $(LIBC_INTRIN_A).pkg: \
4141
$(LIBC_INTRIN_A_OBJS) \
4242
$(foreach x,$(LIBC_INTRIN_A_DIRECTDEPS),$($(x)_A).pkg)
4343

44-
$(LIBC_INTRIN_A_OBJS): \
45-
OVERRIDE_CFLAGS += \
46-
$(NO_MAGIC) \
47-
-O3
48-
49-
o/$(MODE)/libc/intrin/asan.o: \
44+
o/$(MODE)/libc/intrin/asan.o \
45+
o/$(MODE)/libc/intrin/ubsan.o: \
5046
OVERRIDE_CFLAGS += \
47+
-fno-sanitize=all \
48+
-fno-stack-protector \
5149
-mgeneral-regs-only \
5250
-O2
5351

libc/intrin/pabsd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void(pabsd)(uint32_t a[4], const int32_t b[4]) {
2828
unsigned i;
2929
uint32_t r[4];
3030
for (i = 0; i < 4; ++i) {
31-
r[i] = ABS(b[i]);
31+
r[i] = b[i] >= 0 ? b[i] : -(uint32_t)b[i];
3232
}
3333
memcpy(a, r, 16);
3434
}

libc/intrin/paddd.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
* @param 𝑐 [r/o] supplies second input vector
2828
* @mayalias
2929
*/
30-
void(paddd)(int32_t a[4], const int32_t b[4], const int32_t c[4]) {
30+
void(paddd)(uint32_t a[4], const uint32_t b[4], const uint32_t c[4]) {
3131
unsigned i;
32-
int32_t r[4];
33-
for (i = 0; i < 4; ++i) r[i] = b[i] + c[i];
32+
uint32_t r[4];
33+
for (i = 0; i < 4; ++i) {
34+
r[i] = b[i] + c[i];
35+
}
3436
memcpy(a, r, 16);
3537
}

0 commit comments

Comments
 (0)