티스토리 뷰

728x90
구조체 초기화 및 동적 할당 초기화

구조체 초기화 및 동적 할당 초기화의 중요성

1. 구조체 및 동적 할당 초기화

프로그래머들은 구조체를 사용하고 동적으로 메모리를 할당할 때, 메모리를 초기화하는 다양한 방법을 사용합니다. 하지만 기본적으로 컴파일러가 자동으로 메모리를 초기화하지 않는다면, 다음과 같은 함수들을 사용하여 초기화 작업을 해야 합니다:

  • ::ZeroMemory(메모리 주소, 크기)
  • memset(메모리 주소, 값, 크기)

2. 코드 예시


struct Data
{
    int nData1;
    bool bData2;
};

Data *pData = new Data;

// 메모리 초기화
::ZeroMemory(pData, sizeof(Data));
::memset(pData, 0x0, sizeof(Data));
    

위 코드에서는 동적으로 할당된 Data 구조체의 메모리를 ZeroMemorymemset을 사용하여 0으로 초기화하고 있습니다.

3. 총평

이 방식은 많은 프로그래머들이 규약처럼 사용하는 메모리 관리 방법입니다. 운영체제(OS)는 프로그램이 메모리를 점유하고 있는지 여부만 판단하며, 해당 메모리 안에 어떤 값들이 저장되어 있는지는 신경 쓰지 않습니다. 따라서 초기화하지 않은 메모리는 이전에 사용된 값(일명 "쓰레깃값")이 남아 있을 수 있습니다.

4. 문제점과 보안 고려 사항

초기화되지 않은 메모리의 위험성

초기화하지 않은 메모리는 이전에 사용했던 값들이 그대로 남아 있을 수 있습니다. 이는 보안적으로 큰 문제를 야기할 수 있습니다. 특히 암호화된 데이터나 중요한 정보를 메모리에 저장했다가 반환하지 않고 남겨둔다면, 해커나 크래커가 메모리의 내용을 뒤져서 중요한 정보를 발견할 수 있습니다.

메모리 반환 시 보안 문제

단순히 free 또는 delete만으로 메모리를 해제하면, 해당 메모리는 반환되지만 이전에 저장된 값들이 그대로 남아 있을 수 있습니다. 이 때문에 보안에 민감한 경우, 메모리를 해제하기 전에 memset 또는 ZeroMemory를 사용하여 데이터를 지워야 합니다.

5. 해결책

  • 메모리 할당 시 초기화: 메모리를 할당할 때 항상 ZeroMemorymemset으로 초기화하여 쓰레깃값이 남지 않도록 해야 합니다.
  • 메모리 해제 전 초기화: 메모리를 해제하기 전에도 민감한 데이터를 지우기 위해 memset이나 ZeroMemory로 메모리를 다시 초기화한 후 freedelete를 사용해야 합니다.

6. 결론

동적 메모리 할당과 해제는 보안적으로 매우 중요한 작업입니다. 메모리 할당 시 쓰레깃값을 방지하기 위해 초기화하는 것뿐만 아니라, 메모리 해제 전에도 데이터를 명시적으로 초기화하는 것이 시큐어 코딩에서 필수적인 요소입니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
250x250