pointer, assert

markyang92·2023년 2월 20일
0
  1. 주소에 저장된 자료형은?
  • char로 읽으면 char
  • int로 읽으면 int
  • float로 읽으면 float

  • pointer to an int (int 로의 포인터)
  • pointer to an int num_address

포인터 return

  • 지역 변수 주소 반환은 매우 위험
    지역 변수의가 사용한 '주소' 자체가 사라지는 것은 아님
    WARNING!은 뜸
  • dangling pointer

포인터 return이 가능한 경우

  • 전역 변수
  • 파일속 static 전역 변수
  • 함수 내 static 변수
  • 메모리에 생성한 데이터
  • 일단은 stack 할당 반환 XXX

assert

DCL-03. 상수 수식의 값을 테스트할 때는 static assertion을 사용해라

dynamic assert: assert()

  • dynamic assert(동적 assert) 기능으로 assert() 함수가 있다.
  • assertion 은 취약성이 될 수 있는 소프트웨어의 결점을 찾아 제거하는데 사용되는 효과적인 진단 도구이다.
  • 다만, assert() 을 사용하는 것은 몇 가지 제약이 존재한다.
  1. 일반적인 assertion 도구는 프로그램이 구동 중에 동작하므로 런타임 오버헤드 존재
  2. 일반적인 assertion 도구의 마지막 동작은 abort()를 호출하는 것이므로 서버, embedded 에서는 사용하기 어렵다.
    • assert()는 프로그램을 구동 중 강제 종료 시키기 때문에, 서버나 임베디드(e.g. 차)에서 사용하긴 힘듬

  • 그럼에도 불구하고 assert()는 엄청 써야한다

    편리하기 때문!!

assert의 side effect

  • assert와 함께 사용되는 표션식은 side effect를 가지면 안된다.
    • 이는 assert 함수가 매크로이기 때문
    • 매크로 함수 내에서 값의 할당, 증가, 감소, 메모리 접근, 함수 호출등은 unexpected behaviour
    • assert 내에서 증감 금지

1. 부적절한 코드

  • assert 내에서 증감 금지

1. 해결방법

  • 임시 변수를 따로 두거나 하여 assert 내에서 증감 방지

static assert: _Static_assert()

  • Static assert(정적 assert) 기능으로 _Static_assert()C11에서 지원

1. 해결방법

  • static assertion(C11)을 사용한다.


profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글