简体   繁体   English

MSVC中的Address Sanitizer:为什么启动时报错?

[英]Address Sanitizer in MSVC: why does it report an error on startup?

I'm trying a project that uses Qt with MSVC 2019 with Address Sanitizer.我正在尝试一个将 Qt 与 MSVC 2019 与 Address Sanitizer 结合使用的项目。 I built with Address Sanitizer the project, but didn't rebuild all libs, including Qt.我使用 Address Sanitizer 构建了该项目,但没有重建所有库,包括 Qt。

it crashes inside Qt in resource initialization (with qRegisterResourceData in the call stack).它在资源初始化时在 Qt 内崩溃(调用堆栈中的qRegisterResourceData )。

Is this:这是:

  • Misuse of address sanitizer, like, I should rebuild Qt DLLs with it too?滥用地址清理器,比如,我也应该用它重建 Qt DLL 吗?
  • An issue in Qt I should investigate deeper? Qt 中的一个问题我应该深入调查吗?
  • Known Qt issue?已知的 Qt 问题?

I've recreated the issue in Widget application created by Wizard by default.默认情况下,我在向导创建的小部件应用程序中重新创建了该问题。 The call stack is as follows:调用栈如下:

>   KernelBase.dll!RaiseException() Unknown
    QtWidgetsApplication1.exe!__vcasan::OnAsanReport(const char * description, const char * report, bool __throw) Line 602  C++
    QtWidgetsApplication1.exe!__vcasan::ReportCallback(const char * szReport) Line 325  C++
    clang_rt.asan_dbg_dynamic-x86_64.dll!__asan::ScopedInErrorReport::~ScopedInErrorReport(void)    Unknown
    clang_rt.asan_dbg_dynamic-x86_64.dll!__asan::ReportMallocUsableSizeNotOwned(unsigned __int64,struct __sanitizer::BufferedStackTrace *)  Unknown
    clang_rt.asan_dbg_dynamic-x86_64.dll!__asan::asan_malloc_usable_size(void const *,unsigned __int64,unsigned __int64)    Unknown
    clang_rt.asan_dbg_dynamic-x86_64.dll!_recalloc()    Unknown
    ucrtbased.dll!_register_onexit_function::__l2::<lambda>() Line 112  C++
    ucrtbased.dll!__crt_seh_guarded_call<int>::operator()<void <lambda>(void),int <lambda>(void) &,void <lambda>(void)>(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, _register_onexit_function::__l2::int <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 204    C++
    ucrtbased.dll!__acrt_lock_and_call<int <lambda>(void)>(const __acrt_lock_id lock_id, _register_onexit_function::__l2::int <lambda>(void) && action) Line 980    C++
    ucrtbased.dll!_register_onexit_function(_onexit_table_t * table, int(*)() function) Line 149    C++
    Qt5Cored.dll!_onexit(int(*)() function) Line 267    C++
    Qt5Cored.dll!atexit(void(*)() function) Line 275    C++
    Qt5Cored.dll!QPropertyAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) Line 268   C++
    Qt5Cored.dll!QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) Line 991   C++
    Qt5Cored.dll!QAbstractAnimation::start(QAbstractAnimation::DeletionPolicy policy) Line 1362 C++
    Qt5Widgetsd.dll!QWidgetAnimator::animate(QWidget * widget, const QRect & _final_geometry, bool animate) Line 114    C++
    Qt5Widgetsd.dll!QToolBarAreaLayout::apply(bool animate) Line 936    C++
    Qt5Widgetsd.dll!QMainWindowLayoutState::apply(bool animated) Line 687   C++
    Qt5Widgetsd.dll!QMainWindowLayout::applyState(QMainWindowLayoutState & newState, bool animate) Line 2759    C++
    Qt5Widgetsd.dll!QMainWindowLayout::setGeometry(const QRect & _r) Line 1979  C++
    Qt5Widgetsd.dll!QLayoutPrivate::doResize() Line 596 C++
    Qt5Widgetsd.dll!QLayout::activate() Line 1119   C++
    Qt5Widgetsd.dll!QWidgetPrivate::setVisible(bool visible) Line 8083  C++
    Qt5Widgetsd.dll!QWidget::setVisible(bool visible) Line 8044 C++
    Qt5Widgetsd.dll!QWidget::show() Line 7670   C++
    QtWidgetsApplication1.exe!main(int argc, char * * argv) Line 9  C++
    QtWidgetsApplication1.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Line 97    C++
    QtWidgetsApplication1.exe!invoke_main() Line 107    C++
    QtWidgetsApplication1.exe!__scrt_common_main_seh() Line 288 C++
    QtWidgetsApplication1.exe!__scrt_common_main() Line 331 C++
    QtWidgetsApplication1.exe!WinMainCRTStartup(void * __formal) Line 17    C++
    kernel32.dll!BaseThreadInitThunk()  Unknown
    ntdll.dll!RtlUserThreadStart()  Unknown

The output:输出:

Address 0x01c416f8eda0 is a wild pointer.
SUMMARY: AddressSanitizer: bad-malloc_usable_size (C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64\clang_rt.asan_dbg_dynamic-x86_64.dll+0x18004e63a) in _asan_wrap_GlobalSize+0x4b948
Address Sanitizer Error: bad-malloc_usable_size

The issue is load order .问题是加载顺序

Qt happens to load before ASan and load C/C++ runtime before ASan DLLs loaded. Qt 恰好在 ASan 之前加载,并在 ASan DLL 加载之前加载 C/C++ 运行时。 Qt performs some initialization. Qt 执行一些初始化。 So the memory is malloc ed without ASan knowledge, and later ASan sees realloc without prior malloc , which it reports.所以内存malloc没有峨山知识编的,后来看到阿三realloc没有事先malloc ,它的报告。

Building Qt with ASan should resolve the issue, I have not tried that, as I have found a workaround that does not involve Qt rebuild.使用 ASan 构建 Qt 应该可以解决问题,我还没有尝试过,因为我找到了一种不涉及 Qt 重建的解决方法。

The workaround: just make Qt DLLs import ASan DLLs.解决方法:只需让 Qt DLL 导入 ASan DLL。 For me it is via the following commands:对我来说,它是通过以下命令:

setdll /d:clang_rt.asan_dbg_dynamic-x86_64.dll <path_to_deployed_debug_app>\Qt5Cored.dll <path_to_deployed_debug_app>\Qt5Guid.dll

setdll /d:clang_rt.asan_dynamic-x86_64.dll <path_to_deployed_release_app>\Qt5Core.dll <path_to_deployed_release_app>\Qt5Gui.dll

setdll is a tool from Detours library that may be obtained from https://github.com/microsoft/Detours and then built using nmake . setdll是 Detours 库中的一个工具,可以从https://github.com/microsoft/Detours获得,然后使用nmake构建。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM