Dasturiy ta'minot

Android 17 Da Android 17 Da wcscspn() va wcspbrk() Xatolari

14-oktabr, 2026, 12:041 ko'rish3 daqiqa o'qish
Android 17 Da Android 17 Da wcscspn() va wcspbrk() Xatolari

Android 17 da wcscspn() va wcspbrk() funksiyalarida muhim xatolar aniqlangan. Bu xatolar emoji, CJK, Kirill, Yunon va Lotin harflarini o'z ichiga olgan matnlarni to'g'ri ishlatishni buzadi. Bu xatolar 2026-yil sentyabr oyida chiqarilgan Android 17 versiyasida paydo bo'lgan.

Xatolarning tabiati

wcscspn() va wcspbrk() funksiyalarida xatolar matnning birinchi harfini to'g'ri tahlil qilmaydi. Agar matnning biror qismi emoji, CJK, Kirill, Yunon yoki Lotin harflarini o'z ichiga olsa, funksiyalar bu harflarni noto'g'ri tahlil qiladi. Bu xatolar matnlarni to'g'ri ishlatishni buzadi va dasturlarning ishini buzilishi mumkin.

#include <stdio.h>
#include <wchar.h>

int main(void)
{
    wchar_t s[] = {'a', 0x1F680, 0x100, 'b', 'x', '\n', 0};
    printf("wcscspn(s, L\"x\\n\") = %zu (expected 4)\n", wcscspn(s, L"x\n"));
    printf("wcspbrk(s, L\"x\\n\") = index %ld (expected 4)\n", (long)(wcspbrk(s, L"x\n") - s));
    printf("wcsspn(s, L\"a\\U0001F680\") = %zu (expected 2)\n", wcsspn(s, L"a\U0001F680"));
    return 0;
}

Qanday aniqlangan?

Xatolar dasturchilar tomonidan disassemble qilish orqali aniqlangan. Dasturchilar wcscspn() va wcspbrk() funksiyalarini disassemble qilish orqali bu xatolarni aniqlashgan. Bu xatolar 2026-yil iyun oyida chiqarilgan Android 17 versiyasida mavjud emas edi, ammo 2026-yil sentyabr oyida chiqarilgan versiyada paydo bo'lgan.

wcscspn(s, L"x\n") = 1 (expected 4)
wcspbrk(s, L"x\n") = index 1 (expected 4)
wcsspn(s, L"a\U0001F680") = 2 (expected 2)

Ta'siri

Bu xatolar bir nechta dasturlarning ishini buzilishi mumkin. Masalan, Visual Pinball dasturi Android 17 versiyasida emoji harflarni o'z ichiga olgan matnlarni to'g'ri ishlatishni buzilishi mumkin. Bundan tashqari, FileSystem.MoveFolder funksiyasi ham bu xatolar tufayli ishini buzilishi mumkin.

a2564:  ldrb  w8, [x9, x8]        ; table[c]
a2568:  tbnz  w8, #0, a2578       ; in set -> stop (correct)
a256c:  ldr   w8, [x22, #0x4]!    ; next character
a2570:  cmp   w8, #0x100
a2574:  b.lo  a2564               ; c < 0x100 -> keep scanning
a2578:  ...                       ; c >= 0x100 -> STOP, reported as a match

Qanday hal qilinadi?

Xatolarni hal qilish uchun dasturchilar wcscspn() va wcspbrk() funksiyalarini to'g'ri ishlatish uchun yangi kod yozishgan. Bundan tashqari, dasturchilar bu xatolarni oldini olish uchun yangi testlarni qo'shishgan. Bu testlar wcscspn() va wcspbrk() funksiyalarini to'g'ri ishlatishini ta'minlaydi.

__attribute__((__flatten__))
wchar_t* wcspbrk(const wchar_t* s, const wchar_t* delims) {
  size_t i = wcscspn(s, delims);
  if (s[i] != L'\0') return const_cast<wchar_t*>(s) + i;
  return nullptr;
}

Bu xatolarni hal qilish uchun dasturchilar Android 17 versiyasining yangi yangilanishini chiqarishni rejalashtirganlar. Bu yangilanish xatolarni to'liq hal qilishini ta'minlaydi va dasturlarning ishini to'g'ri ishlatishini ta'minlaydi.

[ RUN      ] wchar.wcscspn
bionic/tests/wchar_test.cpp:(1475) Failure in test wchar.wcscspn
Expected equality of these values:
  2u
    Which is: 2
  wcscspn(L"he\ufffelo", L"lo")
    Which is: 3
wchar.wcscspn exited with exitcode 1.

Xulosa

Android 17 da wcscspn() va wcspbrk() funksiyalarida muhim xatolar aniqlangan. Bu xatolar emoji, CJK, Kirill, Yunon va Lotin harflarini o'z ichiga olgan matnlarni to'g'ri ishlatishni buzadi. Dasturchilar bu xatolarni aniqlashgan va ularni hal qilish uchun yangi kod yozishgan. Bundan tashqari, dasturchilar bu xatolarni oldini olish uchun yangi testlarni qo'shishgan. Bu yangilanish xatolarni to'liq hal qilishini ta'minlaydi va dasturlarning ishini to'g'ri ishlatishini ta'minlaydi.

Asl manba: github.com

Manba: Hacker News
#Android #wcscspn #wcspbrk #xatolar #yangilanish
Telegram da muhokama qilish