EmbarkStudios / rust-gpu

🐉 Making Rust a first-class language and ecosystem for GPU shaders 🚧
https://shader.rs
Apache License 2.0
7.35k stars 245 forks source link

Incorrect index validation #1093

Open atynagano opened 1 year ago

atynagano commented 1 year ago

https://github.com/EmbarkStudios/rust-gpu/blob/e87c324bfda6bea144fe2635586281c4ef144f0d/crates/spirv-std/src/byte_addressable_buffer.rs#L73-L78

if byte_index + mem::size_of::<T>() as u32 > (mem::size_of::<u32> * self.data.len()) as u32

Isn't the right-hand side multiplied by 4 because data is &[u32]?

Patryk27 commented 1 year ago

ByteAddressableBuffer requires for the data to be aligned to 4 bytes, so the current condition is fine IMO; the naming could be better (word_index: u32), but the comment above explains it's inherited from HLSL.

Note that buffer_load_intrinsic() ends up doing 4 * byte_index:

https://github.com/EmbarkStudios/rust-gpu/blob/e87c324bfda6bea144fe2635586281c4ef144f0d/crates/rustc_codegen_spirv/src/builder/byte_addressable_buffer.rs#L202

atynagano commented 1 year ago

So does the left side size_of<T> needs to be divided by 4? Or does size_of returns dword size?

Patryk27 commented 1 year ago

Oh, yeah - I think it should say mem::size_of::<T>() / 4 then 🤔