Trawling

개발 · 최신기사

언어와 프레임워크, SDK와 개발 방식·도구의 변화를 다룹니다.

발행

또 하나의 부정확한 Linux 매뉴얼 페이지

글쓴이는 glibc의 initstate()가 오류 때 NULL을 반환하지 않는다는 기존 주장을 정정합니다. 실제로는 2013년에 동작이 수정됐지만 매뉴얼의 설명은 갱신되지 않았으며, POSIX가 이 함수의 오류 조건을 정의하지 않는다는 점도 빠져 있습니다.

발행

antcc의 -O2 성능 저하를 추적하다

C 컴파일러 antcc에서 Lua 벤치마크가 -O2로 더 느려지는 원인을 추적합니다. mem2reg가 루프 안의 초기화되지 않은 지역 변수를 잘못 처리해 불필요한 phi 노드를 만들었고, 레지스터 압박과 스필링이 늘어났습니다. alloca 처리 한 줄을 고쳐 성능 저하가 사라졌습니다.

발행

제로화 1부: 메모리 지우기가 오히려 상황을 악화할 수 있습니다

비밀값을 지우려고 넣은 코드가 컴파일러 최적화나 함수 호출 규약 때문에 효과를 내지 못하고, 오히려 메모리에 복사본을 만들기도 합니다. 글은 C와 arm64 컴파일 결과를 비교하며, 버퍼 삭제는 계속하되 작은 지역 변수는 실제로 어디에 저장되고 무엇이 남는지 확인하라고 설명합니다.

발행

이름을 쓰지 않고 C 함수 호출하기

학교의 자동 채점 환경에서 허용되지 않은 C 함수를 직접 호출하는 과정을 설명합니다. ASan이 바꿔치기한 함수와 libc 함수의 메모리 배치를 이용해 주소를 계산하고, 실행 권한이 있는 메모리에서 시스템 호출을 수행하는 방식입니다.

발행

Forisek–Jancina 방식으로 32비트 정수를 빠르게 소수 판정하기

Forisek와 Jancina가 제안한 결정론적 소수 판정법은 32비트 정수에서 소수 2, 3, 5, 7로 나누어 확인한 뒤 해시로 밑을 고르고 강한 probable-prime 검사를 수행합니다. 밑을 담은 조회 테이블은 512바이트만 차지하며, 글에는 C 구현이 실려 있습니다.

발행

C의 유연한 정수 크기는 설계 실수가 아니었습니다

C의 int와 long이 고정된 비트 수를 보장하지 않는 이유를 1970년대의 다양한 컴퓨터 구조와 C의 이식성 목표에서 설명합니다. 글은 최소 범위를 보장하면서 하드웨어에 맞춰 타입 크기를 정한 선택이 당시에는 효율적인 코드 생성과 여러 기종 지원에 도움이 됐다고 주장하고, 오늘날의 고정 폭 정수 타입과 남은 불편도 함께 다룹니다.

발행

10년간 GCC와 Clang 성능은 어떻게 달라졌나

GCC 4~16과 Clang 3~23으로 50개 테스트를 담은 C 벤치마크를 빌드해 실행 시간과 컴파일 시간을 비교했습니다. GCC는 실행 시간이 5% 줄었지만 컴파일 시간은 66% 늘었고, Clang은 각각 8%, 4% 줄었습니다.