【问题标题】:std::function, Clang 6.0 & MSVC (10.0017134.12) - possible ABI bug or required compiler flagsstd::function、Clang 6.0 和 MSVC (10.0017134.12) - 可能的 ABI 错误或所需的编译器标志
【发布时间】:2018-05-17 10:07:28
【问题描述】:

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

foo.h

#pragma once

#include <functional>

void foo(std::function<void()> handler);

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

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

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

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

【问题讨论】:

  • 有没有标准的c++ ABI?上次我检查没有任何标准。 AFAIK clang 和 gcc 可以生成兼容的代码,但它们在自己的版本之间通常不能完全向后兼容。您的问题是已知问题,还是我误解了什么?
  • @luk32,clang-cl.exe 旨在与 msvc.exe ABI 兼容

标签: c++ visual-c++ clang abi std-function


【解决方案1】:

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

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

更新:

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

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 2017-10-17
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多