memset не устанавливает число байтов?

В простой программе ниже команда указывает на 400 байтов в куче. Затем я копирую "./search '" в команду, *buffer указывает на следующий байт после " ' " (одинарная кавычка). Запуская память, указанную буфером, я использую memset, чтобы установить 300 байтов в значение 0x41 (ASCII 'A'), затем я добавляю закрывающую одинарную кавычку.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char *argv[]) {
    char *command = (char *)malloc(400);
    bzero(command, 400);

    strcpy(command, "./search \'");
    char *buffer = command + strlen(command);

    memset(buffer, 0x41, 300);
    strcat(command, "\'");

    system(command);
    free(command);
}

Но когда я смотрю на *command и *buffer в gdb, я вижу вот что.

char * command 0x601010 "./search '", 'A' <repeats 186 times>...
char * buffer  0x60101e 'A' <repeats 200 times>...

Во-первых, я ожидал, что он будет повторять 299 раз, а во-вторых, я ожидал, что повторы команд и буферов будут иметь одинаковое значение. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает?


person nik    schedule 03.02.2013    source источник
comment
Вы просматриваете байты command после того, как они были освобождены?   -  person Paul Hankin    schedule 03.02.2013
comment
Эти экранированные кавычки ("\'") кажутся мне странными...   -  person Sam    schedule 03.02.2013
comment
memset(буфер, 'A', 300); было бы читабельнее... :)   -  person Julien Palard    schedule 03.02.2013
comment
comment
Для меня это похоже на ошибку отображения GDB: P   -  person Julien Palard    schedule 03.02.2013


Ответы (2)


Из руководства GDB, раздел 10.8 Настройки печати. :

set print elements number-of-elements

Set a limit on how many elements of an array gdb will print. If gdb is printing a large array, it stops printing after it has printed the number of elements set by the set print elements command. This limit also applies to the display of strings. When gdb starts, this limit is set to 200. Setting number-of-elements to zero means that the printing is unlimited.

person starblue    schedule 03.02.2013

Проверка ваших предположений:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char *argv[]) {
    char *command = (char *)malloc(400);
    bzero(command, 400);

    strcpy(command, "./search \'");
    char *buffer = command + strlen(command);

    memset(buffer, 0x41, 300);
    strcat(command, "\'");
    int last = -1;
    int n = 0;
    for (int i = 0; i < 400; i++) {
        if (n && command[i] != last) {
            printf("%d %d x %02x '%c'\n", i - n, n, last, last);
            n = 1;
        } else {
            n++;
        }
        last = command[i];
    }
    printf("%d %d x %d '%c'\n", 400 - n, n, last, last);
    return 0;
}

Производит этот вывод:

0 1 x 2e '.'
1 1 x 2f '/'
2 1 x 73 's'
3 1 x 65 'e'
4 1 x 61 'a'
5 1 x 72 'r'
6 1 x 63 'c'
7 1 x 68 'h'
8 1 x 20 ' '
9 1 x 27 '''
10 300 x 41 'A'
310 1 x 27 '''
311 89 x 0 ''

Это выглядит правильно и не согласуется с диагнозом в вопросе. Так что либо gdb не работает, либо вы просматриваете байты после их освобождения.

person Paul Hankin    schedule 03.02.2013