EXP : Expressions (EXP) - 표현식
표현식에 관한 내용을 다루는 카테고리입니다.
표현식은 변수, 상수, 연산자 등을 조합하여 값을 계산하는 방법을 나타냅니다.
프로그램에서 표현식을 올바르게 작성하고 계산하는 데 도움이 되는 규칙이 포함되어 있습니다.
Rule Number | Rule Definition | 설명 |
EXP05-C | const qualification을 제거하지 마십시오. | 포인터 유형의 객체에 대한 const qualification을 제거하지 마십시오. const qualification을 제거하면 프로그램이 포인터가 가리키는 객체를 수정할 수 있게 되어 정의되지 않은 동작을 유발할 수 있습니다. C 표준의 부록 J의 정의되지 않은 동작 64를 참조하십시오. |
EXP09-C | sizeof를 사용하여 유형 또는 변수의 크기 결정 | 유형(type)의 크기를 애플리케이션에 하드 코딩하지 마십시오. 정렬, 패딩 및 기본 유형의 차이(예: 32비트 포인터 대 64비트 포인터)로 인해 대부분의 유형의 크기는 컴파일러와 동일한 컴파일러 버전 간에도 다를 수 있습니다. sizeof 연산자를 사용하여 크기를 결정하면 의미의 명확성이 향상되고 컴파일러나 버전 간의 변경 사항이 코드에 영향을 주지 않습니다. |
EXP10-C | 하위 표현식의 평가 순서나 부작용이 발생하는 순서에 의존하지 마십시오. | 하위 표현식의 평가 순서와 부작용이 발생하는 순서는 C 표준에서 지정되지 않은 동작으로 정의되는 경우가 많습니다. 반직관적으로, 표준이 두 가지 이상의 가능성을 제공하고 어떤 경우에도 선택되는 추가 요구 사항을 부과하지 않는 동작의 지정되지 않은 동작입니다. 결과적으로, 서로 다른 구현이 서로 다른 선택을 할 수 있기 때문에 지정되지 않은 동작은 이식성 문제가 될 수 있습니다. 그러나 동적 스케줄링을 사용하는 경우 프로세스 수명 동안 고정 코드 실행 순서가 없을 수 있습니다. 다른 순서로 실행될 수 있는 작업은 실제로는 다른 순서로 실행될 수 있습니다. |
EXP11-C | 비트 필드가 있는 구조의 레이아웃에 관해 가정하지 마십시오. | 비트 필드 구조의 내부 표현에는 구현에 따라 정의되는 여러 속성(예: 내부 패딩)이 있습니다. 또한 비트 필드 구조에는 구현에 따라 정의된 여러 제약 조건이 있습니다. - 저장 단위의 비트 필드 정렬 (예: 저장 단위의 상위 또는 하위 끝에서 비트 필드가 할당될 수 있음) - 비트 필드가 저장 단위 경계와 겹칠 수 있는지 여부 결과적으로 비트 필드 구조 구성원의 레이아웃에 관해 가정하는 이식 가능한 안전한 코드를 작성하는 것은 불가능합니다. |
EXP12-C | 함수에서 반환된 값을 무시하지 마십시오. | 많은 함수는 함수에 부작용이 있는지 여부에 관계없이 유용한 값을 반환합니다. 대부분의 경우 이 값은 함수가 해당 작업을 성공적으로 완료했는지 또는 오류가 발생했는지 여부를 나타내는 데 사용됩니다(ERR02-C. 대역 내 오류 표시기 방지 참조). 다른 경우에는 값이 일부 계산의 결과이며 함수 API의 필수 부분입니다. |
EXP19-C | if, for 또는 while 문의 본문에 중괄호(Brace)를 사용하세요. | if, for 및 while 문에 대한 여는 중괄호와 닫는 중괄호(Brace)는 문 본문에 단일 문만 포함된 경우에도 항상 사용해야 합니다. if, while 또는 for 문이 매크로에 사용되는 경우 매크로 정의는 세미콜론으로 끝나서는 안 됩니다. 중괄호(Brace)는 코드의 통일성과 가독성을 향상시킵니다. 더 중요한 것은 단일 명령문만 포함하는 본문에 추가 명령문을 삽입할 때 들여쓰기가 구조에 대한 강력한(그러나 오해의 소지가 있는) 지침을 제공하기 때문에 중괄호 추가를 잊어버리기 쉽다는 것입니다. 중괄호(Brace)는 여러 문이 포함된 매크로가 적절하게 확장되도록 하는 데에도 도움이 됩니다.. |
EXP20-C | 성공 여부, 참과 거짓, 동등성을 판단하기 위해 명시적인 테스트를 수행합니다. | 코드의 가독성과 유지 관리성을 향상시키고 일반적인 규칙과의 호환성을 위해 성공, 참/거짓, 동일성을 결정하는 명시적 테스트를 수행합니다. 특히, 0이 아닌 값에 대한 테스트를 기본값으로 설정하지 마세요. |
EXP30-C | 부작용을 가진 표현의 평가 순서에 의존하지 마세요. | 표현식을 평가하면 부작용(side effect)이 발생할 수 있습니다. 시퀀스 지점으로 알려진 실행 중 특정 지점에서 이전 평가의 모든 부작용이 완료되고 후속 평가의 부작용이 아직 발생하지 않았습니다. 중간에 서열 지점(intervening sequence point)이 없는 한 부작용 평가 순서에 의존하지 마십시오. |
EXP33-C | 초기화되지 않은 메모리를 읽지 마십시오. | 지역(local), 자동(automatic) 변수는 초기화되기 전에 읽혀지면 예상치 못한 값을 가정합니다. C 표준, 6.7.9, 단락 10은 [ISO/IEC 9899:2011]을 지정합니다. |
EXP34-C | 널(null) 포인터를 역참조하지 마십시오. | 널 포인터 역참조는 정의되지 않은 동작입니다. 많은 플랫폼에서 널 포인터를 역참조하면 프로그램이 비정상적으로 종료되지만 표준에서는 이를 요구하지 않습니다. 널 포인터 역참조로 인해 발생한 코드 실행 악용의 예는 "Clever Attack Exploits Fully-Patched Linux Kernel"[Goodin 2009]을 참조하세요. |
EXP35-C | 임시 수명(temporary lifetime)이 있는 개체를 수정하지 마세요. | C11 표준[ISO/IEC 9899:2011]에서는 임시 수명(temporary lifetime)이라는 새로운 용어를 도입했습니다. 임시 수명을 가진 객체를 수정하는 것은 정의되지 않은 동작입니다. |
EXP37-C | 올바른 개수와 유형의 인수를 사용하여 함수를 호출하세요. | 잘못된 개수나 인수 유형을 사용하여 함수를 호출하지 마세요. C 표준은 정의와 호환되지 않는 선언을 사용하거나 잘못된 유형 또는 개수의 인수를 제공하여 함수를 호출한 결과로 정의되지 않은 동작(UB)이 발생할 수 있는 다섯 가지 고유한 상황을 식별합니다. - 포인터는 참조된 유형(6.3.2.3)과 호환되지 않는 유형의 함수를 호출하는 데 사용됩니다. - 범위에 함수 프로토타입이 없는 함수 호출의 경우 인수 수가 매개변수 수(6.5.2.2)와 동일하지 않습니다. - 함수가 함수 프로토타입으로 정의된 범위에서 함수 프로토타입 없이 함수를 호출하는 경우 프로토타입이 줄임표로 끝나거나 승격 후 인수 유형이 매개 변수 유형과 호환되지 않습니다(6.5.2.2). - 함수가 함수 프로토타입으로 정의되지 않은 범위에서 함수 프로토타입 없이 함수를 호출하는 경우 승격 후 인수 유형은 승격 후 매개 변수 유형과 호환되지 않습니다(특정 예외 있음)(6.5.2.2). - 함수는 호출된 함수를 나타내는 표현식(6.5.2.2)이 가리키는 (표현식의) 유형과 호환되지 않는 유형으로 정의됩니다. |
728x90
'소프트웨어 개발(SW Dev) > Rule(CERT C)' 카테고리의 다른 글
CERT C - FLT 규칙 목록 (1) | 2024.11.10 |
---|---|
CERT C - INT 규칙 목록 (0) | 2024.11.09 |
CERT C - DCL 규칙 목록 (0) | 2024.11.07 |
CERT C - PRE 규칙 목록 (0) | 2024.10.24 |
CERT C 규칙 카테고리(표) (0) | 2024.10.24 |
댓글