Level : WORDPRESS BOOK LINKEDIN PATENT Send Mail 동냥하기 hajunho.com

constexpr

C++/Security / / 2019. 1. 2. 06:05
반응형

constexpr은 보안 관련 코드에서 몇 가지 이점을 제공할 수 있습니다:

1. constexpr의 특징과 보안 관련성

```cpp
// 1. 컴파일 타임 계산
constexpr int KEY_SIZE = 256;  // 암호화 키 크기
constexpr int MIN_PASSWORD_LENGTH = 8;  // 최소 암호 길이

// 2. 런타임 오버헤드 감소
constexpr uint32_t rotateLeft(uint32_t x, int n) {
    return (x << n) | (x >> (32 - n));
}

// 3. 값 검증을 컴파일 타임에 수행
constexpr bool isValidKeySize(int size) {
    return (size == 128 || size == 256 || size == 512);
}
```

2. 보안상 장점

- **컴파일 타임 검증**
  * 보안 관련 상수값 검증
  * 설정값 범위 체크
  * 타입 안전성 보장

- **최적화된 성능**
  * 암호화 연산의 일부를 컴파일 타임에 처리
  * 런타임 오버헤드 감소

- **코드 안정성**
  * 불변성 보장
  * 런타임 에러 가능성 감소

3. 실제 활용 예시
```cpp
// 보안 상수 정의
constexpr struct SecurityConstants {
    int key_size = 256;
    int hash_rounds = 1000;
    const char* allowed_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
    constexpr bool isAllowedChar(char c) const {
        for(int i = 0; allowed_chars[i]; ++i)
            if(allowed_chars[i] == c) return true;
        return false;
    }
} SEC_CONSTANTS;

// 사용 예
bool validateInput(const std::string& input) {
    for(char c : input)
        if(!SEC_CONSTANTS.isAllowedChar(c))
            return false;
    return true;
}
```

4. 제한사항과 주의점

- **런타임 값에는 사용 불가**
  * 동적으로 생성된 키나 솔트에는 적용 불가
  * 네트워크 데이터 처리에는 부적합

- **복잡한 연산의 한계**
  * 암호화 알고리즘 전체를 constexpr로 구현하기는 어려움
  * 메모리 할당이 필요한 연산은 불가능

5. 권장 사용 사례

- **보안 설정 값 정의**
  * 키 크기
  * 해시 라운드 수
  * 타임아웃 값

- **간단한 검증 함수**
  * 입력값 범위 검사
  * 허용 문자 검증
  * 기본적인 보안 규칙 검사

constexpr은 보안 코드의 일부 측면을 개선할 수 있지만, 그 자체로 보안 기능을 제공하지는 않습니다. 주로 성능 최적화와 코드 안정성 향상에 도움이 됩니다.

 

`constexpr`는 C++11에서 도입된 키워드로, 컴파일 시간에 값을 결정할 수 있는 상수 표현식을 정의하는 데 사용됩니다. 이 키워드를 사용하는 이유는 다음과 같습니다:

1. **컴파일 시간 상수**:
   `constexpr`을 사용하면 상수를 실행 시간에 계산하지 않고 컴파일 시간에 계산할 수 있습니다. 이는 실행 시간 성능을 최적화하는 데 도움을 줍니다.

2. **메모리 최적화**:
   컴파일 시간에 값이 결정되면 프로그램 실행 중에 메모리가 절약됩니다. 이는 특히 임베디드 시스템이나 제한된 하드웨어 환경에서 유리합니다.

3. **컴파일러 최적화**:
   `constexpr`을 사용하면 컴파일러가 코드를 더 잘 이해하고 최적화할 수 있습니다. 예를 들어, 반복해서 사용되는 상수가 컴파일 타임에 결정되면, 컴파일러는 중복된 계산을 제거할 수 있습니다.

4. **타입 안전성**:
   `constexpr`은 상수 표현식을 검사하는 데 엄격한 타입 검사를 강제합니다. 이는 런타임 오류를 줄이고, 코드의 안정성과 신뢰성을 높입니다.

