fix: segfaults in Validation Layer for Zer API's by vishnu-khanth · Pull Request #392 · oneapi-src/level-zero

3 changes: 3 additions & 0 deletions scripts/templates/validation/param.cpp.mako

Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@ namespace validation_layer
ZEParameterValidation *zeChecker = new ZEParameterValidation;
ZESParameterValidation *zesChecker = new ZESParameterValidation;
ZETParameterValidation *zetChecker = new ZETParameterValidation;
ZERParameterValidation *zerChecker = new ZERParameterValidation;
parameterChecker.zeValidation = zeChecker;
parameterChecker.zetValidation = zetChecker;
parameterChecker.zesValidation = zesChecker;
parameterChecker.zerValidation = zerChecker;
validation_layer::context.getInstance().validationHandlers.push_back(&parameterChecker);
}
}
Expand All @@ -44,6 +46,7 @@ namespace validation_layer
delete parameterChecker.zeValidation;
delete parameterChecker.zetValidation;
delete parameterChecker.zesValidation;
delete parameterChecker.zerValidation;
}
}
%endif
Expand Down

5 changes: 4 additions & 1 deletion source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
Expand All @@ -23,9 +23,11 @@ namespace validation_layer
basic_leakChecker::ZEbasic_leakChecker *zeChecker = new basic_leakChecker::ZEbasic_leakChecker;
basic_leakChecker::ZESbasic_leakChecker *zesChecker = new basic_leakChecker::ZESbasic_leakChecker;
basic_leakChecker::ZETbasic_leakChecker *zetChecker = new basic_leakChecker::ZETbasic_leakChecker;
basic_leakChecker::ZERbasic_leakChecker *zerChecker = new basic_leakChecker::ZERbasic_leakChecker;
basic_leak_checker.zeValidation = zeChecker;
basic_leak_checker.zetValidation = zetChecker;
basic_leak_checker.zesValidation = zesChecker;
basic_leak_checker.zerValidation = zerChecker;
validation_layer::context.getInstance().validationHandlers.push_back(&basic_leak_checker);
}
}
Expand All @@ -35,6 +37,7 @@ namespace validation_layer
delete basic_leak_checker.zeValidation;
delete basic_leak_checker.zetValidation;
delete basic_leak_checker.zesValidation;
delete basic_leak_checker.zerValidation;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ certificationChecker::certificationChecker() {
new certificationChecker::ZEScertificationChecker;
certificationChecker::ZETcertificationChecker *zetChecker =
new certificationChecker::ZETcertificationChecker;
certificationChecker::ZERcertificationChecker *zerChecker =
new certificationChecker::ZERcertificationChecker;
ze_api_version_t certification_version = ZE_API_VERSION_CURRENT;
const auto certification_version_string =
getenv_string("ZEL_CERTIFICATION_CHECKER_VERSION");
Expand All @@ -38,6 +40,7 @@ certificationChecker::certificationChecker() {
certification_checker.zeValidation = zeChecker;
certification_checker.zetValidation = zetChecker;
certification_checker.zesValidation = zesChecker;
certification_checker.zerValidation = zerChecker;
validation_layer::context.getInstance().validationHandlers.push_back(
&certification_checker);
}
Expand All @@ -48,6 +51,7 @@ certificationChecker::~certificationChecker() {
delete certification_checker.zeValidation;
delete certification_checker.zetValidation;
delete certification_checker.zesValidation;
delete certification_checker.zerValidation;
}
}

Expand Down

