| # 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` |