프로그래밍

[C++] Philosophy 7 & 8

하루삼십만원 2020. 12. 2. 21:19
반응형

[C++] Philosophy 7: Catch run-time errors early

 

Reason "mysterious" crash들을 피하십시오. (아마도 인식할 수 없는) 잘못된 결과들을 초래하는 error들을 방지하십시오.

 

Example

여기 use1 함수에서 우리는 데이터 손상이나 crash로 이어질 작은 사용 오류를 만들었다. (pointer, count) 스타일의 인터페이스는 '범위 밖의 오류'로부터 자신을 방어할 수 있는 현실적인 방법이 없는 increment1() 함수를 남긴다. 우리가 subscripts가 범위를 벗어났는지 확인할 수 있었다면, p[10]에 액세스해서야 오류가 발견는 일은 없었을 것이다. 우리는 더 일찍 확인하고 코드를 개선할 수 있었다.

m <= n은 조기에 호출 시점에서 확인할 수 있다. n을 bound로 사용할 수 있도록 오타가 있는 경우, 코드는 더욱 단순화 될 수 있다. (오류의 가능성을 제거)

Example, bad 같은 값을 반복해서 확인하지 마십시오. 구조화된 data를 문자열로 전달하지 마십시오.

날짜는 (Date 생성자에 의해) 2번 validated되며 character string으로 전달 된다. (구조화되지 않은 data)

 

Example Excess checking(초과 점검)은 비용이 많이 들 수 있다. 값(value)을 절대 필요로 하지 않을 수도 있고, 전체보다 더 쉽게 확인할 수 있는 값(value)의 일부만 필요할 수도 있기 때문에 조기 체크가 비효율적인 경우가 있다. 마찬가지로 인터페이스의 asymptotic behavior(점근성 동작)을 변경하는 유효성 검사를 추가하지 마십시오(예: 평균 복잡도가 O(1)인 인터페이스에 O(n) 검사를 추가하지 마십시오).

제트기의 물리적 법칙(e * e < x x x + y * y + z * z)은 측정 오류의 가능성 때문에 invariant(불변성)이 아니다.

 

Enforcement

● pointer와 array을 확인해라. range check을 초기에 하고 반복하지 마라.

● 변환(conversion)을 확인해라. narrowing conversion을 제거하거나 표시해라.

● 입력으로 부터 check되지 않은 값들을 을 확인해라. 

● 문자열로 변환되는 구조화된 data(invariant가 있는 class들의 객체)을 확인해라. 

 

원본 출처

isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#p7-catch-run-time-errors-early

 

C++ Core Guidelines

 

isocpp.github.io

[C++] Philosophy 8: Don't leak any resources

 

Reason 심지어 자원의 느린 성장도 시간이 지남에 따라 자원의 가용성은 소모될 것이다. 이것은 장기간 운영되는 프로그램에서는 특히 중요하지만, 책임감 있는 프로그래밍 동작의 필수적인 부분이다.

 

Example, bad

RAII (Resource Acquisition Is Initialization)를 선호해라.

See also The resource management section

 

Note leak는 구어적으로 "cleaned up(깨끗하지 않은) 것은 무엇이든"이다. 더 중요한 분류는 "더 이상 청소할 수 없는 것은 무엇이든"이다. 예를 들어, heap에 object를 할당하고 나서 해당 할당을 가리키는 마지막 pointer를 잃어버린 경우. 이 규칙은 프로그램 종료 중에 long-lived(장수) object 내의 할당을 반환하도록 요구하는 것으로 간주해서는 안 된다. 예를 들어, 프로세스 종료 시 파일 닫기 및 메모리 할당 해제와 같은 system guaranteed cleanup(시스템 보장 정리)에 의존하면 코드를 단순화할 수 있다. 그러나 암묵적으로 정리하는 추상화에 의존하는 것은 그만큼 간단하고, 종종 더 안전할 수 있다.

 

Note lifetime safety profile(평생 안전 프로파일)을 시행하면 leak가 제거된다. RAII가 제공하는 resource safety(자원 안전)과 결합하면, (garbage를 발생시키지 않음으로써) 「garbage collection」의 필요성이 없어진다. 이를 type 및 bound profiles의 시행과 결합하면 도구를 통해 완벽한 type- 및 resource-safety(리소스 안전성)을 보장받을 수 있다.

 

Enforcement

● pointers를 봐라 : non owners(기본값)와 owners로 분류한다. 가능한 경우 onwer를 표준 라이브러리 리소스 핸들로 교체하십시오(위의 예시 참조). 또는 GSL의 owner를 사용하여 owner로 표시하십시오.

● naked new and delete를 봐라

● raw pointer를 반환하는 resource allocating function(fopen, malloc and strdup)를 봐라

 

원본 출처

isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#p8-dont-leak-any-resources

 

C++ Core Guidelines

 

isocpp.github.io

 

반응형

'프로그래밍' 카테고리의 다른 글

[C++] Philosophy 11, 12 & 13  (0) 2020.12.04
[C++] Philosophy 9 & 10  (0) 2020.12.03
[C++] Philosophy 5 & 6  (0) 2020.12.01
[C++] Philosophy 3 & 4  (0) 2020.11.30
[C++] Philosophy 1 & 2  (0) 2020.11.29