__strlen_chk 什么时候调用?
When __strlen_chk called?
作为我项目的一部分,我尝试在 android 艺术中编写一个功能,但出于某种原因我在
__strlen_chk
我的踪迹是:
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)
我的代码看起来像这样:
void my_identifier1(const uint8_t* bbbb, size_t sss, const std::string& str) {
std::string error_msg;
std::string secret = nullptr;
if (!str.empty() && !this_my_problem(str, sss)) {
error_msg = StringPrintf("secret '%s' secret:%zu", str.empty()? "secret secret" : str.c_str(), sss);
return;
}
}
但是为了真正理解我的问题,
我想知道 __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;
}
好像是在检查缓冲区溢出,但是什么时候调用的?
抱歉,我的代码被破坏了,这是出于隐私原因。
谢谢!
__strlen_chk
使用双下划线,表示库的内部部分。从上下文来看,很明显它是从 std::string::string(const char* src)
调用的。
现在这是一个构造函数,它将以 null 结尾的字符串作为输入。但是 nullptr
不是空终止的。事实上,它根本不指向任何字符,因此它甚至 没有 字符串长度。
作为我项目的一部分,我尝试在 android 艺术中编写一个功能,但出于某种原因我在 __strlen_chk
我的踪迹是:
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)
我的代码看起来像这样:
void my_identifier1(const uint8_t* bbbb, size_t sss, const std::string& str) {
std::string error_msg;
std::string secret = nullptr;
if (!str.empty() && !this_my_problem(str, sss)) {
error_msg = StringPrintf("secret '%s' secret:%zu", str.empty()? "secret secret" : str.c_str(), sss);
return;
}
}
但是为了真正理解我的问题, 我想知道 __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;
}
好像是在检查缓冲区溢出,但是什么时候调用的?
抱歉,我的代码被破坏了,这是出于隐私原因。
谢谢!
__strlen_chk
使用双下划线,表示库的内部部分。从上下文来看,很明显它是从 std::string::string(const char* src)
调用的。
现在这是一个构造函数,它将以 null 结尾的字符串作为输入。但是 nullptr
不是空终止的。事实上,它根本不指向任何字符,因此它甚至 没有 字符串长度。