Ошибка при переносе по времени и времени при портировании с Linux на OSX - PullRequest
1 голос
/ 18 февраля 2011

Я получаю ошибки при компиляции кода, предназначенного для (я полагаю) Linux на OSX. Я разыскал проблему в этом разделе кода:

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);
TIMESTRING[24]=' ';

fprintf(LOG, "[ %20s] ", TIMESTRING);

Есть ли причина, по которой это может иметь место? Я включил <time.h>.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

ctime использует статически выделенный буфер определенного размера, поэтому ваша первая проблема в том, что вы добавляете эту строку, не зная размера.

TIMESTRING[24]=' ';

Это может вызвать segfault сам по себе, если размер буфера составляет всего 24 байта. Другая причина может заключаться в том, что если нулевое завершение происходит с индексом 24, вы просто сделали строку без определения, и fprintf продолжит чтение, пока не достигнет памяти, которую не разрешено читать, что приведет к ошибке segfault.

Используйте ctime_r с предварительно выделенным буфером, если вы хотите изменить его, и убедитесь, что буфер достаточно велик для хранения ваших данных и завершается нулем после того, как вы закончите с ним. Если ctime_r недоступен, сделайте strncpy в свой буфер перед изменением.

НТН

РЕДАКТИРОВАТЬ

Я не совсем уверен, что именно вы пытаетесь сделать, но, предполагая, что код, который вы разместили, взят непосредственно из вашего приложения, вы, вероятно, действительно хотите сделать это:

TIMEVAL = time(NULL);
char* TIMESTRING = ctime(&TIMEVAL);

fprintf(LOG, "[ %20s ] ", TIMESTRING);

То есть, добавьте строку времени. Просто добавьте пробел в строку форматирования, а не в буфер строки времени.

1 голос
/ 18 февраля 2011

Взяв это в качестве примера, что возвращает ctime - Сб 20 мая 15:21:51 2010 , что составляет всего 24 символа (то есть 24 байта). Итак, вы начинаете индекс массива с 0 до 23 . Так, в индексе 24 он имеет символ завершения.

Итак, TIMESTRING[24]=' '; - это неправильно (т.е. вы заменяете символ завершения пробелом) и вызывает ошибку сегментации на более поздних этапах.

...