C/C++ android 11 代码在 strstr api 调用时崩溃
C/C++ android 11 code crash at strstr api call
我在 strstr 下方 api 调用崩溃:
pid: 6640, tid: 6640, name: demoapp >>> /vendor/bin/demoapp <<<
uid: 0
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7b8a91c000
x0 b400007b8a91bf70 x1 0000000000000000 x2 000000000000002f x3 b400007b8a91c000
x4 0000000000000020 x5 0000000040100401 x6 0000000000000000 x7 454349564544200a
x8 0000000000000074 x9 0000000000000010 x10 000000000000001f x11 000000000000003a
x12 000000000000008d x13 000000000000006a x14 00000000000000b5 x15 000000000000000a
x16 0000007e7abd20e8 x17 0000007e7ab5e100 x18 0000007e7b35a000 x19 b400007b8a91befc
x20 0000007fc35ae0b8 x21 0000007fc35add00 x22 00000000000000bf x23 b400007b8a91bf70
x24 0000007e7ae41000 x25 00000000000000b5 x26 00000000000000b4 x27 00000000000000b5
x28 0000007fc35ae146 x29 0000007fc35add30
lr 0000007e7aba9cc0 sp 0000007fc35ad4d0 pc 0000007e7ab5e160 pst 0000000020000000
backtrace:
#00 pc 000000000004a160 /apex/com.android.runtime/lib64/bionic/libc.so (memchr_default+96) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
#01 pc 0000000000095cbc /apex/com.android.runtime/lib64/bionic/libc.so (strstr+804) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
#02 pc 0000000000002714 /vendor/bin/demoapp (main+1740) (BuildId: 5f1858d36b95111200fa67ca2c2aefee)
#03 pc 0000000000049080 /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+108) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
代码崩溃解析如下:
bionic/libc/arch-arm64/default/bionic/memchr.S::114
109 b.ls .Lmasklast
110 /* Have we found something already? */
111 cbnz synd, .Ltail
112
113 .Lloop:
114 ld1 {vdata1.16b, vdata2.16b}, [src], #32
115 subs cntin, cntin, #32
116 cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b
117 cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b
118 /* If we're out of data we finish regardless of the result */
119 b.ls .Lend
bionic/libc/include/bits/fortify/string.h::138
133 __BIONIC_FORTIFY_INLINE
134 void* memchr(const void* const s __pass_object_size, int c, size_t n) __overloadable {
135 size_t bos = __bos(s);
136
137 if (__bos_trivially_ge(bos, n)) {
138 return __builtin_memchr(s, c, n);
139 }
140
141 return __memchr_chk(s, c, n, bos);
142 }
143
bionic/libc/upstream-openbsd/lib/libc/string/strstr.c::139
134 for (;;) {
135 /* Update incremental end-of-haystack pointer */
136 if (z-h < l) {
137 /* Fast estimate for MIN(l,63) */
138 size_t grow = l | 63;
139 const unsigned char *z2 = memchr(z, 0, grow);
140 if (z2) {
141 z = z2;
142 if (z-h < l) return 0;
143 } else z += grow;
144 }
bionic/libc/upstream-openbsd/lib/libc/string/strstr.c::195
190 if (!h[2]) return 0;
191 if (!n[3]) return threebyte_strstr((void *)h, (void *)n);
192 if (!h[3]) return 0;
193 if (!n[4]) return fourbyte_strstr((void *)h, (void *)n);
194
195 return twoway_strstr((void *)h, (void *)n);
196 }
197 DEF_STRONG(strstr);
vendor/source/demoapp.c::37
37 bool ok = (bool)strstr(srcstr, deststr);
看起来 srcstr 和 deststr 都不为 NULL。由于issue不易复现,只能分析stack来寻找线索!
如果不是 NULL 指针问题,那么任何其他原因都可能导致 strstr 崩溃?
函数 strstr()
崩溃的最常见原因是:
- 如果提供的
char*
之一是 nullptr
,
- 如果提供的
char*
之一指向没有 '[=14=]'
终止符的字符串。
- 如果提供的
char*
之一发生缓冲区溢出。
还有很多其他可能的原因。如果这没有帮助,请提供出现问题的代码。
我在 strstr 下方 api 调用崩溃:
pid: 6640, tid: 6640, name: demoapp >>> /vendor/bin/demoapp <<<
uid: 0
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7b8a91c000
x0 b400007b8a91bf70 x1 0000000000000000 x2 000000000000002f x3 b400007b8a91c000
x4 0000000000000020 x5 0000000040100401 x6 0000000000000000 x7 454349564544200a
x8 0000000000000074 x9 0000000000000010 x10 000000000000001f x11 000000000000003a
x12 000000000000008d x13 000000000000006a x14 00000000000000b5 x15 000000000000000a
x16 0000007e7abd20e8 x17 0000007e7ab5e100 x18 0000007e7b35a000 x19 b400007b8a91befc
x20 0000007fc35ae0b8 x21 0000007fc35add00 x22 00000000000000bf x23 b400007b8a91bf70
x24 0000007e7ae41000 x25 00000000000000b5 x26 00000000000000b4 x27 00000000000000b5
x28 0000007fc35ae146 x29 0000007fc35add30
lr 0000007e7aba9cc0 sp 0000007fc35ad4d0 pc 0000007e7ab5e160 pst 0000000020000000
backtrace:
#00 pc 000000000004a160 /apex/com.android.runtime/lib64/bionic/libc.so (memchr_default+96) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
#01 pc 0000000000095cbc /apex/com.android.runtime/lib64/bionic/libc.so (strstr+804) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
#02 pc 0000000000002714 /vendor/bin/demoapp (main+1740) (BuildId: 5f1858d36b95111200fa67ca2c2aefee)
#03 pc 0000000000049080 /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+108) (BuildId: 229c19d159f619ab0dd102acf1afb05f)
代码崩溃解析如下:
bionic/libc/arch-arm64/default/bionic/memchr.S::114
109 b.ls .Lmasklast
110 /* Have we found something already? */
111 cbnz synd, .Ltail
112
113 .Lloop:
114 ld1 {vdata1.16b, vdata2.16b}, [src], #32
115 subs cntin, cntin, #32
116 cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b
117 cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b
118 /* If we're out of data we finish regardless of the result */
119 b.ls .Lend
bionic/libc/include/bits/fortify/string.h::138
133 __BIONIC_FORTIFY_INLINE
134 void* memchr(const void* const s __pass_object_size, int c, size_t n) __overloadable {
135 size_t bos = __bos(s);
136
137 if (__bos_trivially_ge(bos, n)) {
138 return __builtin_memchr(s, c, n);
139 }
140
141 return __memchr_chk(s, c, n, bos);
142 }
143
bionic/libc/upstream-openbsd/lib/libc/string/strstr.c::139
134 for (;;) {
135 /* Update incremental end-of-haystack pointer */
136 if (z-h < l) {
137 /* Fast estimate for MIN(l,63) */
138 size_t grow = l | 63;
139 const unsigned char *z2 = memchr(z, 0, grow);
140 if (z2) {
141 z = z2;
142 if (z-h < l) return 0;
143 } else z += grow;
144 }
bionic/libc/upstream-openbsd/lib/libc/string/strstr.c::195
190 if (!h[2]) return 0;
191 if (!n[3]) return threebyte_strstr((void *)h, (void *)n);
192 if (!h[3]) return 0;
193 if (!n[4]) return fourbyte_strstr((void *)h, (void *)n);
194
195 return twoway_strstr((void *)h, (void *)n);
196 }
197 DEF_STRONG(strstr);
vendor/source/demoapp.c::37
37 bool ok = (bool)strstr(srcstr, deststr);
看起来 srcstr 和 deststr 都不为 NULL。由于issue不易复现,只能分析stack来寻找线索!
如果不是 NULL 指针问题,那么任何其他原因都可能导致 strstr 崩溃?
函数 strstr()
崩溃的最常见原因是:
- 如果提供的
char*
之一是nullptr
, - 如果提供的
char*
之一指向没有'[=14=]'
终止符的字符串。 - 如果提供的
char*
之一发生缓冲区溢出。
还有很多其他可能的原因。如果这没有帮助,请提供出现问题的代码。