2013-07-19 7 views
3

Я пишу код, зависящий от calloc, и задавался вопросом, было бы безопасно переназначить указатель на пространство стека, если calloc не удалось, а затем установить указатель на NULL перед вызовом free() или вообще пропустить его. Прекрасно работает с моей 386-й линейкой.Является ли этот код непереносимым или небезопасным

char *str = NULL; 
int usestackspace = 0; 
char str1[16] = {0}; 

str = (char *)calloc(1, sizeof(pid_t)); 

if (str == NULL) { 
    sleep(1); 
    str = (char *)calloc(1, sizeof(pid_t)); 
} 

if (str == NULL) { 
    fprintf(stderr, "watchdog: %s\n", strerror(errno)); 
    usestackspace = 1; 
    str = str1; 
} 

if (str == NULL) { 
    return -1; 
} 
+0

'free' и' str = NULL; 'бессмысленны, но в остальном он выглядит нормально. –

+0

Вы не должны редактировать код в вопросе без каких-либо указаний на него. Я потратил несколько минут на поиски свободного, прежде чем осознать, что вы его не приняли. – cdietschrun

+0

'return -1;' в редакции 4 вопроса - это мертвый код. Оптимизирующий компилятор может опустить третье «если» вообще. –

ответ

2

Пока str1 не выходит за рамки код довольно много хорошо. У вас есть одна реальная ошибка (которая должна быть генерируя предупреждение, хотя это, вероятно, не имеет значения во время выполнения):

  • str = &str1 не является допустимым присваивание без явного приведения. Вероятно, вы хотите str = str1.

Одна из возможных проблем:

  • Если вы были в зависимости от неявного параметра к нулю памяти по calloc, вам необходимо инициализировать str1. Используйте char str1[16] = { 0 } или позвоните по телефону memset, например.

И пару мелких нот:

  1. Вы не должны отбрасывать возвращаемое значение calloc в программе C.

  2. Вы free(str) и str = NULL в if заявлении, но и нет-OPS - условие if оператор гарантирует, что str уже являетсяNULL.