5 changes: 4 additions & 1 deletion source/layers/validation/checkers/events_checker/zel_events_checker.cpp

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
Expand All @@ -21,9 +21,11 @@ eventsChecker::eventsChecker() {
eventsChecker::ZEeventsChecker *zeChecker = new eventsChecker::ZEeventsChecker;
eventsChecker::ZESeventsChecker *zesChecker = new eventsChecker::ZESeventsChecker;
eventsChecker::ZETeventsChecker *zetChecker = new eventsChecker::ZETeventsChecker;
eventsChecker::ZEReventsChecker *zerChecker = new eventsChecker::ZEReventsChecker;
events_checker.zeValidation = zeChecker;
events_checker.zesValidation = zesChecker;
events_checker.zetValidation = zetChecker;
events_checker.zerValidation = zerChecker;

validation_layer::context.getInstance().validationHandlers.push_back(&events_checker);
}
Expand All @@ -34,6 +36,7 @@ eventsChecker::~eventsChecker() {
delete events_checker.zeValidation;
delete events_checker.zesValidation;
delete events_checker.zetValidation;
delete events_checker.zerValidation;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ namespace validation_layer
ZEParameterValidation *zeChecker = new ZEParameterValidation;
ZESParameterValidation *zesChecker = new ZESParameterValidation;
ZETParameterValidation *zetChecker = new ZETParameterValidation;
ZERParameterValidation *zerChecker = new ZERParameterValidation;
parameterChecker.zeValidation = zeChecker;
parameterChecker.zetValidation = zetChecker;
parameterChecker.zesValidation = zesChecker;
parameterChecker.zerValidation = zerChecker;
validation_layer::context.getInstance().validationHandlers.push_back(&parameterChecker);
}
}
Expand All @@ -34,6 +36,7 @@ namespace validation_layer
delete parameterChecker.zeValidation;
delete parameterChecker.zetValidation;
delete parameterChecker.zesValidation;
delete parameterChecker.zerValidation;
}
}

Expand Down

5 changes: 4 additions & 1 deletion source/layers/validation/checkers/template/zel_template_checker.cpp

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
Expand All @@ -18,9 +18,11 @@ namespace validation_layer
validationCheckerTemplate::ZEvalidationCheckerTemplate *zeChecker = new validationCheckerTemplate::ZEvalidationCheckerTemplate;
validationCheckerTemplate::ZESvalidationCheckerTemplate *zesChecker = new validationCheckerTemplate::ZESvalidationCheckerTemplate;
validationCheckerTemplate::ZETvalidationCheckerTemplate *zetChecker = new validationCheckerTemplate::ZETvalidationCheckerTemplate;
validationCheckerTemplate::ZERvalidationCheckerTemplate *zerChecker = new validationCheckerTemplate::ZERvalidationCheckerTemplate;
templateChecker.zeValidation = zeChecker;
templateChecker.zetValidation = zetChecker;
templateChecker.zesValidation = zesChecker;
templateChecker.zerValidation = zerChecker;
validation_layer::context.getInstance().validationHandlers.push_back(&templateChecker);
}
}
Expand All @@ -30,6 +32,7 @@ namespace validation_layer
delete templateChecker.zeValidation;
delete templateChecker.zetValidation;
delete templateChecker.zesValidation;
delete templateChecker.zerValidation;
}
}

Expand Down

5 changes: 4 additions & 1 deletion source/layers/validation/checkers/template/zel_template_checker.h

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
*
* Copyright (C) 2024 Intel Corporation
* Copyright (C) 2024-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
Expand Down Expand Up @@ -33,6 +33,9 @@ namespace validation_layer
public:
ze_result_t zetModuleGetDebugInfoPrologue( zet_module_handle_t hModule, zet_module_debug_info_format_t format, size_t* pSize, uint8_t* pDebugInfo ) override;
};
class ZERvalidationCheckerTemplate : public ZERValidationEntryPoints {
public:
};
bool enableValidationCheckerTemplate = false;
};
extern class validationCheckerTemplate templateChecker;
Expand Down

4 changes: 3 additions & 1 deletion source/lib/error_state.cpp

Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ namespace error_state
{
errorDescs[threadId] = std::string();
}
*ppString = errorDescs[threadId].c_str();
if(ppString != nullptr) {
*ppString = errorDescs[threadId].c_str();
}
}
}

9 changes: 8 additions & 1 deletion test/CMakeLists.txt

