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",
]
'C++ > Security' 카테고리의 다른 글
공격 많이 들어오는구마이라... log (0) | 2024.11.22 |
---|---|
선박 네트워크 보안 + 추가적인 `constexpr` 사용법 (0) | 2019.01.02 |
최근댓글