Android 你什么时候打电话来的?

Android 你什么时候打电话来的?,android,c++,android-source,android-runtime,Android,C++,Android Source,Android Runtime,作为我项目的一部分,我尝试在android art中编写一个特性,出于某种原因,我在android art上遇到了一个例外 __斯特伦丘克 我的追踪是: DEBUG : Revision: '0' DEBUG : ABI: 'arm' DEBUG : pid: 969, tid: 1346, name: PackageManager >>> system_server <<< DEBUG : signal 11 (SIGSEGV), code

作为我项目的一部分,我尝试在android art中编写一个特性,出于某种原因,我在android art上遇到了一个例外 __斯特伦丘克

我的追踪是:

DEBUG   : Revision: '0'
DEBUG   : ABI: 'arm'
DEBUG   : pid: 969, tid: 1346, name: PackageManager  >>> system_server <<<
DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
DEBUG   :     r0 00000000  r1 00000000  r2 80808080  r3 8f005a30
DEBUG   :     r4 00000000  r5 8f005a4b  r6 0000000a  r7 0000002f
DEBUG   :     r8 ac6add18  r9 0000002f  sl 975f4e20  fp 0000002f
DEBUG   :     ip 00000000  sp 975f4d48  lr ac7fda91  pc ac7c7198  cpsr 40000030
DEBUG   :
DEBUG   : backtrace:
DEBUG   :     #00 pc 00018198  /system/lib/libc.so (strlen+47)
DEBUG   :     #01 pc 0004ea8d  /system/lib/libc.so (__strlen_chk+4)
DEBUG   :     #02 pc 00377bb7  /system/lib/libart.so (my_identifier1+186)
DEBUG   :     #03 pc 000b539f  /system/lib/libart.so (my_art_secret+178)
DEBUG   :     #04 pc 001294b9  /system/lib/libart.so (my_art_secret2+348)
DEBUG   :     #05 pc 002ca3e9  /system/lib/libart.so (my_art_secret3+72)
DEBUG   :     #06 pc 002c7d55  /system/lib/libart.so (my_art_secret4+352)
DEBUG   :     #07 pc 002a3589  /system/lib/libart.so (my_art_secret5+264)
但是为了真正理解我的问题, 我想知道strlen chk是用来做什么的, 它什么时候来的

这是我在网上找到的他的代码:

size_t __strlen_chk(const char *s, size_t s_len)
{
    size_t ret = strlen(s);
    if (__builtin_expect(ret >= s_len, 0)) {
        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
            "*** strlen read overflow detected ***\n");
        abort();
    }
    return ret;
}
它似乎在检查缓冲区溢出,但何时调用

很抱歉,我的代码有误,这是出于隐私原因


谢谢

\uu strlen\u chk
使用双下划线,表示库的内部部分。从上下文来看,很明显它是从
std::string::string(const char*src)
调用的


现在这是一个构造函数,它接受以null结尾的字符串作为输入。但是
nullptr
不是以null结尾的。事实上,它根本不指向任何字符,因此它甚至没有字符串长度。

sss参数表示大小是多少?大小是否大于
str
的大小?是的,它与str大小无关,也可以是0。好的,我猜问题是因为
std::string secret=nullptr行,因为当我用
std::string secret替换它时异常消失。现在我猜uu strlen_chk调用了std::string copy c'tor或赋值操作符。问题解决了,但当它打电话给斯特伦时,我没有答案。
size_t __strlen_chk(const char *s, size_t s_len)
{
    size_t ret = strlen(s);
    if (__builtin_expect(ret >= s_len, 0)) {
        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
            "*** strlen read overflow detected ***\n");
        abort();
    }
    return ret;
}