Ошибка сегментации возвращается к vfprintf? - PullRequest
2 голосов
/ 25 февраля 2012

Я получаю ошибку сегментации и, используя gdb и backtrace, выдается в vprintf.

#0  0x006e8779 in vfprintf () from /lib/libc.so.6
#1  0x006f265f in fprintf () from /lib/libc.so.6
#2  0x08049fd1 in write_tofile (logfile=0x9843090 "~/www/log") at example.c:446

Это происходит, когда я звоню

file = fopen(log_file, "a"); // log_file = "~/www/log"
fprintf(file, buffer);

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

Ответы [ 4 ]

6 голосов
/ 25 февраля 2012

Использование '~' в качестве аббревиатуры для вашего домашнего каталога является оболочкой и не обязательно доступно в C. Это может привести к сбою fopen, и вы не проверяете возврат код.

2 голосов
/ 25 февраля 2012

Вы не должны никогда не проверять ошибки в операциях, которые не находятся на 100% под вашим контролем. Если вы не знаете, существует ли файл, и операция открытия должна быть успешной (а это то, чего вы действительно не можете знать наверняка), вы должны проверить:

FILE * f = fopen(log_file, "a");

if (!f) { /*error, die? */ }

fprintf(f, buffer);

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

Для простой печати необработанной строки str безопаснее использовать fputs(str, f) или fprintf(f, "%s", str), если необходимо.

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

Предположительно fopen не удалось и вернул указатель NULL.

Вы должны проверить возвращаемое значение fopen перед его использованием и использовать errno, чтобы определить, в чем заключалась ошибка.

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

Проверьте содержимое буфера. У вас есть неэкранированный символ% и / или нулевой завершающий символ.

...