C++ 고급 문법 (1) — 함수 오버로딩(Function Overloading)
C에서는 정수를 출력하는 함수와 실수를 출력하는 함수를 print_int, print_double처럼 이름을 나눠 만들어야 한다. C++은 이름이 같고 매개변수 목록만 다른 함수를 여러 개 둘 수 있다. 이것이 함수 오버로딩(function overloading)이다. 편리하지만…
C에서는 정수를 출력하는 함수와 실수를 출력하는 함수를 print_int, print_double처럼 이름을 나눠 만들어야 한다. C++은 이름이 같고 매개변수 목록만 다른 함수를 여러 개 둘 수 있다. 이것이 함수 오버로딩(function overloading)이다. 편리하지만…
정수 오버플로나 배열 범위 밖 접근처럼 C의 미정의 동작(undefined behavior)은 대개 크래시 없이 조용히 지나간다. 컴파일 경고로 잡히는 것은 상수로 접근하는 뻔한 경우뿐이고, 인덱스나 시프트 값이 런타임에 결정되면 경고가 나오지…
-O0에서 잘 돌던 코드가 -O2로 올리면 값이 달라진다. 디버거로 들여다보면 메모리에는 올바른 값이 들어 있는데 함수가 엉뚱한 값을 반환한다. 대개 범인은 두 가지다. 서로 다른 타입의 포인터로 같은 메모리를 건드리는…
빌드 스크립트를 돌리면 로그는 파일에 남겨야 하는데 진행 상황은 화면으로 봐야 하고, 두 명령의 출력을 비교하려면 임시 파일을 두 개 만들어야 하고, while read로 센 개수가 루프를 벗어나면 0으로 돌아와…
공유 라이브러리는 프로세스마다 다른 주소에 올라간다. ASLR이 켜져 있으면 같은 libc.so.6도 실행할 때마다 위치가 바뀐다. 그런데 .text는 읽기 전용으로 매핑되어 여러 프로세스가 물리 페이지를 공유하므로, call printf의 피연산자에 실제 주소를…
셸 스크립트에서 파일 이름의 확장자를 떼거나 경로에서 디렉터리만 뽑을 때 습관적으로 basename, dirname, sed, tr을 호출하곤 한다. 한두 번이면 문제없지만 수천 개 파일을 도는 루프 안에서는 명령마다 프로세스가 새로 뜨면서…
매크로(macro)는 함수 호출 비용 없이 코드를 재사용하고, 타입에 상관없이 동작하는 코드를 만들 수 있어 C에서 자주 쓰인다. 문제는 전처리기가 문법을 이해하지 않고 토큰을 그대로 치환한다는 점이다. SQUARE(1 + 2)가 5가…
subprocess로 ssh에 비밀번호를 흘려넣으면 실패한다. 프로그램이 stdin이 아니라 제어 터미널에서 비밀번호를 읽기 때문이다. 같은 이유로 파이프에 물린 자식은 출력 버퍼링이 달라져 진행 상황이 실시간으로 안 보이고, bash -i는 프롬프트조차 띄우지…
권한이 있는 프로세스만 열 수 있는 파일이나 소켓을, 정작 일은 권한 없는 프로세스가 처리해야 하는 구조가 종종 필요하다. 경로만 넘겨주고 상대가 다시 open()하게 하면 권한이 없어 실패하거나, 그 사이 파일이…
로그 압축, 이미지 변환, 체크섬 검증처럼 파일 수백 개를 도는 배치 스크립트를 for 루프로 짜면 코어가 6개든 32개든 하나만 쓴다. &로 전부 백그라운드에 던지면 이번엔 수백 개 프로세스가 한꺼번에 떠…