Защита массива памяти классов для обнаружения ошибки сегментации - PullRequest
0 голосов
/ 01 июня 2018

Я работаю в Linux (CentOS 7.4, компилятор Clang) и получаю ошибку сегментации ( не , легко воспроизводимую) в объекте структуры C ++.Это член класса полиморфного объекта, который я не выделяю, но создается в рамках, к которому у меня нет исходного кода.Это означает, что я не могу скомпилировать с использованием sanitize легко, и Valgrind увеличивает время инициализации с секунд до 5 минут):

// C is allocated within a third party framework, I assume they use new()
//
class C : public ThirdPartyParentClass
{
    S s;
}

struct S
{
    .
    std::mutex   _mutex;
    .
};

ошибка сегментации повреждает _mutex.

Поэтому я добавил буфер символовтаким образом я мог видеть повреждение:

struct S
{
    .
    char         _buffer[1000];
    std::mutex   _mutex;
    .
};

, и я могу видеть поврежденные байты, когда происходит ошибка сегментации.Однако я не могу определить , когда происходит повреждение.

Чтобы определить, когда происходит повреждение, я бы хотел защитить байты буфера символов.Я попытался:

struct S
{
    S()
    {
        mprotect(&_buffer[0], 4096, PROT_NONE);
        const int test = buffer[0];  // Trigger seg fault to test it works
    }
    .
    char         _buffer[4096]__attribute__((aligned(4096)));
    std::mutex   _mutex;
    .
};

, но мой тест для определения защиты памяти работает, не вызывает ошибку сегмента.

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 01 июня 2018

Делать это на уровне источника немного глупо.Если вы хотите найти точный момент, когда что-то записывается по определенному адресу памяти, используйте точку останова данных (gcc называет их «точками наблюдения»).Просто сделайте watch *(int*)0xWHATEVER в области памяти, которую вы ожидаете испортить, и она сломается при первой модификации, с очень низкими издержками.

...