std::function, Clang 6.0 & MSVC (10.0017134.12) - 可能的 ABI 错误或必需的编译器标志

std::function, Clang 6.0 & MSVC (10.0017134.12) - possible ABI bug or required compiler flags

本文关键字:ABI 错误 标志 编译器 Clang function 0017134 MSVC std      更新时间:2023-10-16

如果我创建一个简单的库(使用 CMake 构建(:

福.H

#pragma once
#include <functional>
void foo(std::function<void()> handler);

傅.cpp

#include "foo.h"
void foo(std::function<void()> handler)
{
handler();
}

然后创建一个单独的 CMake 项目来编译可执行文件:

#include "foo.h"
#include <cstdlib>
#include <iostream>
int main()
{
foo([&]()
{
std::cout << "hello" << std::endl;
});
return EXIT_SUCCESS;
}

然后使用 Release 或 RelWithDebInfo(记住我使用的是 CMake(中的 MSVC(使用最新的平台 SDK 10.0.17134.12(编译库,并使用 Clang 6 编译可执行文件(与 Visual Studio 17.7 捆绑在一起的最新 Windows 平台 SDK 不支持 Clang 5 https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/(也使用 Release 或 RelWithDebInfo,然后我得到由std::function析构函数触发的堆损坏。

为了可靠地触发堆损坏,我可以使用gflags.

gflags -p /enable "myexe.exe" /full

它在以前的平台SDK上与Clang 5配合使用良好(标准Clang可从LLVM下载,而不是Microsoft的版本(。我假设这是一个 ABI(或类似(问题或错误。需要一段时间才能将这一切提炼下来并获得最低限度的可验证复制。有没有人对从这里拿走它有任何建议?

据我所知,这似乎确实是一个 ABI 问题,所以我报告了一个错误:

https://bugs.llvm.org/show_bug.cgi?id=39962

更新:

该错误已在 https://reviews.llvm.org/rL328386 中修复,并包含在 Clang 7.0.0 中。