5. **함수와 객체 사용**:
   `constexpr`을 함수와 객체에 사용할 수도 있습니다. 이는 복잡한 계산을 컴파일 시간에 실행할 수 있게 하고, 그 결과를 상수로 사용할 수 있게 합니다. `constexpr` 함수나 객체는 컴파일 시간이 아닌 때에도 사용할 수 있지만, 가능하다면 컴파일러는 그것을 컴파일 시간에 계산하려고 시도합니다.

예를 들면:
```cpp
constexpr int square(int x) {
    return x * x;
}

int main() {
    constexpr int value = square(5);
    int array[value]; // 배열의 크기를 컴파일 시간에 계산된 값으로 정의
    return 0;
}
```
이 예제에서 `square` 함수는 `constexpr`로 정의되었으며, 컴파일 시간에 계산되어 `value`의 값이 결정됩니다. 이로 인해 `array`의 크기도 컴파일 시간에 정의됩니다.

`constexpr`을 사용하면 코드가 더 명확해지고 최적화되며, 컴파일러가 더 많은 최적화 기회를 얻을 수 있게 되어 성능 개선에 기여할 수 있습니다.

 

 

C++ 및 STL에서 메모리 관리를 위한 다양한 함수와 클래스가 있습니다. 이를 통해 메모리를 효율적으로 할당, 해제, 재활용할 수 있습니다. 아래는 주요 메모리 관리 도구들의 목록입니다.

---

### 1. **동적 메모리 할당 함수**

- **`new` / `delete`**: 객체나 기본 데이터 타입의 동적 메모리를 할당하고 해제합니다.
  ```cpp
  int* ptr = new int;     // 단일 객체 할당
  delete ptr;             // 단일 객체 해제

  int* arr = new int[10]; // 배열 할당
  delete[] arr;           // 배열 해제
  ```

- **`malloc` / `free`**: C 스타일의 메모리 할당 함수로, 기본 데이터 타입의 메모리를 할당하고 해제합니다. 초기화가 되지 않으므로 `new`/`delete`보다 덜 권장됩니다.
  ```cpp
  int* ptr = (int*)malloc(sizeof(int) * 10); // 배열 할당
  free(ptr);                                // 해제
  ```

- **`calloc`**: `malloc`과 유사하나, 할당된 메모리를 0으로 초기화합니다.
  ```cpp
  int* ptr = (int*)calloc(10, sizeof(int)); // 배열 할당 및 0으로 초기화
  free(ptr);
  ```

- **`realloc`**: 기존에 할당된 메모리의 크기를 재조정합니다. 원본 메모리의 내용은 유지됩니다.
  ```cpp
  int* ptr = (int*)realloc(nullptr, sizeof(int) * 20); // 크기 변경
  free(ptr);
  ```

### 2. **STL 메모리 관리 클래스 및 함수**

- **`std::allocator`**: 기본 메모리 할당기를 구현한 템플릿 클래스입니다. 사용자 정의 할당기를 만들 때 유용합니다.
  ```cpp
  std::allocator<int> alloc;
  int* ptr = alloc.allocate(10); // 10개의 int 메모리 할당
  alloc.deallocate(ptr, 10);     // 할당 해제
  ```

- **`std::unique_ptr`**: 단일 객체를 소유하는 스마트 포인터로, 스코프를 벗어나면 자동으로 메모리를 해제합니다.
  ```cpp
  std::unique_ptr<int> ptr(new int(10));
  ```

- **`std::shared_ptr`**: 여러 개의 스마트 포인터가 같은 객체를 공유할 수 있는 스마트 포인터로, 참조 횟수가 0이 되면 메모리를 해제합니다.
  ```cpp
  std::shared_ptr<int> ptr = std::make_shared<int>(10);
  ```

- **`std::weak_ptr`**: `std::shared_ptr`와 함께 사용되며, 순환 참조를 방지하기 위한 포인터입니다. 메모리 소유권은 없습니다.
  ```cpp
  std::weak_ptr<int> weakPtr = ptr;
  ```

- **`std::array`**: 고정 크기 배열을 관리하는 STL 컨테이너로, 컴파일 타임에 크기가 결정됩니다.
  ```cpp
  std::array<int, 10> arr;
  ```

- **`std::vector`**: 동적 배열로, 런타임에 크기를 조절할 수 있습니다.
  ```cpp
  std::vector<int> vec;
  ```

