天天看点

libcurl中使用curl_easy_getinfo 产生段错误分析

最近再写一个hsf的代理程序。需要使用libcurl与后端的nginx通信。程序编写过程中遇到一个蹊跷的问题。

调用 code = curl_easy_getinfo(curl, curlinfo_response_code, &rsp_code); 后会报段错误。

示例代码如下:

问题:

int rsp_code;

code = curl_easy_getinfo(curl, curlinfo_response_code, &rsp_code);

当rsp_code设置为int类型 会有段错误。如果long类型没问题。

分析:

下载了libcurl的代码,查找原因。

原来curl_easy_getinfo的实现使用了可变参数。即,在编译时不进行参数个数和参数类型检测。这样,在使用这个函数时,无论你传入的类型是int还是long,都不会报错。虽然,它要求的是long类型。不过,在赋值的时候,他可是按long类型赋值的。这样就导致栈被破坏了。当然就报段错误了。

相关代码如下:

验证:

编写了示例代码,验证了假设。注意此代码在32位操作系统上不会报错,在64位操作系统上会报段错误。注意只有在int和long类型长度不一致时才会出现段错误。如在64位操作系统。

输出:

看来,宽松意为着需要更加严谨。没有条条框框的约束,得做好自我约束。

继续阅读