본문 바로가기

반응형

분류 전체보기

(654)
[ Rust ] 버퍼 오버플로우(buffer overflow)에 대해서 알아 보기 버퍼 오버플로우(Buffer Overflow)는 메모리 안전성 문제 중 하나로, 프로그램이 고정된 크기의 메모리 버퍼에 더 많은 데이터를 기록하려고 할 때 발생합니다. 이로 인해 버퍼를 초과한 메모리 영역이 덮어쓰여질 수 있으며, 이는 프로그램의 비정상 종료, 데이터 손상, 심지어 악의적인 코드 실행과 같은 심각한 문제를 초래할 수 있습니다.버퍼 오버플로우 예제 (C 언어)C 언어는 메모리 관리를 프로그래머에게 맡기기 때문에, 버퍼 오버플로우 문제가 발생하기 쉽습니다. 아래는 C에서 발생할 수 있는 버퍼 오버플로우의 예입니다:#include #include int main() { char buffer[10]; strcpy(buffer, "This is a very long string that..
[ Rust ] 데이터 경합(data race)에 대해서 알아보기 데이터 레이스(Data Race)는 여러 스레드가 동시에 같은 메모리 위치를 읽거나 쓰려고 할 때 발생하는 문제입니다. 이 상황에서 적어도 하나의 스레드가 데이터를 쓰려고 하면 데이터 레이스가 발생합니다. 데이터 레이스는 프로그램의 동작을 예측하기 어렵게 만들며, 심각한 버그를 초래할 수 있습니다.러스트(Rust)는 이러한 데이터 레이스 문제를 컴파일 타임에 방지하기 위해 고유한 메모리 안전성 모델을 채택하고 있습니다. 러스트의 소유권 시스템은 데이터 레이스를 방지하는 중요한 역할을 합니다. 컴파일러는 동일한 메모리 위치에 동시에 접근하려는 여러 스레드가 있는지 확인하고, 만약 가능성이 있다면 컴파일 에러를 발생시킵니다.예제: 데이터 레이스가 발생하는 코드 (Rust가 아니었더라면)use std::thr..
[ Rust ] 댕글링 포인터(dangling pointer)에 대해서 알아보기 러스트(Rust)에서 댕글링 포인터(dangling pointer)는 발생하지 않도록 설계되어 있습니다. 댕글링 포인터는 C나 C++와 같은 언어에서 흔히 발생하는 메모리 안전성 문제로, 특정 메모리 주소를 가리키고 있지만 해당 메모리가 더 이상 유효하지 않은 경우를 말합니다. 이는 주로 객체가 해제된 후에도 포인터가 그 메모리 위치를 참조할 때 발생합니다.Rust에서는 이러한 댕글링 포인터 문제를 컴파일 타임에 원천적으로 방지하는 메커니즘을 가지고 있습니다. 그 핵심이 바로 소유권(ownership)과 차용(borrowing)입니다.Rust의 소유권 시스템Rust의 소유권 시스템은 세 가지 규칙으로 구성됩니다:각 값은 하나의 소유자(owner)만 가질 수 있습니다.소유자가 스코프(scope)를 벗어나면..
[ Rust ] 러스트는 어떤 언어인가? Rust는 성능과 안전성을 모두 갖춘 시스템 프로그래밍 언어입니다. 2010년 모질라(Mozilla)에서 처음 개발되었고, 현재는 독립적인 Rust 커뮤니티에 의해 관리되고 있습니다. Rust는 특히 메모리 안전성을 보장하면서도 C나 C++과 같은 전통적인 시스템 프로그래밍 언어와 비교해 동급의 성능을 제공합니다.Rust의 주요 특징메모리 안전성:Rust의 가장 큰 장점 중 하나는 메모리 안전성입니다. Rust는 소유권(ownership), 차용(borrowing), 수명(lifetime)이라는 개념을 사용하여, 컴파일 타임에 메모리 오류(예: 댕글링 포인터, 이중 해제 등)를 방지합니다. 이러한 메커니즘 덕분에 Rust는 메모리 관리의 안전성을 유지하면서도 성능 저하 없이 코드를 작성할 수 있습니다.제..
[ Python ] math 패키지 사용하기 math 패키지는 Python에서 수학 관련 함수를 제공하는 표준 라이브러리입니다. 이 패키지는 수학 연산을 수행하기 위한 다양한 함수와 상수를 포함하고 있으며, 주로 기본적인 수학 연산을 보다 효율적으로 수행할 수 있도록 지원합니다.주요 기능과 사용법기본 수학 함수:math.sqrt(x): 숫자 x의 제곱근을 반환합니다.import mathprint(math.sqrt(16)) # 출력: 4.0math.pow(x, y): x의 y제곱을 계산합니다.import mathprint(math.pow(2, 3)) # 출력: 8.0math.factorial(x): 숫자 x의 팩토리얼(계승)을 계산합니다.import mathprint(math.factorial(5)) # 출력: 120math.gcd(x, y):..
[ Python ] 원하는 만큼 난수를 만들어서 누적 횟수 확인해 보기 이 코드는 0에서 9까지의 난수를 발생시켜 각 숫자의 발생 횟수를 누적하고, 사용자가 지정한 합산 횟수만큼 반복하여 수행한 후, 각 숫자의 누적 수를 표시하는 프로그램입니다.import random# 사용자로부터 합산 횟수를 입력받음num_iterations = int(input("난수 발생 횟수를 입력하세요: "))# 각 숫자의 발생 횟수를 저장할 리스트 초기화 (0으로 초기화)count = [0] * 10 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]# 난수 발생 및 발생 횟수 누적for _ in range(num_iterations): random_number = random.randint(0, 9) count[random_number] += 1# 결과 출력print("\n..
[ Python ] Random 패키지 사용하기 파이썬의 random 모듈은 난수를 생성하고 다양한 난수 관련 기능을 제공하는 표준 라이브러리입니다. 이 모듈은 임의의 숫자, 시퀀스, 요소 등을 생성하거나 선택하는 데 유용하며, 다양한 확률 분포에 따른 값도 생성할 수 있습니다.주요 기능 및 사용법기본적인 난수 생성:random.random(): 0.0 이상 1.0 미만의 부동소수점 난수를 반환합니다.import randomvalue = random.random()print(value) # 예: 0.37444887175646646정수 난수 생성:random.randint(a, b): a와 b 사이의 정수 난수를 반환합니다. 여기서 a와 b는 모두 포함됩니다.random.randrange(start, stop[, step]): start와 stop 사..
[ Python ] complex 클랙스를 사용해서 복소수 다루기 파이썬의 complex 클래스는 복소수를 표현하기 위해 사용됩니다. 복소수는 실수 부분과 허수 부분으로 구성되며, complex 클래스는 이러한 복소수를 효과적으로 다루는 데 필요한 기능을 제공합니다.주요 특징 및 사용법복소수 생성:복소수는 a + bj 형태로 나타내며, 여기서 a는 실수 부분이고 b는 허수 부분입니다. j는 허수 단위를 나타냅니다.복소수를 생성하는 두 가지 방법이 있습니다:complex(a, b)를 사용하여 a + bj 복소수를 생성.직접 a + bj 형태로 입력.z1 = complex(3, 4) # 3 + 4jz2 = 3 + 4j # 3 + 4j복소수의 속성:complex 객체는 두 가지 속성을 가지고 있습니다:.real: 복소수의 실수 부분..imag: 복소수의 허수..

반응형