Psalm 7 출시, taint 분석 기본 활성화하고 보안 분석 10배 빨라져
- Psalm 7이 타입 검사, 보안 분석, 죽은 코드 탐지를 한 번의 실행으로 합치면서 taint 분석이 기본으로 켜짐. taint를 비트마스크로 저장하고 함수별 요약으로 그래프를 계산해 최대 10배 빨라짐.
- TaintedNosql, TaintedLlmPrompt, TaintedUrlComponent/TaintedUrlPath 등 taint 종류가 새로 추가됨. php://input, STDIN, $_FILES, $_SERVER의 클라이언트 항목, getopt(), $argv, DNS 응답이 새 소스임.
- Hack의 capabilities를 본뜬 purity 모델로 함수가 일으키는 부작용(io, time, write-props)을 선언하고, 클래스와 클로저에는 purity 템플릿을 쓰거나 추론된 애노테이션을 붙임.
- 템플릿 기본값(@template TError of Throwable = RuntimeException) 덕에 Result 같은 타입이 그대로 동작하고, 라이브러리가 사용자를 깨뜨리지 않고 템플릿을 추가할 수 있음. 그래프 기반 죽은 코드 탐지는 순환 참조까지 처리함.
- PHPUnit, Symfony, Laravel, Mockery, sabre/event 플러그인이 기본 탑재되어 따로 설정하지 않아도 켜짐. 64비트 PHP 8.2~8.6에서 돌고 부분 함수 적용과 pipe 연산자를 지원하며, 릴리스는 매일 나옴.
Hacker News opinions
PHP가 내가 처음 혼자 배운 언어인데, 아직도 반환 타입에 PHPDoc 주석을 달아야 한다고? 기본적인 것도 언어 안에 안 들어와 있다는 게 이해가 안 감.
반환 타입 선언은 PHP 7부터 있었음. 지금은 교차 타입에 리터럴 타입까지 있고. 그것만 검색해도 바로 나왔을 텐데.
본문에도 네이티브 반환 타입 예제가 그대로 나오는데 그걸 못 본 건가?
PHP 기사가 핵노출되면 11년 전에 업보트 받은 댓글을 그대로 다시 붙여넣는 사람이 꼭 나옴.
PHP를 모르는 사람한테는 정적 분석이 사실상 필수임. 공식 타입 시스템이 빈약해서 array 같은 건 phpdoc로 list나 array<string, MyRecord>처럼 세부 타입을 적어야 하고, IDE 자동완성도 그 주석에 기대고 있음.
PHP 타입 시스템이 부족한 건 맞는데 최소라고 하기엔 유니온 타입도 있음. 진짜 문제는 배열 타입이 없다는 거고, 프로젝트가 별도 린트 도구를 끌어오는 이유의 90%가 그거임.
정적 분석은 Psalm과 PHPStan 둘이 대표인데 둘 다 PHP로 짜여 있음. 예전엔 PHPStan이 훨씬 느렸는데 지금은 10만 줄에 의존성까지 20초 정도로 비슷하더라.
Rust로 만든 Mago가 조만간 이 둘을 대체할 것 같음. analyze랑 lint 명령은 이미 Psalm, PHPStan만큼 갖춰져 있는데 레벨 개념이 없어서 갈아타기는 쉽지 않을 듯.
Rust로 갈아엎으라고 하는 사람들이 크립토 브로보다 더 성가심. 그게 기술적으로 가능한 일이긴 한가 싶고.