본문 바로가기

C++

(56)
libcurl 관련 사용 예제 [1. 개요]curl_global_init() - 대부분의 플랫폼에서 스레드 안전 할 수 있으나, 보장하지 않는다. curl_easy_init() curl_easy_cleanup() curl_list_append() - 최초 NULL 인 경우 리소스를 할당해준다. - 반환 값이 NULL 일 수 있다. curl_slist_free_all() curl_easy_setopt()- CURLOPT_URL- CURLOPT_POST- CURLOPT_POSTFIELDS- CURLOPT_POSTFIELDSIZE- CURLOPT_HTTPHEADER- CURLOPT_USERAGENT- CURLOPT_WRITEDATA # CURLOPT_WRITEFUNCTION 를 사용하지 않는다면 # 반드시, FILE* 를 넘..
boost 비동기 이론 [1. 개요]boost 에서 비동기 프로그램 작성에 대한 배경 지식을 정리하도록 한다.io_contextstrandstd::enable_shared_from_this논블로킹 IO 와 달리 비동기 IO 는 별도의 스레드로 동작하는 이벤트 루프가 필요하다.논블로킹은 일종의 폴링 과 같은 방식이기 때문이다.[2. io_context]boost 에서 io_context 는 내부적으로 큐를 갖고 있고, 이 큐에 비동기 작업이 등록되며io_context.run() 을 호출하면 큐에 쌓인 작업을 하나씩 꺼내서 실행하게 된다.std::vector> threads;for (unsigned i = 0; i thread = std::make_shared( // 멀티 스레드를 통해 // io_con..
segmentation fault 사례 6 [1. 개요]C++ 표준에 근거한 멤버 변수 초기화 순서를 지키지 않음으로 인해 발생한 fault 사례 정리[2. 참조자]어떤 객체가 참조자를 멤버 변수로 포함하고 있는 상태에서,이 참조자가 제대로 초기화 되지 않고, 이 참조자를 접근 할 때 문제가 발생 할 수 있다. 일반적으로 참조자가 포인터 처럼 NULL 값 이 들어오는 상황은 거의 없지만, (컴파일 오류..)아래와 같은 C++ 표준 상, 참조자가 유효하지 않은 메모리를 가리키는 상황이 발생 할 수 있다.- 멤버 변수는 선언된 순서대로 초기화 된다.- 생성자 이니셜라이저 리스트 순서와 관계 없다.- ISO/IEC 14882, 12.6.2[3. 예제]#include class A{ public: int a; A(cons..
산출물 관련 설정, 공유 라이브러리 [1. 개요]리눅스 기준, 빌드 결과물이 공유라이브러리 (.so) 파일에 의존하는 경우특히 boost 나 tbb 등 기본적으로 시스템에 설치 된 라이브러리가 아니라 별도 라이브러리 인 경우 프로그램 시작 시, 필요 한 공유 라이브러리를 로드 하지 못하여 실행하지 못할 수 있음.윈도우의 경우 현재 디렉터리를 기준으로 찾는 시늉(?) 이라도 하는 것 같던데,리눅스는 그렇지 않음. 여기서는 기본적으로 산출물이 공유 라이브러리를 찾는 기준을 설정하는 법을 정리한다.[2. RPATH]readelf -d "mybinary" 를 살펴 보면 RPATH 항목이 있음. 이 항목은 cmake 로 프로젝트 설정 시 -DCMAKE_SKIP_BUILD_RPATH=TRUE 로 설정하면 제거 할 수 있으나, 서비스 환경에 배포 시,..
빌드 방법 [리눅스 기준] [1. 개요]윈도우와 전체적인 맥락은 비슷 함./Configure '-Wl,-rpath,$(LIBRPATH)'# 혹은 Perl Configuremake 산출물libssl.alibcrypto.alibcrypto.so# => libcrypto.so.3libssl.so# => libssl.so.3
빌드 방법 [윈도우 기준] [1. 개요]빌드 환경윈도우 10Visual studio 2017 기준필요한 툴perlnasmnmakeclrcperl 은 아래 url 을 통해 다운 받도록 한다.https://strawberryperl.com/releases.htmlnasm 은 mingw 나 perl 다운 시 같이 받을 수 있다. 나머지 툴은 Visual studio 2017 설치 후,"vs 2017 용 x64 네이티브 도구 명령 프롬프트" 를 에서 동작을 확인하도록 한다.Visual studio 2015 나 2019 등을 사용하는 경우, 각 빌드에 맞는 프롬프트를 실행하도록 한다.해당 프롬프트에서 아래 작업을 진행하도록 한다. 소스코드를 아래 url 을 통해 다운 받은 후, 소스 디렉터리로 이동하도록 한다.https://github.c..
fsanitize 컴파일 옵션 [1. 개요]c++ 애플리케이션의 다양한 오류를 런타임에 찾고 수정하기 위한 한가지 방법이다.컴파일 시 해당 옵션을 지정하면, 컴파일러가 프로그램에 검사 코드를 자동 삽입하여 오류를 찾는데 도움을 준다. 다양한 옵션을 살펴보면 아래와 같다.-fsanitize=address버퍼 오버플로우, use-after-free 등 메모리 오류 탐지-fsanitize=undefined정의되지 않은 동작 (나눗셈 0, 정수 오버플로우 등)-fsanitize=leak메모리 누수 추적-fsanitize=memory초기화되지 않은 메모리 사용 (GCC 지원 안함.?)-fsanitize=threadrace condition 탐지-fsanitize=pointer-compare잘못된 포인터 비교/연산 감지-fsanitize=poi..
buffer overflow 사례1 [1. 개요]버퍼 오버플로우를 유발 할 수 있는 사례들을 정리한다. 포인터를 전달할 때, 실제 메모리는 해당 포인터 타입에 해당하는 크기만큼의 공간이 할당되어 있어야 한다.아래와 같은 타입 캐스팅은 가급적 하지 않는 것이 좋다.int value = 0x1234;long long *ptr = reinterpret_cast(&value);왜 그런가, ptr 을 대상으로 발생하는 연산은 ptr 이 가리키는 공간이 8byte 만큼 할당되어 있다고 판단하고연산을 진행한다.그러나, 실제 메모리 공간은 4바이트 이므로 할당된 메모리 공간을 넘어서는 문제가 발생할 수 있다. 아래 코드를 보면, func() 에는 변수 a 의 주소만 넘기는데, b 의 값이 변경되어 버린다.#include void func(unsigned..
Segmentation fault 사례5 [1. 개요]strncpy 사용 시, 버퍼 오버플로우 발생.정확히는, strncpy 사용 시 마지막 3번째 인자의 계산 오류로 인해 발생한 문제임. 아래와 같은 코드의 문제점은?#include #include #define max(a, b) ((a) > (b) ? (a) : (b))int main(){ char buf[512]; char buf2[512]; strcpy(buf2, "hello"); strncpy(buf, buf2, max(static_cast(strlen(buf2)) - strlen("helloworld"), 0)); std::cout 바로, int 와 size_t 간 자료형의 연산이다.size_t 는 64bit 프로그램에서..
std::enable_shared_from_this [1. 개요]std::enable_shared_from_this 를 상속한 클래스 (여기서 템플릿 T는 상속한 클래스를 말함) 는멤버 함수 내에서 shared_from_this() 를 호출하여 자기 자신에 대한 shared_ptr 을 생성 할 수 있다. 이것이 주로 활용되는 시점은 다음과 같다.콜백에서 자기 자신을 공유해야 할 때 (재참조 할 때)자기 자신을 다른 shared_ptr 구조로 넘겨야 할 때기타...shared_ptr 을 공유한다는 의미는 아래와 같다.실제 객체는 하나임그러나 여러 곳에서 참조하게 됨그래서 더 이상 참조하는 곳이 없어지게 되면 해당 객체는 자동 소멸하게 됨.그래서, 콜백에서 자기 자신을 공유해야 한다는 것은 아래와 같은 의미가 있다.일반적으로 콜백이라 함 은 특정 이벤트 발..