- **`std::deque`**: 양방향으로 동적으로 크기를 조정할 수 있는 배열 기반 컨테이너입니다.
  ```cpp
  std::deque<int> deq;
  ```

### 3. **메모리 관리 함수 (STL `<memory>` 헤더)**

- **`std::make_unique`**: `std::unique_ptr`을 안전하게 생성하는 함수입니다.
  ```cpp
  auto ptr = std::make_unique<int>(10);
  ```

- **`std::make_shared`**: `std::shared_ptr`을 생성하는 함수로, 하나의 할당으로 효율적으로 메모리를 관리할 수 있습니다.
  ```cpp
  auto ptr = std::make_shared<int>(10);
  ```

- **`std::uninitialized_copy` / `std::uninitialized_fill` / `std::uninitialized_fill_n`**: 메모리 영역에 초기화되지 않은 복사 또는 값을 채웁니다.
  ```cpp
  int arr[5];
  std::uninitialized_fill(std::begin(arr), std::end(arr), 0);
  ```

- **`std::destroy` / `std::destroy_n`**: 객체를 파괴하지만 메모리를 해제하지는 않습니다.
  ```cpp
  std::destroy(std::begin(arr), std::end(arr));
  ```

- **`std::align`**: 특정 정렬(Alignment)을 위해 메모리를 조정합니다.
  ```cpp
  std::size_t space = 100;
  void* ptr = std::malloc(space);
  void* aligned = std::align(alignof(int), sizeof(int), ptr, space);
  ```

- **`std::pointer_traits`**: 포인터의 특성을 정의하여 포인터의 성격을 추론할 수 있습니다.

- **`std::raw_storage_iterator`**: 할당되지 않은 메모리에 객체를 복사할 때 사용됩니다.

### 4. **C++17, C++20 추가 메모리 관리 기능**

- **`std::pmr::polymorphic_allocator`** (C++17): 메모리 리소스 인터페이스 기반으로 메모리를 할당합니다.
- **`std::pmr::memory_resource`** (C++17): 메모리 할당 동작을 사용자 정의할 수 있는 메모리 리소스입니다.
- **`std::launder`** (C++17): 재해석된 포인터를 정당화하기 위해 사용됩니다.
- **`std::aligned_alloc`** (C++17): 특정 정렬에 맞춘 메모리 할당 함수입니다.


그리고 AI 쪽...

popular_models = [
    "bert-base-uncased",
    "gpt2",
    "xlnet-base-cased",
    "roberta-base",
    "distilbert-base-uncased",
    "albert-base-v2",
    "t5-small",
    "facebook/bart-base",
    "microsoft/DialoGPT-medium",
    "google/electra-small-discriminator",
    "EleutherAI/gpt-neo-2.7B",
    "EleutherAI/gpt-j-6B",
    "openai/whisper-base",
    "LG-AI-Research/SOLAR-10.7B-v1.0",
    "microsoft/deberta-base",
    "google/flan-t5-base",
    "stanford-crfm/pubmed-gpt",
    "allenai/longformer-base-4096",
    "bigscience/bloom-560m",
    "facebook/blenderbot-400M-distill",
    "gpt2-large",
    "gpt2-xl",
    "microsoft/DialoGPT-large",
    "facebook/bart-large",
    "t5-base",
    "t5-large",
    "google/pegasus-xsum",
    "sshleifer/distilbart-cnn-12-6",
    "EleutherAI/gpt-neo-1.3B",
    "EleutherAI/gpt-neox-20b",
    "stabilityai/stable-diffusion-2-base",
    "openai/whisper-medium",
    "openai/whisper-large",
    "bigscience/T0pp",
    "bigscience/mt0-large",
    "deepmind/Flamingo-9B",
    "anthropic/claude-v1",
    "databricks/dolly-v2-3b",
    "facebook/llama-7b",
    "facebook/llama-13b",
    "google/flan-ul2",
    "google/ul2",
    "nlpcloud/llama-13b-hf",
    "nlpcloud/llama-7b-hf",
    "stabilityai/stablelm-base-alpha-3b",
    "stabilityai/stablelm-tuned-alpha-3b",
    "togethercomputer/GPT-NeoXT-Chat-Base-20B",
]

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기