Linux: brk () ошибка «Не удается выделить память» - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь использовать функцию brk () в C-программе. Моя цель - использовать его напрямую (как часть более крупного теста), проверяя текущий разрыв программы (pb) с помощью

void *current_break = sbrk(0);

, выполняющего malloc (для тестирования, так как malloc иногда должен выполнять brk, если выделено пространстводостаточно большой)

void* mallow_return = malloc(1);

, а затем непосредственно выполнить brk (), используя текущий адрес + приращение (и проверьте, увеличивает ли это значение pb):

int increase = 0x01; 
void * newbreak = current_break + increase;
int return_value = brk(&newbreak);

Моя проблема, то, что ни с большим вызовом malloc (malloc (5000;)), ни с (выравниванием или выравниванием) brk () pb не изменяется. При проверке ошибки я получаю

Невозможно выделить память! error (as given by strerror (errno)

Кто-нибудь может понять, почему я не могу увеличить разрыв программыв любом случае?

Спасибо за любые подсказки!

(Система: Debian 10 (buster) с ядром 4.19)

Редактировать: По запросу это основная функция с включенными:

#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

void main(int argc, char **argv)
{

printf("[+] Get current program break\n");
void *current_break = sbrk(0);
printf("\t[+] Current break point=\t%#x\n", current_break);


printf("[+] Malloc should call brk as well\n");
void* mallow_return = malloc(1);

printf("[+] Check if malloc changes PB\n");
void *after_break = sbrk(0);
printf("\t[+] After malloc pbreak=\t%#x\n", after_break);


int increase = 0x01; 
printf("\t[+] Increasing p-break direclyby %d\n", increase);


void * newbreak = current_break + increase;
printf("\t[+] Setting break point to=\t%#x\n", newbreak);


int return_value = brk(&newbreak);

//check if error was thrown
int errornumber = errno;
if (errornumber != 0)
{
    printf("\t[+] Error: %s!\n", strerror(errornumber)); 
    return -1;
}

//check if pb was set now
printf("\t[?] New program break value?\t%#x\n", sbrk(0));
printf("[?] Return value of brk: %d\n", return_value);

return;
}

1 Ответ

1 голос
/ 14 октября 2019

(Спасибо @Antii Haapala, который разместил это как комментарий.)

Нам нужно удалить амперсанд здесь:

int return_value = brk(&newbreak);

Эта строка должнабыть просто

int return_value = brk(newbreak);
...