[tint][wgsl][printer] Fix heap use after free
The padding names need to be std::string, not std::string_view as some strings have a shorter lifespan than the set.
Issue: chromium:1468848
Change-Id: I3eb20087389184b6dd87c6d562b1c19f7e7cee14
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/145260
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Auto-Submit: Ben Clayton <bclayton@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
index 1e5f029..815442a 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
@@ -334,9 +334,9 @@
}
Line() << "struct " << str->name->symbol.Name() << " {";
- Hashset<std::string_view, 8> member_names;
+ Hashset<std::string, 8> member_names;
for (auto* mem : str->members) {
- member_names.Add(mem->name->symbol.NameView());
+ member_names.Add(std::string(mem->name->symbol.NameView()));
}
size_t padding_idx = 0;
auto new_padding_name = [&] {
diff --git a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
index d875905..cca9f8b4 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
@@ -205,6 +205,67 @@
)");
}
+TEST_F(WgslASTPrinterTest, EmitType_StructOffsetDecl_ExceedStaticVectorSize) {
+ auto* s = Structure("S", Vector{
+ Member("a", ty.i32(), Vector{MemberOffset(i32(8 * 0))}),
+ Member("b", ty.i32(), Vector{MemberOffset(i32(8 * 1))}),
+ Member("c", ty.i32(), Vector{MemberOffset(i32(8 * 2))}),
+ Member("d", ty.i32(), Vector{MemberOffset(i32(8 * 3))}),
+ Member("e", ty.i32(), Vector{MemberOffset(i32(8 * 4))}),
+ Member("f", ty.i32(), Vector{MemberOffset(i32(8 * 5))}),
+ Member("g", ty.i32(), Vector{MemberOffset(i32(8 * 6))}),
+ Member("h", ty.i32(), Vector{MemberOffset(i32(8 * 7))}),
+ Member("i", ty.i32(), Vector{MemberOffset(i32(8 * 8))}),
+ Member("j", ty.i32(), Vector{MemberOffset(i32(8 * 9))}),
+ });
+
+ ASTPrinter& gen = Build();
+
+ gen.EmitStructType(s);
+ EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
+ EXPECT_EQ(gen.Result(), R"(struct S {
+ /* @offset(0i) */
+ a : i32,
+ @size(4)
+ padding_0 : u32,
+ /* @offset(8i) */
+ b : i32,
+ @size(4)
+ padding_1 : u32,
+ /* @offset(16i) */
+ c : i32,
+ @size(4)
+ padding_2 : u32,
+ /* @offset(24i) */
+ d : i32,
+ @size(4)
+ padding_3 : u32,
+ /* @offset(32i) */
+ e : i32,
+ @size(4)
+ padding_4 : u32,
+ /* @offset(40i) */
+ f : i32,
+ @size(4)
+ padding_5 : u32,
+ /* @offset(48i) */
+ g : i32,
+ @size(4)
+ padding_6 : u32,
+ /* @offset(56i) */
+ h : i32,
+ @size(4)
+ padding_7 : u32,
+ /* @offset(64i) */
+ i : i32,
+ @size(4)
+ padding_8 : u32,
+ /* @offset(72i) */
+ j : i32,
+}
+)");
+}
+
TEST_F(WgslASTPrinterTest, EmitType_StructOffsetDecl_WithSymbolCollisions) {
auto* s = Structure("S", Vector{
Member("tint_0_padding", ty.i32(), Vector{MemberOffset(8_a)}),