ASAN выдает ошибку «обнаружение повреждения стека» в операторе throw - PullRequest
0 голосов
/ 26 октября 2018

У меня есть рабочее приложение, которое я скомпилировал с ASAN для выявления проблем с памятью.APP теперь аварийно завершает работу с ошибкой «обнаружено повреждение стека» в операторе throw (последний оператор в GetString ниже).Вот пример кода:

JNIEXPORT jstring JNICALL
Java_com_xxx_ReadFromDb(JNIEnv* env, jobject jobj, jstring key)
{
    if (key == nullptr)
    {
        return nullptr;
    }

    NAndroid::JString jkey(key);
    std::string val;
    try
    {
        **val = Test::GetInstance()->GetString(jkey.GetUTFString());**
    }
    catch (...)
    {
        return nullptr;
    }
    return env->NewStringUTF(val.c_str());
}


std::string Test::GetString(const std::string& key)
{
    bool result = dbVar->GetString(key);
    if (result)
    {
        /* Do something here */
    }
    else
    {
        ***throw NoSqlDBException(std::string("key not present ").append(key));***
    }
}

Когда я запускаю приложение, оно выдает следующую ошибку:

10-26 15:02:07.514 23220-23220/? A/DEBUG: pid: 23187, tid: 23187, name: yyy  >>> xxx <<<  
10-26 15:02:07.514 23220-23220/? A/DEBUG: signal 6 (SIGABRT), code -6   (SI_TKILL), fault addr --------  
10-26 15:02:07.517 23220-23220/? A/DEBUG: Abort message: 'stack corruption detected'  
10-26 15:02:07.517 23220-23220/? A/DEBUG:     r0 00000000  r1 00005a93  r2 00000006  r3 00000008  
10-26 15:02:07.517 23220-23220/? A/DEBUG:     r4 eaa9b58c  r5 00000006  r6 eaa9b534  r7 0000010c  
10-26 15:02:07.517 23220-23220/? A/DEBUG:     r8 1ff5f94c  r9 ffafcb8c  sl ffafcc50  fp e4900fd8  
10-26 15:02:07.517 23220-23220/? A/DEBUG:     ip 00000002  sp ffafc9f0  lr e8ff04c7  pc e8ff2d30  cpsr 600e0010  
10-26 15:02:07.521 23220-23220/? A/DEBUG: backtrace:  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #00 pc 0004ad30  /system/lib/libc.so (tgkill+12)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #01 pc 000484c3  /system/lib/libc.so (pthread_kill+34)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #02 pc 0001dd99  /system/lib/libc.so (raise+10)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #03 pc 00019521  /system/lib/libc.so (__libc_android_abort+34)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #04 pc 00017160  /system/lib/libc.so (abort+4)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #05 pc 0001bd97  /system/lib/libc.so (__libc_fatal+22)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #06 pc 000491e7  /system/lib/libc.so (__stack_chk_fail+6)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #07 pc 0011fc47  AAA.so (_ZN7XYZ11Test9GetStringERKSs+810)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #08 pc 00fd0d27  BBB.so (Java_com_xxx_ReadFromDb+430)  
10-26 15:02:07.521 23220-23220/? A/DEBUG:     #09 pc 025a7fc1  CCC.odex (offset 0x2514000)  
10-26 15:02:08.635 2403-2403/? E/lowmemorykiller: Error writing /proc/23187/oom_score_adj; errno=22  

Я уже пытался вернуть исключения std вместо моего определенного исключения.Кроме того, во время перехвата я пытался перехватить конкретное исключение (стандартное и определенное мной исключение), но оно все равно выдает ту же ошибку.

...