Как создать динамически распределенную ошибку памяти, обнаруживаемую Valgrind? - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно использовать настоящую C программу для иллюстрации концепций безопасности памяти. Идея состоит в том, чтобы ввести или удалить некоторые операторы в программе, которая использует malloc, чтобы создать проблему с памятью. Модифицированная версия программы должна давать сбой памяти во время выполнения. Проблема должна быть обнаружена с помощью Valgrind и, таким образом, связана с динамически выделяемой памятью (а не с памятью стека). У него также должен быть готовый тестовый набор или тестовый вход для запуска проблемы.

Я не понимаю, как создать динамически распределенную ошибку памяти.

Можете ли вы представить пример и объяснить модификацию программы, которая вызывает ошибку памяти при выполнении программы с заданным вводом?

1 Ответ

1 голос
/ 14 апреля 2020

Я приведу несколько примеров.

#include <stdlib.h>

int main(void)
{
    int*pi1  = malloc(10*sizeof(int));
    if (pi1[5]) // ERROR here, see 4.2.2 in the manual
        ;
    free(pi1);

    int* pi2 = malloc(10*sizeof(int));
    free(pi2);
    if (pi2[5]) // ERROR here, a variation of 4.2.1 in the manual
        ;

    int* pi3 = (int*)0x500000000000U;
    if (*pi3) // ERROR and probably a crash, see 4.2.1 in the manual
       ;
}

Очевидно, что это тривиальные примеры. В более сложных проблемах реального мира вы должны знать, что «неинициализированная» природа памяти является транзитивной. Valgrind не выдает сообщений об ошибках, пока использование неинициализированной памяти не повлияет на поведение программного обеспечения.

Например, вы можете иметь

  1. Структура s1, выделенная с помощью mallo c.
  2. Все поля s1 инициализируются, кроме f1.
  3. s1 копируется в s2. Ошибка не выдается.
  4. s2 копируется в s3. Ошибка не выдается.
  5. На s3.f1 выполняется чтение. Теперь Valgrind выдает ошибку. Это даст стек здесь и стек выделения на шаге 1.
...