media: Remove deprecated BitReader pointer/size constructor
MERGED2026mediarefactor
2026. 8. 28.
jsy8315
media::BitReader 에 남아 있던 폐기 예정 생성자를 제거하고, 호출부 18곳을 base::span 기반으로 이전했습니다.
문제 설명
BitReader 에는 생성자가 두 개 있었습니다.
explicit BitReader(base::span<const uint8_t> data);
// DEPRECATED: Use the above `base::span` variant to avoid unsafe buffer usage.
// TODO(https://crbug.com/40284755): Remove this once the callers are gone.
BitReader(const uint8_t* data, int size);
- 아래쪽은 시작 주소와 길이를 도 컴파일러가 잡지 못합니다.BitReader r(bufA.data(), bufB.size()); 는 그대로 통과하고, 실행하면 남의 메모리를 읽습니다.
- 코드 주석이 직접 제거를 요청하고 있었습니다 — "호출부가 사라지면 이걸 제거하라".
해결 내용
1. 호출부 전수 조사 — 저장소 전체에서 구 생성자를 쓰는 곳 18군데를 찾았습니다.
2. container_names.cc 전면 전환 — 이 파일이 16곳으로 대부분이었습니다. BitReader 에 span 을 넘기려면 진입점인 DetermineContainer() 자체가 span 을 받아야 했고, 그 여파로 내부 Check*() 함수 27개의 시그니처가 모두 바뀌었습니다.
- static bool CheckAac(const uint8_t* buffer, int buffer_size) {
- while (offset + 6 < buffer_size) {
- BitReader reader(UNSAFE_TODO(buffer + offset), 6);
+ static bool CheckAac(base::span<const uint8_t> buffer) {
+ while (offset + 6 < buffer.size()) {
+ BitReader reader(buffer.subspan(offset, 6u));
포인터 산술(buffer + offset)이 사라지고 subspan() 이 경계를 검사합니다.
3. 생성자 삭제 — 호출부가 모두 사라진 뒤 bit_reader.h / .cc 에서 제거했습니다.
최종 규모는 12파일 +296 −298, UNSAFE_TODO 표시 72개 제거 / 1개 추가입니다.
테스트 방법
- media_unittests 9,760개 전부 통과 (macOS, 88초)
- CQ 드라이런 59/61 통과 (실패 2건은 인프라 문제)
배운 점
1. 전수 조사는 "이름"으로 해야 한다
호출부를 두 번 놓쳤습니다.
- 패치셋 1 — 18곳 누락. head -30 으로 잘린 출력을 전수 목록으로 착각했습니다.
- 패치셋 2 — 1곳 누락. BitReader 변수명( 형태만 검색해서 std::make_unique<BitReader>(a, b) 를 놓쳤습니다.
패턴을 정해놓고 찾으면 그 패턴 밖은 보이지 않습니다. 이름 자체를 저장소 전체에서 검색하고, 나온 결과를 하나도 빠짐없이 분류하는 쪽이 확실했습니다.
2. 로컬 빌드로 못 잡는 코드가 있다
media/gpu/v4l2/ 는 ChromeOS 전용이라 macOS 에서는 컴파일조차 되지 않습니다. 로컬에서 9,760개 테스트가 통과해도 그 파일은 손도 닿지 않은 상태였고, CQ 드라이런이 잡아줬습니다. 플랫폼별 코드는 grep 으로만 미리 확인할 수 있습니다.
3. 타입을 좁히면 숨어 있던 버그가 드러난다
ReadFile() 을 span 버전으로 바꾸자 실패가 -1 에서 nullopt 로 바뀌었고, ContainerNamesTest.FileCheckUNKNOWN 이 존재하지 않는 파일(media/test/data/README)을 읽고 있었다는 사실이 드러났습니다.
기존에는 -1 이 모든 크기 검사를 탈락시켜 kContainerUnknown 을 반환했고, 그게 마침 기대값이라 한 바이트도 읽지 않은 채 통과해 왔습니다.
이 발견은 머지 후 또 한 번 파장을 남겼습니다. 테스트가 실제로 파일을 읽게 되자 iOS/tvOS 앱 번들에 그 파일이 포함돼 있지 않다는 문제가 드러나 tvos-rel-fyi 가 실패했고, 멘토님이 https://crrev.com/c/8397049 로 테스트가 임시 파일을 직접 생성하도록 고쳐주셨습니다.
참고 자료
- https://crbug.com/40284755 — unsafe buffer 정리 우산 이슈
- https://crrev.com/c/8397049 — 후속 수정 (멘토님)
- Chromium 의 unsafe buffers 정리 방침 (https://chromium.googlesource.com/chromium/src/+/main/docs/unsafe_buffers.md)