Resolver: validate vector swizzle index is valid

Bug: tint:217
Change-Id: Ie8988b68f43914d1b05d982c8aa6f8b7346e2d8f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52800
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
Antonio Maiorano 2021-06-01 00:37:40 +00:00 committed by Tint LUCI CQ
parent f534e9e692
commit 39c05a902f
3 changed files with 20 additions and 2 deletions

View File

@ -1983,6 +1983,12 @@ bool Resolver::MemberAccessor(ast::MemberAccessorExpression* expr) {
expr->member()->source().Begin() + swizzle.size()); expr->member()->source().Begin() + swizzle.size());
return false; return false;
} }
if (swizzle.back() >= vec->size()) {
diagnostics_.add_error("invalid vector swizzle member",
expr->member()->source());
return false;
}
} }
if (size < 1 || size > 4) { if (size < 1 || size > 4) {

View File

@ -1115,7 +1115,7 @@ TEST_F(ResolverTest, Expr_MemberAccessor_Struct_Alias) {
} }
TEST_F(ResolverTest, Expr_MemberAccessor_VectorSwizzle) { TEST_F(ResolverTest, Expr_MemberAccessor_VectorSwizzle) {
Global("my_vec", ty.vec3<f32>(), ast::StorageClass::kInput); Global("my_vec", ty.vec4<f32>(), ast::StorageClass::kInput);
auto* mem = MemberAccessor("my_vec", "xzyw"); auto* mem = MemberAccessor("my_vec", "xzyw");
WrapInFunction(mem); WrapInFunction(mem);

View File

@ -389,7 +389,7 @@ TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_BadChar) {
} }
TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_MixedChars) { TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_MixedChars) {
Global("my_vec", ty.vec3<f32>(), ast::StorageClass::kInput); Global("my_vec", ty.vec4<f32>(), ast::StorageClass::kInput);
auto* ident = create<ast::IdentifierExpression>( auto* ident = create<ast::IdentifierExpression>(
Source{{Source::Location{3, 3}, Source::Location{3, 7}}}, Source{{Source::Location{3, 3}, Source::Location{3, 7}}},
@ -417,6 +417,18 @@ TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_BadLength) {
EXPECT_EQ(r()->error(), "3:3 error: invalid vector swizzle size"); EXPECT_EQ(r()->error(), "3:3 error: invalid vector swizzle size");
} }
TEST_F(ResolverValidationTest, Expr_MemberAccessor_VectorSwizzle_BadIndex) {
Global("my_vec", ty.vec2<f32>(), ast::StorageClass::kInput);
auto* ident = create<ast::IdentifierExpression>(Source{{3, 3}},
Symbols().Register("z"));
auto* mem = MemberAccessor("my_vec", ident);
WrapInFunction(mem);
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(), "3:3 error: invalid vector swizzle member");
}
TEST_F(ResolverValidationTest, TEST_F(ResolverValidationTest,
Stmt_Loop_ContinueInLoopBodyBeforeDecl_UsageInContinuing) { Stmt_Loop_ContinueInLoopBodyBeforeDecl_UsageInContinuing) {
// loop { // loop {