You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@thrift.apache.org by "Sylwester Lachiewicz (Jira)" <ji...@apache.org> on 2026/09/13 20:54:00 UTC

[jira] [Created] (THRIFT-6249) Windows: CMake-generated config.h defines AI_V4MAPPED as 0 and overrides the Winsock value

Sylwester Lachiewicz created THRIFT-6249:
--------------------------------------------

             Summary: Windows: CMake-generated config.h defines AI_V4MAPPED as 0 and overrides the Winsock value
                 Key: THRIFT-6249
                 URL: https://issues.apache.org/jira/browse/THRIFT-6249
             Project: Thrift
          Issue Type: Bug
          Components: C++ - Library, Build Process
            Reporter: Sylwester Lachiewicz


The MSVC CI job prints 158 copies of this warning while building the C++ library, its tests, the generated-code test projects and the tutorial (example: [MSVC run on master|https://github.com/apache/thrift/actions/runs/34762947299]):

{noformat}
C:\build\thrift\config.h(50,9): warning C4005: 'AI_V4MAPPED': macro redefinition [C:\build\lib\cpp\thrift.vcxproj]
{noformat}

The location is the generated config.h, so the Winsock definition comes first and config.h wins. {{Thrift.h}} includes {{PlatformSocket.h}} ({{winsock2.h}}, which pulls in {{ws2def.h}} with {{AI_V4MAPPED 0x00000800}}) and only then {{thrift-config.h}}.

h3. Cause

[build/cmake/ConfigureChecks.cmake:76|https://github.com/apache/thrift/blob/master/build/cmake/ConfigureChecks.cmake#L76] looks for the symbol with {{check_symbol_exists(AI_V4MAPPED "sys/types.h;sys/socket.h;netdb.h" ...)}}. Those headers do not exist on Windows, so the check fails and {{#cmakedefine AI_V4MAPPED 0}} in [build/cmake/config.h.in:50|https://github.com/apache/thrift/blob/master/build/cmake/config.h.in#L50] becomes {{#define AI_V4MAPPED 0}}.

The check came in with [PR #3737|https://github.com/apache/thrift/pull/3737] ([405a95fda|https://github.com/apache/thrift/commit/405a95fdaf450dd9200fccc9d6f7630f3f09451e]), which replaced the AI_ADDRCONFIG check with one for AI_V4MAPPED for OpenBSD. It is on master since 2026-08-28 and not in 0.24.0. configure.ac carries the same {{AC_CHECK_DECL}}, but autotools does not build the Windows library, so only the CMake path is affected.

h3. Effect

On Windows the flag is 0 in every translation unit that sees config.h after the Winsock headers, so the getaddrinfo calls that ask for IPv4-mapped addresses silently stop doing so:

* [lib/cpp/src/thrift/transport/TServerSocket.cpp:449|https://github.com/apache/thrift/blob/master/lib/cpp/src/thrift/transport/TServerSocket.cpp#L449]
* [lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp:377|https://github.com/apache/thrift/blob/master/lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp#L377]
* the default flags in [lib/cpp/src/thrift/transport/TSocketUtils.h:140|https://github.com/apache/thrift/blob/master/lib/cpp/src/thrift/transport/TSocketUtils.h#L140]

Windows has supported AI_V4MAPPED since Vista, so the fallback is wrong there, not merely noisy.

Same class of defect as [THRIFT-4077|https://issues.apache.org/jira/browse/THRIFT-4077] (AI_ADDRCONFIG redefined through PlatformSocket.h, fixed in 0.11.0). [THRIFT-6191|https://issues.apache.org/jira/browse/THRIFT-6191] is about the same flag but a different problem, the POSIX mismatch between server and client resolution.

h3. Fix options

* Run the check against the Windows headers on WIN32 ({{winsock2.h;ws2tcpip.h}}, matching PlatformSocket.h), or
* emit the fallback only when the symbol is still undefined, by wrapping the {{#cmakedefine}} in {{#ifndef AI_V4MAPPED}}.

The warning count is the regression check: the MSVC job on master prints 158 C4005 for this macro today and should print none.

_This issue was created with AI assistance._




--
This message was sent by Atlassian Jira
(v8.20.10#820010)