2015-02-11 4 views
0

код реализует функцию, которая считывает файл (содержит много URL-адресов), каждый URL-адрес проходит через «evhttp_uri_parse», получая хост и путь. Но у него есть ошибка, из-за которой ошибка анализа evhttp_uri_parse не возвращается, возвращает NULL. Возможно, причиной является переполнение стека.переполнение стека (около «evhttp_uri_parse»)

FILE *fp=fopen(argv[1],"rb"); 
if(NULL==fp) 
{ 
    printf("open url_file is error %d::%s\n",errno,strerror(errno)); 
    return 0; 
} 
char url_buf[2048]; 
memset(url_buf,'\0',sizeof(url_buf)); 

fgets(url_buf,sizeof(url_buf),fp); 
while(!feof(fp)) 
{ 
    if(strlen(url_buf)>1) 
    { 
     printf("url_buf::%s",url_buf); 
     #if 1 
     struct evhttp_uri *ev_uri=NULL; 
     ev_uri=evhttp_uri_parse(url_buf); 
     if(ev_uri==NULL) 
     { 
      printf("parse uri error::%d,%s\n",errno,strerror(errno)); 
     } 
     const char *host=evhttp_uri_get_host(ev_uri); 
     const char *path=evhttp_uri_get_path(ev_uri); 
     printf("query host::%s,path::%s\n",host,path); 
     evhttp_uri_free(ev_uri); 
     #endif 
    } 
    memset(url_buf,'\0',sizeof(url_buf)); 
    fgets(url_buf,sizeof(url_buf),fp); 
} 
fclose(fp); 
+0

У вас есть определенный URL-адрес, который вызывает ошибку? – tripleee

+0

NO. Все общее. – sanwuhai

+0

Кавычки в 'printf()' after 'if (fp == NULL)' неуместны; вы хотите закрыть цитату после новой строки ('\ n'). Сообщения об ошибках обычно должны печататься со стандартной ошибкой, а не с стандартным выходом. –

ответ

0
  1. fgets(url_buf,sizeof(url_buf)+1,fp) должен быть изменен на fgets(url_buf,sizeof(url_buf),fp)

  2. fgets добавляет '\ п' в конце строки. Попытайтесь удалить его и посмотреть, помогает ли это.

+0

NO. У порога есть ошибка. – sanwuhai

+1

@sanwuhai: user4419802 указал на подлинную проблему. Возможно, это не ваша главная проблема, но это настоящая проблема, которая должна быть исправлена. –

+0

@ Джонатан Леффлер. вам нужен совет. – sanwuhai

0

если ваш URL по любой причине более чем 2048 размер символов, то fgets не будет полностью вернуть вам URL вы хотели, и вернуть вам часть его (с 2047 символа) с нулевым символом в 2048'th месте только.

так вот почему это плохая идея поставить sizeof(url_buf)+1. это приведет к неопределенному поведению, так как вы будете получать доступ к местоположению, которое не связано с массивом url_buf.

так проверьте, есть ли у вас строка с символом новой строки и измените ее на нулевой символ, если вы не получили символ новой строки в строке, тогда вы можете прочитать, пока не получите новую строку для получения полного URL-адреса ,

Это применимо только в том случае, если ваш URL-адрес ограничен символом новой строки.

+0

Спасибо за ваш совет, но главная причина - не элемент. – sanwuhai

+0

@sanwuhai вы должны опубликовать сообщение об ошибке и результатах, которые вы получаете, чтобы мы могли узнать, с какими проблемами вы столкнулись, мы отправляем решения, предполагая, что функция 'evhttp_uri_parse (url_buf)' работает нормально, и единственный способ он может ошибаться из-за неправильного ввода. – Sridhar

 Смежные вопросы

  • Нет связанных вопросов^_^