long 형식의 경우 윈도우즈 Visual C++ 의 경우 32bit 로 처리되고 unix 에서는 64 bit 로 처리된다. max 가 다르니 cast 도 주의해야겠지만 이번에 겪은 문제는 long* 에 int * 주소를 넘기는 바람에 access violation 을 일으켰다.
참고 : https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
http rest api 테스트로 많이 사용하는 curl 이라는 cli 로 더 유명하겠지만 libcurl 이라고 http client library 가 있다.
curl_easy_getinfo api 에서 CURLINFO_RESPONSE_CODE 에 대해 long* 로 넘긴 주소에 결과값을 전달해 준다.
#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long response_code;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
}
curl_easy_cleanup(curl);
}
출처 : https://curl.se/libcurl/c/curl_easy_getinfo.html
https://curl.se/libcurl/c/CURLINFO_RESPONSE_CODE.html
int responseCode = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
vc++ 에서는 이 코드가 컴파일도 잘 되고 문제가 없었지만 linux 에서는 curl 호출 후 scope 나갈 때 std::string destructor 에서 터지는 이상한 문제가 발생했다.
case CURLINFO_RESPONSE_CODE:
*param_longp = data->info.httpcode;
break;
long* 에 int 형 데이터 주소를 넘기니 내부에서 int* 형 주소에 long 형식의 데이터를 write 하다가 int* 다음 영역의 데이터를 오염시켜서 발생하는 문제였다.
불행히 curl_easy_getinfo 가 가변 변수 함수라 컴파일 타임에 잡아 낼 수 없었다.
예전엔 short, int 같은 형식을 선호했었는데 이제는 int8, int16, int32 와 같이 비트가 명시된 형식을 선호하게 되었다.