[네트워크 공격 및 방어] 포트폴리오
2024.01.18
no image
[C] 전처리기
전처리기 : Compile전에 코드를 변헝, CPU 연산 x #include : 컴파일러 설정의 시스템 디렉터리에서 검색 "" : 현재 프로젝트 폴더에서 검색 매크로와 __inline 함수 실제로는 함수가 아니라 한 행 혹은 여러 행으로 기술할 수 있는 구문 함수를 호출할 때 overhead(인자 복사 등)가 발생하기 때문에 매크로 사용(내용이 적을 때) 인자의 형을 정하지 않기 때문에 위험, 사용 자제를 추천 -> __inline 함수로 대체 #define ADD(a, b) (a + b) // 괄호를 하지 않으면 연산자 우선순위가 엇갈릴 수 있음 #define STRING(a) #a #define PASTER(a, b) a##b int main(void) { printf("%d\n", ADD(3, 4)..
2024.01.12
no image
[C] 컴파일 최적화
컴파일 최적화 컴파일러가 수행 코드에서 논리적으로 당연한 내용을 제거 특정 변수에 대해 의존성이 존재하는 연산들을 구별 최적화 방해요소 변수의 수가 늘어날수록 타 변수와의 조합을 통해 논리적 구조가 복잡해짐 -> 변수 개수를 줄이기(상수화) 포인터 사용 -> 메모리 주소는 런타임 때 결정나기 때문에 자제해야 함 Const 형 한정어 상수화 컴파일은 이 변수를 숫자로 인식함 성능향상 가능 인자로 포인터를 받아서 데이터를 읽기만 할때 사용하면 좋음 심볼릭 상수 : 특정 숫자와 변수의 이름을 조합하여 좀 더 의미가 명확해 보이는 상수로 표현, 전처리기로도 가능(#define) if (score
2024.01.10
no image
[C] 구조체와 공용체
자료형 : 일정 길이의 메모리에 저장된 정보 해석 방법 배열 : 동일 형식의 연속된 집합체 구조체 : 서로 같거나 다른 형식들의 연속된 집합체 -> strcut 공용체 : 같은 데이터에 대해 여러 형식으로의 해석 방법을 부여하는 문법 -> union 구조체 인자로 넘길 때는 call by reference를 사용해서 메모리 복사를 방지 자기참조로 single linked list를 구현 가능 구조체 멤버 맞춤 : 요소를 char와 int로 했을 때, 실제로는 char에 4바이트 크기의 메모리가 할당됨 -> 이를 방지하기 위해 #pragma pack(push, 1)을 사용해 1바이트 단위로 정렬하게 함(I/O는 느려짐) 비트 필드 : 구조체 선언 시 요소에 ':'를 사용해 비트 단위로 설정 가능 공용체 t..
2024.01.10
no image
[C] 파일 입출력
파일 유저모드에서 커널모드로 진입할 수 있는 인터페이스 -> 보조기억장치를 사용하는 하나의 방법 변수와 동적 메모리 사용이 RAM을 사용하기 위함이었다면, File은 Disk를 사용하기 위함 최초 크기는 0 -> Write가 일어나면 공간이 줄어들고 크기가 늘어나며 I/O 지점이 변경됨 고유의 I/O 버퍼를 소유 논리 구조가 선형 구조 -> Streaming 가능 -> Buffer, Queue를 떠올리자 EOF(End of File) : -1은 텍스트 파일의 끝을 의미(바이너리 파일은 -1을 하나의 데이터로 인식) fopen(), fclose(), fprintf() 등 파일 시스템 파일을 관리하는 시스템 커널에 위치 FAT32, NTFS 등
2024.01.10
no image
[C] 변수
전역 변수 : 스코프 외에서 선언되어 어디서든 접근 가능, 데이터 영역에 저장 지역 변수 : 스코프 내에서 선언되어 블록을 벗어나면 소멸, 스택 영역에 저장 정적 변수 : 한번만 초기화되어 프로그램이 끝날때까지 소멸하지 않음, 데이터 영역에 저장 -> static 외부 변수 : 다른 파일에서 이미 정의된 변수 -> extern(선언만) ※ 전역 변수와 정적 변수는 멀티 스레드 환경에서 동시성 문제를 가짐
2024.01.10
no image
[C] 메모리 복사
Deep Copy 변수의 내용을 복사 Shallow Copy 변수의 주소를 복사 int main(void) { char szSrcBuf[12] = { "Hello" }; char szDstBuf[12] = { 0 }; char* pszData = NULL; //Deep Copy memcpy(szDstBuf, szSrcBuf, sizeof(szDstBuf)); //Shallow Copy pszData = &szSrcBuf; return 0; } 메모리 관련 함수 memcpy : 복사 memcmp : 비교 r-value의 문자열은 Data 영역의 읽기 전용 공간에 위치함
2024.01.09
no image
[C] 동적 할당
동적 할당 가상 메모리의 Heap 영역의 공간을 사용할 수 있도록 운영체제에게 허가받는 것 malloc : 원하는 크기만큼 허가 받을 수 있는 함수 free : 사용이 끝난 메모리를 해제하는 함수 typedef struct USERDATA { char szName[64]; char szPhone[64]; } USERDATA; int main(){ USERDATA* pData = (USERDATA*)malloc(sizeof(USERDATA)); free(pData); }
2024.01.08
no image
[C] 포인터
사용 이유 1. 배열을 어떤 함수에서 사용하고 싶을때, 이를 인자로 넘기기 위해서 포인터를 사용 함수 포인터와 역호출 구조 함수 포인터 void testfunc(int nParam) { printf("test"); } int main(void) { void (*pfunc)(int) = testfunc; // 함수 포인터 return 0; } 역호출 구조(callback) int testfunc(int nParam) { return nParam; } void Mytest(int (*pfunc)(int), int nParam) { printf("%d", pfunc(nParam)); } int main(void) { Mytest(testfunc, 0); return 0; } 직접 호출하는 것이 아닌 호출되어 ..
2024.01.08