C,atoi()生成分段错误

时间:2013-12-12 21:38:32

标签: c segmentation-fault atoi

我正在使用atoi()从标题中获取状态代码,但它不能使用以下输入:

" 404 Not Found\r\nContent-type: text/html\r\nDate: Thu, 12 Dec 2013 20:53:22 GMT\r\nConnection: close\r\n\r\n"

不应该停止阅读第一个非数字字符吗?如上所述:http://www-control.eng.cam.ac.uk/~pcr20/www.cppreference.com/stdstring_details.html

  一旦读取了非数字字符,

atoi()将停止从str读取

根据调试器,发生分段错误的代码:

__NTH (atoi (const char *__nptr))
{
   return (int) strtol (__nptr, (char **) NULL, 10);
}

它是来自stdlib.h的第280行,__nptr的值是:

__nptr  " 404 Not Found\r\nContent-type: text/html\r\nDate: Thu, 12 Dec 2013 20:53:22 GMT\r\nConnection: close\r\n\r\n" char *

我想指出以下输入正常(没有分段错误):

__nptr  " 404 Not Found\r\nContent-Type: text/html; charset=UTF-8\r\nX-Content-Type-Options: nosniff\r\nDate: Thu, 12 Dec 2013 21:13:24 GMT\r\nServer: sffe\r\nContent-Length: 943\r\nX-XSS-Protection: 1; mode=block\r\nAlternate-Protocol: 80:quic\r\n\r\n"   char *

__nptr  " 302 Found\r\nCache-Control: no-cache, no-store, must-revalidate\r\nPragma: no-cache\r\nExpires: 0\r\nLocation: http://br.godaddy.com/\r\nServer: Microsoft-IIS/7.0\r\nSet-Cookie: MemBotChk=false; path=/\r\nSet-Cookie: countrysite1=www; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nSet-Cookie: language1=pt-BR; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nP3P: policyref="/w3c/p3p.xml", CP="COM CNT DEM FIN GOV INT NAV ONL PHY PRE PUR STA UNI IDC CAO OTI DSP COR C..."    char *

实际上,到目前为止所有输入都可以正常工作,除了我在开头提到的那个。 可能导致分段错误的原因是什么?

删除前导空格并没有什么区别。我还尝试在响应代码之后添加一个null终止符,同样的事情发生了。所以我认为它不是atoi(),而是其他东西。如何识别问题?


Valgrind结果:

main.c中的main读取大小为1:23

地址0xf未堆叠,malloc'd或(最近)免费

  • 1: _ _strtol_l_internal in /build/eglibc-hkB3nk/eglibc-2.17/stdlib /../ STDLIB / strtol_l.c:298
  • 2: /usr/include/stdlib.h:280中的get_web_content
  • 3:main在main.c:23

main.c:23只是对get_web_content()

的调用

问题是稍后使用空指针调用了atoi()。

1 个答案:

答案 0 :(得分:1)

这真是一个初学者的错误。为了为响应体分配内存,我调用了strcasestr来查找Content-Length:字段。只有我没有检查是否找到了该字段。我没有得到的是为什么调试器显示之前对atoi()的调用。

如果遇到同样问题的人偶然遇到这个问题,我的错误就是这样:

fill_this->content_length = atoi(strcasestr(header_string + i, "Content-Length:") + 15);   

解决方案:

char *temp = strcasestr(header_string + i, "Content-Length:");
if(temp == NULL)
   return;
fill_this->content_length = atoi(temp + 15);