Ошибка об «адресе 0x0 не является стеком, malloc'd или (недавно) free'd» в программе c в среде Linux - PullRequest
2 голосов
/ 07 июня 2010

[Edit1:]

Для seqName я объявляю его как глобальный параметр в начале файла как

char seqName [20];

[Edit2:]

Разве это не количество переходов в программу во время фактического выполнения?Я получил следующее сообщение, просто используя инструмент valgrind.Вводимая мной команда:

jl @ ubuntu: ~ / work / dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test

[Edit3:]

Извините, так как я новый пользователь Valgrind, когда я его использую, я набираю только команду в Edit2.

Однако моя доза программы имеет некоторую командную строкупараметры.

Поэтому я думаю, что лучше отладить мою программу с помощью новой команды:

valgrind --tool = memcheck --leak-check = yes ./testforeman.cif 352 288


Есть часть моей программы:

height = atoi(argv[3]);

width = atoi(argv[2]);

sprintf(seqName,"%s", argv[1]);

// strcpy(seqName, argv[1]);

После компиляции генерируется тест exe-файла, затем я использую Valgrind дляПроверь это.Затем я получил следующее сообщение, однако я не могу понять, что оно говорит мне.Кто-нибудь может оказать какую-то помощь, Спасибо.

jl @ ubuntu: ~ / work / dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test

== 28940 == Memcheck, детектор ошибок памяти

== 28940 == Copyright (C) 2002-2009 и GNU GPL'd, Джулиан Сьюард и др.

== 28940 == Использование Valgrind-3.6.0.SVN-Debian и LibVEX;

перезапустить с -h для получения информации об авторских правах

== 28940 == Команда: ./test

== 28940 ==

== 28940 == Недопустимое чтение размера 1

== 28940 == в 0x40260CA: strcpy (mc_replace_strmem.c: 311)

== 28940 == по 0x804A5C6: main (me_search.c: 1428)

== 28940 == Адрес 0x0 не является стековым, malloc'd или (недавно) свободным 'd

== 28940 ==

== 28940 ==

== 28940 == Процесс завершается с действием по умолчанию для сигнала 11 (SIGSEGV)

== 28940 == Доступ не в сопоставленной области по адресу 0x0

== 28940 == по адресу 0x40260CA: strcpy (mc_replace_strmem.c: 311)

== 28940 == by 0x804A5C6: main (me_search.c: 1428)

== 28940 == Если вы считаете, что это произошло в результате стека

== 28940 == переполнение в главном потоке вашей программы (маловероятно, но

== 28940 == возможно), вы можете попытаться увеличить размер

== 28940 == стека основного потока, используя --main-stacksize = flag.

== 28940 == Размер стека основного потока, использованный в этом цикле, был 8388608.

== 28940 ==

== 28940== РЕЗЮМЕ HEAP:

== 28940 == используется на выходе: 0 байтов в 0 блоках

== 28940 == общее использование кучи: 0 выделяет, 0 освобождает, 0 выделяет байты

== 28940 ==

== 28940 == Все блоки кучи были освобождены - утечки невозможны

== 28940 ==

== 28940 == Для подсчета обнаруженных и подавленных ошибок, повторно запустите: -v

== 28940 == РЕЗЮМЕ ОШИБКИ: 1 ошибка из 1 контекста (исключено: 13 из 8) 1 контекст (исключено: 13из 8)

1 контекстов (исключено: 13 из 8)

Ответы [ 4 ]

7 голосов
/ 07 июня 2010

Вы действительно не опубликовали достаточно ясный код, чтобы быть уверенным, но если вы вызываете свой исполняемый файл без параметров командной строки, тогда argv[1] будет содержать указатель NULL, argv[2], argv[3] и т. Д . будет содержать неопределенные значения.

Редактировать: Вам необходимо предоставить программе параметры в командной строке valgrind (я полагаю - я сам не использую valgrind). Что-то вроде:

valgrind ... ./test foo bar zod

И, кстати, называть исполняемый файл test - это плохая идея в Linux / Unix, поскольку его очень легко спутать со встроенной оболочкой с тем же именем

2 голосов
/ 07 июня 2010

Есть две вещи, которые вы должны проверить:

1) Убедитесь, что передано правильное количество параметров, проверив значение argc.

2) Убедитесь, что вы использовали malloc(), чтобы выделить достаточно места в seqName, прежде чем пытаться strcpy().

1 голос
/ 07 июня 2010

Я думаю, дело в следующем: sprintf(seqName,"%s", argv[1])

А на самом деле вы хотите sprintf((strcat(seqName,"%s"), argv[1]) судить ваш код.

Здесь он пытается передать значение выражения «% s» для интерпретации в формате. В частности, это значение является указателем на символ «%» в статической памяти, рядом с которым стоит «s», а затем «\ 0».

Отредактируйте, о, подождите, неважно, я вижу, что это sprintf, а не printf. Тогда это, вероятно, argcount

Edit2: Кроме того, seqName правильно инициализируется и выделяется?

1 голос
/ 07 июня 2010

Проверяете ли вы фактическое количество аргументов, переданных вашей программе? (argc)

Если ваша программа получает менее 3 аргументов, и вы пытаетесь обработать argv[1..3] - вы получите ошибки сегментации и другое непредсказуемое поведение.

...