본문 바로가기

전체 글

(772)
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 프로그램에서..