Chromium에서 금지된 C++ 기능들

2 weeks ago 7

  • Chromium 프로젝트는 최신 C++ 표준 기능의 사용 범위와 금지 항목을 명확히 정의해 코드 일관성과 보안성을 유지함
  • C++11~C++23까지 각 표준별로 허용·금지·검토(TBD) 상태가 구분되며, Abseil 라이브러리도 동일한 기준을 적용받음
  • 금지된 기능에는 std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules 등이 포함
  • 허용된 기능으로는 concepts, spaceship 연산자, designated initializer, std::to_underlying, std::ranges 알고리듬 등이 있음
  • 이 가이드는 Chromium과 하위 프로젝트 전체에 적용되며, 코드 안정성과 빌드 호환성 확보를 위한 핵심 기준으로 작동함

Chromium의 Modern C++ 사용 정책

  • Chromium은 최신 C++ 표준을 즉시 도입하지 않고, 도구체인 지원이 충분히 확보된 후 ‘초기 지원(initially supported)’ 상태로 지정
    • 이후 기능별로 허용(allowed) , 금지(banned) , 검토 중(TBD) 상태로 분류
  • 새로운 기능의 상태 변경은 cxx@chromium.org 메일링 리스트를 통해 제안 가능
  • 초기 지원 후 2년이 지나면, 명시적 검토를 거쳐 허용 또는 금지 목록으로 이동

C++11 금지 기능

  • 언어 기능: inline namespace, long long, 사용자 정의 리터럴(user-defined literals)
  • 라이브러리 기능: <chrono>, <regex>, <random> 엔진, <exception>, <ratio>, <thread> 등
    • 예외(exception)는 완전히 비활성화되어 있으며, noexcept만 허용
    • std::bind, std::function, std::shared_ptr, std::weak_ptr 대신 base::Bind, base::Callback, base::RefCounted 사용

C++17 금지 기능

  • UTF-8 문자 리터럴(u8) 금지, char8_t와의 호환성 문제 때문
  • 라이브러리 금지 항목:
    • 수학 특수함수, 병렬 알고리듬(parallel algorithms), std::any, std::byte, std::filesystem, std::pmr 메모리 리소스 등
    • 병렬 알고리듬은 libc++ 미지원 및 Chrome의 스레딩 모델과의 충돌 우려로 금지

C++20 허용 및 금지 기능

  • 허용된 언어 기능:
    • concepts, consteval, designated initializers, spaceship 연산자, [[likely]] , range-for 초기화 구문
  • 허용된 라이브러리 기능:
    • <bit>, <compare>, <concepts>, <numbers>, std::erase_if, std::ranges::subrange, std::to_underlying 등
  • 금지된 기능:
    • char8_t, modules, [[no_unique_address]] , std::bit_cast, <span>, std::bind_front, std::ranges::view_interface
  • 검토 중(TBD): coroutine, <format>, <source_location>, std::u8string

C++23 허용 및 검토 기능

  • 허용된 언어 기능: #elifdef, if consteval, 정적 연산자(static operator)
  • 허용된 라이브러리 기능: std::byteswap, std::basic_string::contains, std::to_underlying, std::ranges 확장 알고리듬
  • 검토 중 기능: std::expected, std::mdspan, std::generator, std::stacktrace, std::print, [[assume]], #warning 등

Abseil 라이브러리 정책

  • 금지된 Abseil 구성요소:
    • absl::any, absl::optional, absl::StatusOr, absl::Span, absl::FunctionRef, absl::Mutex, absl::Time, absl::btree_* 등
    • 대부분은 Chromium의 base 네임스페이스 구현체로 대체 (base::span, base::expected, base::Bind 등)
  • 검토 중(TBD): absl::linked_hash_set, absl::linked_hash_map

전반적 의미

  • Chromium은 표준 C++ 기능을 무조건 수용하지 않고, 빌드 안정성·보안·성능·코드 일관성을 기준으로 선별 적용
  • 금지된 기능 대부분은 중복 구현(base::) 또는 도구체인·ABI 호환성 문제로 인한 것
  • 이 가이드는 Chromium 생태계의 C++ 코드 품질 관리 기준서로, 오픈소스 협업 시 필수 참조 문서로 기능함

Read Entire Article