【问题标题】:Acceptable header file for clang based compiler基于 clang 的编译器可接受的头文件
【发布时间】:2022-01-08 06:30:07
【问题描述】:

我有一些以前在 C++Builder 6 中编译和运行的代码。我想在 10.4.2 中重新编译它并构建 32 位和 64 位 Windows 目标。

现有代码使用经典编译器编译,但是当我尝试使用 clang 编译器编译时,我得到了可怕的 ICE:

内部编译器错误:0 @ 00000000

通过使用#ifdefs 删除部分代码,我已经将其追踪到函数的声明方式。我没有尝试过任何工作,这让我觉得我一定错过了一些非常基本的东西。

仍然适用于经典编译器的原始代码:

extern "C" {
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromToken (HANDLE hToken, PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetCurrentProcessLogonSID (PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromAccountName(char *lpszUserName, PSID *ppsid);
VOID WINAPI __declspec(dllexport) FreeLogonSID (PSID *ppsid);
PSECURITY_DESCRIPTOR WINAPI __declspec(dllexport) AddAceToNewSecurityDescriptor(PSECURITY_DESCRIPTOR psd, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) SetUserObjectNullDacl(HANDLE hObject);
BOOL WINAPI __declspec(dllexport) AddAceToUserObject(HANDLE hObject, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) AddAceToWindowStation(HWINSTA hwinsta, PSID psid);
BOOL WINAPI __declspec(dllexport) AddAceToDesktop(HDESK hdesk, PSID psid);
}

现在我已经尝试了很多东西,并查看了 Windows SDK 标头,但如果我将其放入我的代码中:

extern "C" {
// this is lifted directly from winbase.h
WINADVAPI
BOOL
WINAPI
LogonUserExW (
    _In_            LPCWSTR lpszUsername,
    _In_opt_        LPCWSTR lpszDomain,
    _In_opt_        LPCWSTR lpszPassword,
    _In_            DWORD dwLogonType,
    _In_            DWORD dwLogonProvider,
    _Outptr_opt_ PHANDLE phToken,
    _Outptr_opt_ PSID  *ppLogonSid,
    _Outptr_opt_result_bytebuffer_all_(*pdwProfileLength) PVOID *ppProfileBuffer,
    _Out_opt_       LPDWORD pdwProfileLength,
    _Out_opt_       PQUOTA_LIMITS pQuotaLimits
    );

/*
BOOL
WINAPI
GetLogonSIDFromToken(
    _In_ HANDLE hToken,
    _Outptr_opt_ PSID *ppsid
    );
*/
/*
BOOL
APIENTRY
GetLogonSIDFromToken(
    _In_ HANDLE hToken,
    _Outptr_opt_ PSID *ppsid
    );
*/}

它编译得很好(但显然我的函数没有声明),但是如果我取消注释第二个或第三个声明,我会收到 ICE 错误。

任何人都可以为我提供任何指针(不是双关语)吗?

【问题讨论】:

  • 是否有一些项目路径仍指向经典包含目录或库目录或类似目录?
  • 感谢 Ted 的想法,我认为情况并非如此,我使用的唯一不随产品一起提供的标头就是这个。我看不出包含另一个头文件或路径如何意味着编译器很乐意接受第一个声明(Windows API 调用)但没有我自己声明的函数的变体(我已经尝试过)。
  • 好吧,这是一个很长的镜头:)
  • 发现问题完全不是我的预期……我会发布答案。

标签: c++builder


【解决方案1】:

看起来不像。

代码编译良好,头文件中没有函数声明,但问题不在于头文件本身。文件中有两个函数使用 __try __finally(Microsoft 扩展),它们是由 clang 官方支持的,但其中一个函数在 __finally 块的开头有一个标签。删除标签允许代码编译。

__finally
{
blockexit:
  ...

删除blockexit: 标签允许代码编译。

如果标头中没有函数声明,我不知道为什么代码编译得很好......

感谢所有看到这里的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多