blob: e6daf70063bdcd6b8abd53c910e7e25ff581ecbf [file] [log] [blame] [view]
# Remaining -Wunsafe-buffer-usage Suppressions in Tint
This document summarizes and explains the remaining
`-Wunsafe-buffer-usage` and `-Wunsafe-buffer-usage-in-container`
suppressions in the Tint codebase.
## Categorization of Suppressions
### 1. Localization via `tint::Copy`
The `tint::Copy` utility in `src/tint/utils/memory/copy.h`
encapsulates `memcpy` calls.
- **Rationale**: `memcpy` is intrinsically unsafe but necessary for
performance-critical byte copying. By using `tint::Copy`, we
localize the suppressions to a single file and provide a safer API
that accepts `std::span`.
- **Affected Files**: `src/tint/utils/memory/copy.h`
### 2. Two-Parameter `std::span` Constructors
Clang's `-Wunsafe-buffer-usage-in-container` warning is triggered by
`std::span(ptr, size)`.
- **Rationale**: This is often unavoidable when interfacing with older
APIs (like `std::string_view::data()`) or when reinterpreting byte
buffers (e.g., `std::span<std::byte>` to `std::span<uint8_t>`). We
prefer this over raw pointer arithmetic as it still provides a
bound-checked view for subsequent operations.
- **Affected Files**:
- `src/tint/utils/bytes/buffer_reader.h`
- `src/tint/utils/text/unicode.cc`
### 3. Tight Loops and Performance-Critical Indexing
In some performance-critical code (like UTF-8 decoding), we use
`UNSAFE_BUFFER_USAGE_IN_CONTAINER` to allow standard indexing after
manual bounds checks.
- **Rationale**: While `span::at()` or other methods might be safer,
standard indexing `[]` is preferred in certain Tint utilities for
consistency and to avoid the overhead of redundant checks where we
have already validated the size.
- **Affected Files**:
- `src/tint/utils/text/unicode.cc`
- `src/tint/utils/containers/vector.h`
### 4. External API Interfacing
Code that interfaces with C-style external APIs (like
`std::from_chars` or terminal IO) requires raw pointers.
- **Rationale**: `std::from_chars` requires a pointer to
one-past-the-end of the buffer. This pattern is inherently flagged
but necessary to use the standard library feature.
- **Affected Files**:
- `src/tint/lang/wgsl/reader/parser/lexer.cc` (for `line_end()`)
- `src/tint/utils/system/terminal_posix.cc`
### 5. Custom Containers
Some foundational Tint containers (`Vector`, `HashMap`,
`BlockAllocator`) still contain suppressions.
- **Rationale**: These are complex, low-level memory management
utilities where unsafe buffer usage is part of the implementation of
the container itself. Refactoring these requires deep architectural
changes beyond the scope of this effort.
- **Affected Files**:
- `src/tint/utils/containers/vector.h`
- `src/tint/utils/containers/hashmap_base.h`
- `src/tint/utils/memory/block_allocator.h`
- `src/tint/utils/memory/bump_allocator.h`