반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Tendermint
- 분산 신원
- Feign
- for
- Config server
- rust
- 분산 식별자
- PKI
- RSA
- MSSQL
- 치비
- 텐더민트
- 구피
- 물생활
- 조건문
- 주말농장
- 반복문
- 기본문법
- 무화과
- 체리새우
- rust 강좌
- golang 강좌
- did
- rust 소개
- MSA
- Python 강좌
- 애플 달팽이
- 쌈채소
- 카디날
- 가재
Archives
- Today
- Total
comnic's Dev&Life
[Rust] 13. 안전한 코드와 unsafe 키워드 본문
반응형
13. 안전한 코드와 unsafe 키워드
13. 1 unsafe 키워드
Rust는 안전성을 강조하는 언어로써, 대부분의 코드는 안전한 규칙을 따르도록 설계되어 있습니다. 그러나 특정한 경우에는 안전성 규칙을 우회하고자 할 때 unsafe 키워드를 사용할 수 있습니다. unsafe 블록 내에서는 일반적인 Rust 안전성 규칙을 무시할 수 있습니다.
fn main() {
let mut data = 42;
unsafe {
// unsafe 블록 내에서 안전성 규칙을 우회
data = data + 1;
println!("Unsafe result: {}", data);
}
// 여기서부터는 다시 안전한 코드
data = data * 2;
println!("Safe result: {}", data);
}
- unsafe { ... }: unsafe 키워드를 사용하여 안전성을 우회할 코드 블록을 정의합니다.
- data = data + 1;: unsafe 블록 내에서는 일반적인 Rust 규칙에 어긋나는 코드도 허용됩니다.
- data = data * 2;: unsafe 블록을 벗어나면 다시 일반적인 안전한 Rust 코드로 돌아옵니다.
13. 2 안전하지 않은 작업의 수행
unsafe 키워드는 주로 다음과 같은 상황에서 사용됩니다.
- Raw 포인터 사용: Rust의 안전한 래핑을 피하고 직접 메모리에 접근해야 할 때.
- 안전하지 않은 트레이트 구현: 특정 트레이트의 안전한 구현이 불가능하거나 어려운 경우.
// Raw 포인터를 이용한 안전하지 않은 작업
fn unsafe_example() {
let mut data = 42;
// &mut 대신에 Raw 포인터 사용
let raw_ptr: *mut i32 = &mut data as *mut i32;
unsafe {
// Raw 포인터를 이용하여 메모리에 직접 접근
*raw_ptr += 1;
println!("Unsafe result: {}", *raw_ptr);
}
// 여기서부터는 다시 안전한 코드
data = data * 2;
println!("Safe result: {}", data);
}
- *mut i32: *mut은 가변성을 나타내는 Raw 포인터 타입으로, 해당 타입의 메모리에 직접 접근할 수 있습니다.
- *raw_ptr += 1;: Raw 포인터를 이용하여 메모리에 직접 접근하고 수정하는 코드. 이는 일반적인 Rust의 안전 규칙에 어긋납니다.
- data = data * 2;: unsafe 블록을 벗어나면 다시 안전한 Rust 코드로 돌아옵니다.
주의사항: unsafe 키워드를 사용할 때에는 주의가 필요합니다. 안전성 규칙을 우회하는 것은 버그를 발생시키거나 메모리 안정성을 해칠 수 있습니다. unsafe 블록 내에서도 가능한한 안전한 코드를 작성하고, 러스트의 안전성 규칙을 최대한 따르는 것이 중요합니다.
반응형
'Rust' 카테고리의 다른 글
[PKI 예제] RSA로 서명하고 검증하기 (0) | 2023.12.12 |
---|---|
[Rust] 14. 비동기 프로그래밍과 async/await (0) | 2023.12.09 |
[Rust] 12. 테스트와 에러 핸들링 (0) | 2023.12.09 |
[Rust] 11. 병행성(Concurrency)과 동시성(Parallelism) (0) | 2023.12.09 |
[Rust] 10. 제네릭(Generic Data Types) 프로그래밍 (0) | 2023.12.09 |
Comments