Fix result type check in ValidateImageTexelPointer (#5848)

Fixes https://crbug.com/oss-fuzz/42537207

* Fix check and messages in ValidateImageTexelPointer
This commit is contained in:
alan-baker 2024-10-10 14:10:07 -04:00 committed by GitHub
parent fcf994a619
commit 42b315c15b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 9 deletions

View File

@ -1134,15 +1134,15 @@ spv_result_t ValidateImageTexelPointer(ValidationState_t& _,
const Instruction* inst) {
const auto result_type = _.FindDef(inst->type_id());
if (result_type->opcode() != spv::Op::OpTypePointer &&
result_type->opcode() == spv::Op::OpTypeUntypedPointerKHR) {
result_type->opcode() != spv::Op::OpTypeUntypedPointerKHR) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Expected Result Type to be OpTypePointer";
<< "Expected Result Type to be a pointer";
}
const auto storage_class = result_type->GetOperandAs<spv::StorageClass>(1);
if (storage_class != spv::StorageClass::Image) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Expected Result Type to be OpTypePointer whose Storage Class "
<< "Expected Result Type to be a pointer whose Storage Class "
"operand is Image";
}
@ -1157,7 +1157,7 @@ spv_result_t ValidateImageTexelPointer(ValidationState_t& _,
_.HasCapability(spv::Capability::AtomicFloat16VectorNV) &&
_.IsFloat16Vector2Or4Type(ptr_type))) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Expected Result Type to be OpTypePointer whose Type operand "
<< "Expected Result Type to be a pointer whose Type operand "
"must be a scalar numerical type or OpTypeVoid";
}
}

View File

@ -1380,7 +1380,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotPointer) {
CompileSuccessfully(GenerateShaderCode(body).c_str());
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Expected Result Type to be OpTypePointer"));
HasSubstr("Expected Result Type to be a pointer"));
}
TEST_F(ValidateImage, ImageTexelPointerResultTypeNotImageClass) {
@ -1392,7 +1392,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotImageClass) {
CompileSuccessfully(GenerateShaderCode(body).c_str());
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Expected Result Type to be OpTypePointer whose "
HasSubstr("Expected Result Type to be a pointer whose "
"Storage Class operand is Image"));
}
@ -1406,7 +1406,7 @@ TEST_F(ValidateImage, ImageTexelPointerResultTypeNotNumericNorVoid) {
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(
getDiagnosticString(),
HasSubstr("Expected Result Type to be OpTypePointer whose Type operand "
HasSubstr("Expected Result Type to be a pointer whose Type operand "
"must be a scalar numerical type or OpTypeVoid"));
}
@ -6310,7 +6310,7 @@ TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotPointer) {
.c_str());
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Expected Result Type to be OpTypePointer"));
HasSubstr("Expected Result Type to be a pointer"));
}
TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotImageClass) {
@ -6326,7 +6326,7 @@ TEST_F(ValidateImage, ImageTexelPointer64ResultTypeNotImageClass) {
.c_str());
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Expected Result Type to be OpTypePointer whose "
HasSubstr("Expected Result Type to be a pointer whose "
"Storage Class operand is Image"));
}
@ -10875,6 +10875,28 @@ OpFunctionEnd
"Image operands must match result image operands except for depth"));
}
TEST_F(ValidateImage, ImageTexelPointerNotAPointer) {
const std::string code = R"(
OpCapability ClipDistance
OpMemoryModel Logical Simple
%void = OpTypeVoid
%57 = OpTypeFunction %void
%int = OpTypeInt 32 1
%int_538976288 = OpConstant %int 538976288
%int_538976288_0 = OpConstant %int 538976288
%8224 = OpFunction %void None %57
%65312 = OpLabel
%2097184 = OpImageTexelPointer %void %int_538976288 %int_538976288 %int_538976288_0
OpUnreachable
OpFunctionEnd
)";
CompileSuccessfully(code);
EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Expected Result Type to be a pointer"));
}
} // namespace
} // namespace val
} // namespace spvtools