Copilot Review Instructions for TinyGLTF
This document provides guidelines for reviewing code changes in the TinyGLTF repository.
Memory Safety
- Buffer Overflows: Check for proper bounds checking when accessing arrays, vectors, and buffers. Verify that buffer sizes are validated before read/write operations.
- Null Pointer Dereferences: Ensure all pointers are checked for null before dereferencing, especially when handling optional glTF fields.
- Memory Leaks: Verify proper resource management, including RAII patterns for file handles, image data, and dynamically allocated memory.
- Use-After-Free: Check for proper lifetime management of objects, especially when dealing with callbacks and asynchronous operations.
Error Handling
- File I/O: Verify that all file operations have proper error checking and meaningful error messages.
- JSON Parsing: Ensure JSON parsing errors are caught and reported with helpful context about the location and nature of the error.
- Resource Loading: Check that failures in loading images, buffers, and other resources are properly handled and don't cause crashes.
- Error Propagation: Verify that errors are properly propagated through the call stack with appropriate error messages.
glTF 2.0 Specification Compliance
- Required Fields: Ensure all required glTF fields are validated and present.
- Data Types: Verify that data types match the glTF specification (e.g., component types, accessor types).
- Constraints: Check that glTF constraints are enforced (e.g., valid ranges for enums, buffer stride requirements).
- Extensions: Verify proper handling of glTF extensions and that unknown extensions are handled gracefully.
- Validation: Ensure new features align with the glTF 2.0 specification from the Khronos Group.
Cross-Platform Compatibility
- Windows: Check for proper handling of Windows-specific issues (path separators, line endings, file operations).
- Linux: Verify compatibility with various Linux distributions and compilers (GCC, Clang).
- macOS: Ensure macOS-specific considerations are addressed (case-sensitive filesystems, Clang compatibility).
- Mobile Platforms: Consider Android and iOS compatibility where applicable.
- Endianness: Verify proper handling of byte order when reading binary data.
- Compiler Compatibility: Ensure code compiles with C++11 standard and supported compilers (MSVC, GCC, Clang).
Edge Cases in glTF Parsing
- Empty/Minimal Files: Verify handling of minimal valid glTF files.
- Large Files: Check for proper handling of large glTF files and buffers without memory exhaustion.
- Malformed Data: Ensure graceful handling of malformed or invalid glTF data.
- Missing Optional Fields: Verify correct behavior when optional glTF fields are absent.
- Edge Values: Check handling of boundary values (e.g., maximum buffer sizes, extreme floating-point values).
- Base64 Encoding: Verify proper handling of base64-encoded data URIs and invalid encodings.
Backwards Compatibility
- API Changes: Ensure public API changes maintain backwards compatibility or are properly deprecated.
- Breaking Changes: Flag any breaking changes for major version updates and document migration paths.
- Binary Compatibility: Consider ABI stability for header-only library changes.
- Default Behavior: Verify that default behavior of existing functionality remains unchanged.
Performance Considerations
- Parsing Performance: Check for unnecessary copies, redundant allocations, and inefficient algorithms in parsing logic.
- Memory Usage: Verify efficient memory usage, especially when loading large glTF files.
- I/O Operations: Ensure efficient file reading and minimize unnecessary disk access.
- String Operations: Check for efficient string handling (use of string_view, move semantics).
- STL Usage: Verify appropriate use of STL containers and algorithms.
Documentation
- Public API: Ensure all public functions, classes, and methods have clear documentation comments.
- Parameters: Verify that function parameters are documented, including expected ranges and constraints.
- Return Values: Document return values and possible error conditions.
- Examples: Check that complex features include usage examples.
- Changelog: Verify that significant changes are documented in release notes or changelog.
Testing
- Test Coverage: Ensure new features include appropriate unit tests or integration tests.
- Edge Cases: Verify that tests cover edge cases and error conditions.
- Cross-Platform Tests: Check that tests run on all supported platforms.
- Regression Tests: Ensure bug fixes include regression tests to prevent recurrence.
- Sample Files: Verify that changes are tested with various valid and invalid glTF sample files.
Code Style Consistency
- Header-Only Pattern: Maintain the header-only library structure.
- Naming Conventions: Follow existing naming conventions (CamelCase for types, snake_case for functions where applicable).
- Formatting: Adhere to the existing code formatting style (check
.clang-format if available). - Include Guards: Verify proper include guards and header organization.
- Namespace Usage: Ensure proper use of the
tinygltf namespace. - Comments: Maintain consistent comment style with existing code.
- C++11 Compliance: Verify that code uses C++11 features appropriately and doesn't require newer standards unless specified.
Additional Considerations
- Third-Party Dependencies: Minimize new dependencies; prefer existing dependencies (json.hpp, stb_image).
- Warnings: Ensure code compiles without warnings on supported compilers.
- const Correctness: Verify proper use of const for parameters and methods.
- RAII: Prefer RAII patterns for resource management over manual cleanup.
- noexcept: Use noexcept appropriately for move constructors and move assignment operators.