فهرست منبع

fix aliasing violations in mbtowc and mbrtowc

these functions were setting wc to point to wchar_t aliasing itself as
a "cheap" way to support null wc arguments. doing so was anything but
cheap, since even without the aliasing violation, it would limit the
compiler's ability to optimize.

making wc point to a dummy object is equally easy and does not suffer
from the above problems.

(cherry picked from commit e89cfe51d2001af08fc2a13e5133ba8157f90beb)
Rich Felker 10 سال پیش
والد
کامیت
726df5a8bc
2فایلهای تغییر یافته به همراه4 افزوده شده و 2 حذف شده
  1. 2 1
      src/multibyte/mbrtowc.c
  2. 2 1
      src/multibyte/mbtowc.c

+ 2 - 1
src/multibyte/mbrtowc.c

@@ -14,6 +14,7 @@ size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate
 	unsigned c;
 	const unsigned char *s = (const void *)src;
 	const unsigned N = n;
+	wchar_t dummy;
 
 	if (!st) st = (void *)&internal_state;
 	c = *(unsigned *)st;
@@ -21,7 +22,7 @@ size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate
 	if (!s) {
 		if (c) goto ilseq;
 		return 0;
-	} else if (!wc) wc = (void *)&wc;
+	} else if (!wc) wc = &dummy;
 
 	if (!n) return -2;
 	if (!c) {

+ 2 - 1
src/multibyte/mbtowc.c

@@ -12,10 +12,11 @@ int mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n)
 {
 	unsigned c;
 	const unsigned char *s = (const void *)src;
+	wchar_t dummy;
 
 	if (!s) return 0;
 	if (!n) goto ilseq;
-	if (!wc) wc = (void *)&wc;
+	if (!wc) wc = &dummy;
 
 	if (*s < 0x80) return !!(*wc = *s);
 	if (*s-SA > SB-SA) goto ilseq;