Когда звонил __strlen_chk? - PullRequest
0 голосов
/ 05 мая 2020

как часть моего проекта, я пытаюсь написать функцию внутри android art, и по какой-то причине я получаю исключение для __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, и когда он вызывается?

это его код, который я find на net:

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;
}

кажется, что он проверяет переполнение буфера, но когда он вызвал?

извините за мой закрытый код, это из соображений конфиденциальности.

Спасибо!

1 Ответ

1 голос
/ 05 мая 2020

__strlen_chk использует двойное подчеркивание, которое указывает на внутреннюю часть библиотеки. Из контекста ясно, что он вызван из std::string::string(const char* src).

Теперь это конструктор, который принимает на вход строку с завершающим нулем. Но nullptr не заканчивается нулем. Фактически, он вообще не указывает на какой-либо символ, и поэтому даже не имеет длины строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...