glibc обнаружил ошибку - id3Tag - PullRequest
       8

glibc обнаружил ошибку - id3Tag

0 голосов
/ 05 февраля 2012

Итак, я новичок в C и пытаюсь написать этот инструмент для редактирования тегов id3 для музыкальных файлов из командной строки.Я получаю эту ошибку:

* обнаружен glibc двойное освобождение или повреждение (вверху): 0x0000000000502010 **

Из того, что я прочитал, я знаю, что это как-то связано с освобождением памяти.Я просто не совсем уверен, куда идти отсюда, хотя.В любом случае, моя логика заключалась в том, что если бы существовал тег, я бы прочитал этот тег, а затем внесите любые необходимые изменения в поля, указанные в командной строке.Вот блок, который доставляет мне неприятности.Спасибо за любую информацию заранее!

    fopen(argv[1], "rb");
    fseek(in_file, -128, SEEK_END);
    fread(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

    for (x = 2; x < argc-1; x++)
    {            
        if (strcmp(argv[x], "-title"))
            strncpy(tagTest.title, argv[x+1], 30);
        if (strcmp(argv[x], "-artist"))
            strncpy(tagTest.artist, argv[x+1], 30);
        if (strcmp(argv[x], "-album"))
            strncpy(tagTest.album, argv[x+1], 30);
        if (strcmp(argv[x], "-year"))
            strncpy(tagTest.year, argv[x+1], 4);
        if (strcmp(argv[x], "-comment"))
            strncpy(tagTest.comment, argv[x+1], 28);
        if (strcmp(argv[x], "-track"))
            tagTest.track = atoi(argv[x+1]);
    }

    tagTest.seperator = 0;

    fopen(argv[1], "r+b");
    fseek(in_file, -128, SEEK_END);
    fwrite(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

1 Ответ

1 голос
/ 05 февраля 2012

В этом коде нет free вызовов, поэтому я полагаю, вы счастливы, что ничего не освобождаете дважды? Поэтому, я полагаю, у вас тут какая-то куча коррупции. То есть вы записываете в тег больше данных, чем имеется место.

Во-первых, чтобы ответить на вопрос из @ H2CO3, я не думаю, что здесь проблема. Возможно, проблема, о которой он упоминает, существует - в этом случае вы повредите свой файл данных - но это не похоже на причину сбоя программы.

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

in_file = fopen (argv[1], "rb");

Некоторые другие комментарии:

  • strcmp возвращает ноль (ложь), когда строка соответствует, и ненулевое (истина), когда она не совпадает ... поэтому все ваши сравнения выглядят некорректными - это не должно вызывать искажения.
  • Появляется цикл для проверки значений аргументов, а также переключателей - вы должны их пропустить.
  • Нет необходимости открывать файл дважды - вы можете открыть его как для чтения, так и для записи в начале.
  • Вам нужно добавить гораздо больше ошибок, если файл не существует или не соответствует вашим ожиданиям - но тогда я уверен, что вы это знали.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...