VkCreateInstance — realloc() с размером 0 — ошибка valgrind ⇐ C++
-
Гость
VkCreateInstance — realloc() с размером 0 — ошибка valgrind
Я тестирую память своего движка с помощью valgrind и столкнулся со странной ошибкой realloc() с размером 0. Это происходит с различными версиями libnvidia-eglcore.so, поэтому я могу исключить, что это не проблема с драйвером.
Мой код для createInstance:
void Instance::createInstance() { VkApplicationInfo appInfo {}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = title.c_str(); appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName = "Coje"; appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion = VK_API_VERSION_1_0; VkInstanceCreateInfo createInfo {}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; // uint32_t ExtensionCount = 0; константный байт **extensions = 0; Memory::allocate(0, 2, Extensions, ExtensionCount, 0, false); Extensions[0] = "VK_KHR_surface"; #если определено(_Linux) расширения[1] = "VK_KHR_xlib_surface"; #elif определено (_Android) Extensions[1] = "VK_KHR_android_surface"; #endif если (enableValidationLayers) { индекс uInteger64 = ExtensionCount; Memory::allocate(index, 1, Extensions, ExtensionCount, 0, false); расширения[индекс] = "VK_EXT_debug_utils"; } createInfo.enabledExtensionCount = ExtensionCount; createInfo.ppEnabledExtensionNames = расширения; // VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo {}; uint32_t LayerCount = 0; константный байт **layers = 0; если (enableValidationLayers && checkValidationLayersSupport()) { Memory::allocate(layerCount, 1, Layers, LayerCount, 0, false); Layers[0] = "VK_LAYER_KHRONOS_validation"; createInfo.enabledLayerCount = LayerCount; createInfo.ppEnabledLayerNames = слои; populateDebugMessengerCreateInfo (debugCreateInfo); createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT *)&debugCreateInfo; } еще { если (enableValidationLayers) { Printf("%s\n", "Слои проверки запрошены, но недоступны"); } createInfo.enabledLayerCount = 0; } Распределитель VkAllocationCallbacks = createAllocator("Экземпляр"); Логическое значение createInstance = VKcq("vkCreateInstance", vkCreateInstance(&createInfo, &allocator, &instance)); Memory::releaseObject(ReleaseType::Free, Extensions, ExtensionCount); если (enableValidationLayers) { Memory::releaseObject(ReleaseType::Free, Layers, LayerCount); } если (!createInstance) { throw «не удалось создать экземпляр!»; } возвращаться; }; void Instance::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo) { createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; createInfo.pfnUserCallback = debugCallback; }; Ошибка в valigrind:
==93283== realloc() с размером 0 ==93283== по адресу 0x484ABC0: realloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x29DD5B22: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.470.199.02) ==93283== по 0x2844BC26: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x284B1C55: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x2844B1EA: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== Адрес 0x8628bd0 находится через 0 байт после выделенного блока размера 0. ==93283== по адресу 0x4845828: malloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x29DD5B0F: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.470.199.02) ==93283== по 0x2844BC26: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x284B1C55: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x2844B1EA: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== ==93283== realloc() с размером 0 ==93283== по адресу 0x484ABC0: realloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x2D386D22: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D38BFCB: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39CF38: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39D314: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39836E: NvGlEglApiInit (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2C2354B4: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C23559A: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2AD3D5: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C233527: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2486EC: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x282F7416: loadEGLExternalPlatform (в /usr/lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1.1.12) ==93283== Адрес 0x85f3d80 находится через 0 байт после выделенного блока размера 0. ==93283== по адресу 0x4845828: malloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x2D386D0F: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D38BFCB: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39CF38: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39D314: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39836E: NvGlEglApiInit (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2C2354B4: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C23559A: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2AD3D5: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C233527: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2486EC: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x282F7416: loadEGLExternalPlatform (в /usr/lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1.1.12) ==93283== Ошибка: неизвестный код ошибки 14 Memcheck: произошло «невозможное»: неизвестный код ошибки в mc_eq_Error трассировка стека хоста: ==93283== по адресу 0x58042CDA: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x58042E07: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580430DF: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x58039828: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x5803E1B7: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580390A4: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x5800595A: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580A01EE: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580E599D: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580E5C80: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580B065D: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== от 0xDEADBEEFDEADBEEE: ??? ==93283== от 0xDEADBEEFDEADBEEE: ??? ==93283== от 0xDEADBEEFDEADBEEE: ??? Не знаю, что мне нужно добавить/изменить, чтобы vkCreateInstance работал без realloc() с ошибками размера 0.
Я тестирую память своего движка с помощью valgrind и столкнулся со странной ошибкой realloc() с размером 0. Это происходит с различными версиями libnvidia-eglcore.so, поэтому я могу исключить, что это не проблема с драйвером.
Мой код для createInstance:
void Instance::createInstance() { VkApplicationInfo appInfo {}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = title.c_str(); appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName = "Coje"; appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion = VK_API_VERSION_1_0; VkInstanceCreateInfo createInfo {}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; // uint32_t ExtensionCount = 0; константный байт **extensions = 0; Memory::allocate(0, 2, Extensions, ExtensionCount, 0, false); Extensions[0] = "VK_KHR_surface"; #если определено(_Linux) расширения[1] = "VK_KHR_xlib_surface"; #elif определено (_Android) Extensions[1] = "VK_KHR_android_surface"; #endif если (enableValidationLayers) { индекс uInteger64 = ExtensionCount; Memory::allocate(index, 1, Extensions, ExtensionCount, 0, false); расширения[индекс] = "VK_EXT_debug_utils"; } createInfo.enabledExtensionCount = ExtensionCount; createInfo.ppEnabledExtensionNames = расширения; // VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo {}; uint32_t LayerCount = 0; константный байт **layers = 0; если (enableValidationLayers && checkValidationLayersSupport()) { Memory::allocate(layerCount, 1, Layers, LayerCount, 0, false); Layers[0] = "VK_LAYER_KHRONOS_validation"; createInfo.enabledLayerCount = LayerCount; createInfo.ppEnabledLayerNames = слои; populateDebugMessengerCreateInfo (debugCreateInfo); createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT *)&debugCreateInfo; } еще { если (enableValidationLayers) { Printf("%s\n", "Слои проверки запрошены, но недоступны"); } createInfo.enabledLayerCount = 0; } Распределитель VkAllocationCallbacks = createAllocator("Экземпляр"); Логическое значение createInstance = VKcq("vkCreateInstance", vkCreateInstance(&createInfo, &allocator, &instance)); Memory::releaseObject(ReleaseType::Free, Extensions, ExtensionCount); если (enableValidationLayers) { Memory::releaseObject(ReleaseType::Free, Layers, LayerCount); } если (!createInstance) { throw «не удалось создать экземпляр!»; } возвращаться; }; void Instance::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo) { createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; createInfo.pfnUserCallback = debugCallback; }; Ошибка в valigrind:
==93283== realloc() с размером 0 ==93283== по адресу 0x484ABC0: realloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x29DD5B22: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.470.199.02) ==93283== по 0x2844BC26: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x284B1C55: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x2844B1EA: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== Адрес 0x8628bd0 находится через 0 байт после выделенного блока размера 0. ==93283== по адресу 0x4845828: malloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x29DD5B0F: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.470.199.02) ==93283== по 0x2844BC26: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x284B1C55: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== по 0x2844B1EA: ??? (в /usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.470.199.02) ==93283== ==93283== realloc() с размером 0 ==93283== по адресу 0x484ABC0: realloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x2D386D22: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D38BFCB: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39CF38: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39D314: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39836E: NvGlEglApiInit (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2C2354B4: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C23559A: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2AD3D5: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C233527: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2486EC: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x282F7416: loadEGLExternalPlatform (в /usr/lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1.1.12) ==93283== Адрес 0x85f3d80 находится через 0 байт после выделенного блока размера 0. ==93283== по адресу 0x4845828: malloc (в /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==93283== по 0x2D386D0F: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D38BFCB: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39CF38: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39D314: ??? (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2D39836E: NvGlEglApiInit (в /usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.470.199.02) ==93283== по 0x2C2354B4: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C23559A: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2AD3D5: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C233527: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x2C2486EC: ??? (в /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.199.02) ==93283== по 0x282F7416: loadEGLExternalPlatform (в /usr/lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1.1.12) ==93283== Ошибка: неизвестный код ошибки 14 Memcheck: произошло «невозможное»: неизвестный код ошибки в mc_eq_Error трассировка стека хоста: ==93283== по адресу 0x58042CDA: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x58042E07: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580430DF: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x58039828: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x5803E1B7: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580390A4: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x5800595A: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580A01EE: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580E599D: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580E5C80: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== по 0x580B065D: ??? (в /usr/libexec/valgrind/memcheck-amd64-linux) ==93283== от 0xDEADBEEFDEADBEEE: ??? ==93283== от 0xDEADBEEFDEADBEEE: ??? ==93283== от 0xDEADBEEFDEADBEEE: ??? Не знаю, что мне нужно добавить/изменить, чтобы vkCreateInstance работал без realloc() с ошибками размера 0.
Мобильная версия