Original file line number Diff line number Diff line change
Expand Up @@ -701,4 +701,11 @@ add_test(NAME test_ze_and_zer_tracing_dynamic COMMAND tests --gtest_filter=*Trac
set_property(TEST test_ze_and_zer_tracing_dynamic PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")

add_test(NAME test_zer_unsupported_and_ze_tracing_dynamic COMMAND tests --gtest_filter=*TracingParameterizedTest*GivenLoaderWithDynamicTracingEnabledAndZerApisUnsupportedAndBothZeAndZerCallbacksRegisteredWhenCallingBothApisThenTracingWorksForZeOnly*)
set_property(TEST test_zer_unsupported_and_ze_tracing_dynamic PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
set_property(TEST test_zer_unsupported_and_ze_tracing_dynamic PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")

# ZER API Validation Layer Tests
add_test(NAME test_zer_validation_layer_positive_case COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisAfterZeInitDriversThenExpectNullDriverIsReachedSuccessfully)
set_property(TEST test_zer_validation_layer_positive_case PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;ZE_ENABLE_VALIDATION_LAYER=1;ZE_ENABLE_PARAMETER_VALIDATION=1;ZE_ENABLE_HANDLE_LIFETIME=0;ZEL_ENABLE_EVENTS_CHECKER=1;ZEL_ENABLE_BASIC_LEAK_CHECKER=1;ZEL_ENABLE_CERTIFICATION_CHECKER=1")

add_test(NAME test_zer_parameter_validation_layer_negative_case COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingZerApiWithParameterValidationEnabledThenExpectValidationsAreTriggered)
set_property(TEST test_zer_parameter_validation_layer_negative_case PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;ZE_ENABLE_VALIDATION_LAYER=1;ZE_ENABLE_PARAMETER_VALIDATION=1;ZE_ENABLE_HANDLE_LIFETIME=1;ZEL_ENABLE_EVENTS_CHECKER=1;ZEL_ENABLE_BASIC_LEAK_CHECKER=1;ZEL_ENABLE_CERTIFICATION_CHECKER=1")

6 changes: 5 additions & 1 deletion test/loader_api.cpp

Original file line number Diff line number Diff line change
Expand Up @@ -2311,7 +2311,11 @@ TEST_F(DriverOrderingTest,
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(compare_env("zerGetLastErrorDescription", "1"));

deviceId = zerTranslateDeviceHandleToIdentifier(nullptr);
uint32_t device_count = 1;
std::vector<ze_device_handle_t> devices(device_count);
EXPECT_EQ(ZE_RESULT_SUCCESS, zeDeviceGet(drivers[0], &device_count, devices.data()));

deviceId = zerTranslateDeviceHandleToIdentifier(devices[0]);
EXPECT_TRUE(compare_env("zerTranslateDeviceHandleToIdentifier", "1"));

ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId);
Expand Down

21 changes: 21 additions & 0 deletions test/loader_validation_layer.cpp

Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "gtest/gtest.h"
#include "loader/ze_loader.h"
#include "ze_api.h"
#include "zer_api.h"

#if defined(_WIN32)
#define putenv_safe _putenv
Expand Down Expand Up @@ -581,3 +582,23 @@ TEST(
status = zeContextDestroy(context);
EXPECT_EQ(ZE_RESULT_SUCCESS, status);
}

TEST(
RuntimeApiParameterValidation,
GivenLevelZeroLoaderPresentWhenCallingZerApiWithParameterValidationEnabledThenExpectValidationsAreTriggered)
{
uint32_t pInitDriversCount = 0;
ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC};
desc.flags = UINT32_MAX;
desc.pNext = nullptr;
putenv_safe(const_cast<char *>("ZE_ENABLE_LOADER_INTERCEPT=1"));
putenv_safe(const_cast<char *>("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=0"));
std::vector<ze_driver_handle_t> drivers;
EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc));
drivers.resize(pInitDriversCount);
EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc));
EXPECT_GT(pInitDriversCount, 0);

ze_result_t result = zerGetLastErrorDescription(nullptr);
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_NULL_POINTER, result);
}