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)

Reply via email to