<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/91206>91206</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang-tidy crash in ASTMatcher(cppcoreguidelines-owning-memory) with GMock/GTest and lambdas.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
MichaelFeistETC
</td>
</tr>
</table>
<pre>
Running clang-tidy on the following piece of code causes clang-tidy to crash:
`
#include "gmock/gmock.h"
#include <cstdint>
class Mock
{
public:
MOCK_METHOD(int, Foo, (uint8_t x));
};
TEST(BreakClangTidy, BreakClangTidy)
{
Mock mock;
auto foo = [mock](uint8_t x) { return mock.Foo(x); };
}
`
Resulting clang-tidy crash output:
`
Stack dump:
0. Program arguments: clang-tidy --extra-arg-before=--driver-mode=g++ PROJECT_DIR\\tests\\break_clang_tidy.cpp -- C:\\PROGRA~1\\LLVM\\bin\\CLANG_~1.EXE -IPROJECT_DIR/tests -isystem PROJECT_DIR/build/_deps/googletest-src/googletest/include -isystem PROJECT_DIR/build/_deps/googletest-src/googletest -isystem PROJECT_DIR/build/_deps/googletest-src/googlemock/include -isystem PROJECT_DIR/build/_deps/googletest-src/googlemock -O0 -g -Xclang -gcodeview -std=c++20 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -Wall -Wno-sign-conversion -Werror -MD -MT tests/CMakeFiles/lm75_test.dir/break_clang_tidy.cpp.obj -MF tests\\CMakeFiles\\lm75_test.dir\\break_clang_tidy.cpp.obj.d -o tests/CMakeFiles/lm75_test.dir/break_clang_tidy.cpp.obj -c PROJECT_DIR/tests/break_clang_tidy.cpp
1. <eof> parser at end of file
2. ASTMatcher: Matching 'cppcoreguidelines-owning-memory' against:
CXXMethodDecl BreakClangTidy_BreakClangTidy_Test::TestBody : <PROJECT_DIR\tests\break_clang_tidy.cpp:9:1 <Spelling={PROJECT_DIR/build/_deps/googletest-src/googletest/include\gtest/internal/gtest-internal.h:1518:3>, PROJECT_DIR\tests\break_clang_tidy.cpp:13:1>
Exception Code: 0xC0000005
#0 0x00007ff7c6b90043 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1310043)
#1 0x00007ff7c6ab7f79 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1237f79)
#2 0x00007ff7c6aba4b2 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123a4b2)
#3 0x00007ff7c6ab830a (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123830a)
#4 0x00007ff7c6ab76ea (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12376ea)
#5 0x00007ff7c6abebc4 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123ebc4)
#6 0x00007ff7c6ab5741 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1235741)
#7 0x00007ff7c6ab4479 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1234479)
#8 0x00007ff7c6ab3ef6 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1233ef6)
#9 0x00007ff7c6abcadc (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123cadc)
#10 0x00007ff7c6abc302 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123c302)
#11 0x00007ff7c6ab87da (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12387da)
#12 0x00007ff7c6ab76ea (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12376ea)
#13 0x00007ff7c6abea56 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123ea56)
#14 0x00007ff7c6ab56c1 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12356c1)
#15 0x00007ff7c6ab4677 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1234677)
#16 0x00007ff7c6ab3ef6 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1233ef6)
#17 0x00007ff7c6ab384d (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123384d)
#18 0x00007ff7c6ab365f (C:\Program Files\LLVM\bin\clang-tidy.exe+0x123365f)
#19 0x00007ff7c6ab1e93 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1231e93)
#20 0x00007ff7c6b7022c (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12f022c)
#21 0x00007ff7c6b8d9d7 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x130d9d7)
#22 0x00007ff7c6b8f8b2 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x130f8b2)
#23 0x00007ff7c6b8f41b (C:\Program Files\LLVM\bin\clang-tidy.exe+0x130f41b)
#24 0x00007ff7c6b8d8aa (C:\Program Files\LLVM\bin\clang-tidy.exe+0x130d8aa)
#25 0x00007ff7c6ac40f3 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12440f3)
#26 0x00007ff7c6b8d8aa (C:\Program Files\LLVM\bin\clang-tidy.exe+0x130d8aa)
#27 0x00007ff7c6ac2d49 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1242d49)
#28 0x00007ff7c6ac42fd (C:\Program Files\LLVM\bin\clang-tidy.exe+0x12442fd)
#29 0x00007ff7c6ad074c (C:\Program Files\LLVM\bin\clang-tidy.exe+0x125074c)
#30 0x00007ff7c6ac4a3c (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1244a3c)
#31 0x00007ff7c6ac4327 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1244327)
#32 0x00007ff7c6ab0ee4 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1230ee4)
#33 0x00007ff7c6ae9443 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1269443)
#34 0x00007ff7c6587538 (C:\Program Files\LLVM\bin\clang-tidy.exe+0xd07538)
#35 0x00007ff7c589d981 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1d981)
#36 0x00007ff7c589d3f2 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1d3f2)
#37 0x00007ff7c5d7dc17 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x4fdc17)
#38 0x00007ff7c5bfa365 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x37a365)
#39 0x00007ff7c5d7dab5 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x4fdab5)
#40 0x00007ff7c5d7c8fb (C:\Program Files\LLVM\bin\clang-tidy.exe+0x4fc8fb)
#41 0x00007ff7c5d7f1ac (C:\Program Files\LLVM\bin\clang-tidy.exe+0x4ff1ac)
#42 0x00007ff7c5bf61c9 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x3761c9)
#43 0x00007ff7c5bc0c21 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x340c21)
#44 0x00007ff7c6a19220 (C:\Program Files\LLVM\bin\clang-tidy.exe+0x1199220)
#45 0x00007ff81bc5257d (C:\windows\System32\KERNEL32.DLL+0x1257d)
#46 0x00007ff81c8caa48 (C:\windows\SYSTEM32\ntdll.dll+0x5aa48)
Access violation
`
The example is running using a combination of GTest and GMock tagged at commit hash 5197b1a8e6a1ef9f214f4aa537b0be17cbf91946.
If the piece of code is not wrapped in a TEST block, clang-tidy doesn't crash. Seems to be a combination of using a GMock class, a GTest test block, and trying to improperly capture the instance of the GMock class in a lambda.
The project is being built using CMake 3.29 and using the built in CXX_CLANG_TIDY property. I'm using the LLVM tools at version 18.1.4 downloaded and installed from Chocolatey.
CMake looks like this:
`
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent(GTest) // Using some helper functions here instead of directly using FetchContent. Not the actual line I have here.
mark_as_advanced(
gmock_build_tests
gtest_build_samples
gtest_build_tests
gtest_disable_pthreads
gtest_force_shared_crt
gtest_hide_internal_symbols
BUILD_GMOCK
BUILD_GTEST
)
set_target_properties(gtest gtest_main gmock gmock_main
PROPERTIES FOLDER "tests"
)
enable_testing()
include(GoogleTest)
add_executable(test)
set_target_properties(test PROPERITES
C_CLANG_TIDY "clang-tidy"
CXX_CLANG_TIDY "clang-tidy"
)
target_sources(test PRIVATE break_clang_tidy.cpp)
target_link_libraries(test PRIVATE GTest::gtest_main GTest::gmock_main)
gtest_discover_tests(test EXTRA_ARGS "--gtest_output=xml:test-results)
`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Wt1yo7gSfhrlRoULJDBwkQsb29mcjSdTiXd39ooSUmNrg5ELyfm52Wc_JWEnFsnW1inmuKZsEOrv61b_iFGHaS23LcA1SuYoWVyxo9mp7not-Y5BswKpzXJTXFVKvF0_HNtWtlvMG9ZuAyPFG1YtNjvAtWoa9WKfHSRwwKrGXAnAnB016EsBozDvmN4hOkPhAoUzNA1PF4TKljdHARgRst0r_oTIyv1OdoiQz7NowbURsjWILvunvGFa47UV7Wen8_7icKwayd9JMV7fF7-W6-Xml_sFIpnFIAVeKWV_EMmOsjVZafArIrn9R-dnwMXHtfveLB83iGTzDthTYe3cSPFmUYYj-UAl7PTEzk76PsaORuFaKYzoAqNk7h4ni4FKGKVz3IE5dq0DmDjNs9deVexpmS6GC-2-H0AfGzNwp3MNVkdzOJrPHno0jD9hcdwf3p-FE-w-3zu17dges2573ENrNKKzS-AggFfTsYB126CCWnWA6CIIRCefoQv2Stj7LSJzROb4-8P9f5bFplzcPqCkQElhQBvdX1Z2VUuHXFrkCT8ccBDgwqrkZnx_uL95mP0d9Xd3d7-vT5Ky7S-Ku9m3m_LvaLL8scTB7SUbWTkqHEj9pg3ssf-wOspGILIqBRy0DU6ltg1YkUB33BtAZHWO0_FgIyFOqfRz9LFgOLgPcbDFwQ_nCBxsbbY_S3jBgTYC0QXvXUlCHCzKxXL-2427uLuzP-vNh2Qg4ACtgNYEjawQXez1M--MwMEfrGlw8EerAluhAq7aZ-i0VC0O_oCuUx0O1gscrDe4Dw-yKtbsCVayAXvT7NOktE8mQnbWvC8CZ6Kqv3CwXuGLALsAcfc-zj_GoIWaCByosdpw_EVA_oNEn4PRKQcRLUDViC7xgXUaOswMhlbYYlzLBvrJ5DR59rhZM8N30NlMdZe2FiCS8sOBqw62RymgkS3oQL3Ysh_sYa-6N0RSzLZMttpclNP-U_z4sQazU2IBvBkUwHJwu4EegM7s1VyJN2w1QbTw0__smi_tp7Mc0VlkpR4P0DSy3SK6QOn8J-QtSort-4iBrmWNnemkzgMTu49FSZQhOqN2FyIF_p_Uj6j9et-_lq8cDsbGeOFK4gyHr0XoPslpqRGhIQ5f7VBa1ymfVnkYxtRuWqcaeK7F5yA-lcC-_n3U5Am8AiLz8DWikUV436EsReRRsCqt03wMBaEWwaMgAwoWV2QchUXwKOiAIqMhG0dhETyKeLhQUxhJYRE8imRAARWPx1FYBI9iOqBI0jgaR2ERPIp0QBHHYyPKIngU2YCCQj0dR2ERPIp8QMGZ4OMoLMLHyyGhUTikoOHIvLAIHsUwu7NUjM2LVDCPYpjdPzkvLMUwu4ElI91tETyKYXYnUz42L6Y88iiG2R1P03RkXkzT1KMYZvdPzgtLMcxumsViJEUWC4_iU3ZPk3okxTSpPYphdkeQj9pYCbUIlxRksHenISHjCkhtETwKP7urTORiVETR0CJ4FGRAUWfj9m4aWgSPgg4p4qgaSRFHlUcRDxcqY6NqFA0tgkcxyG4eh_W4iIotgkcx_f9bMchuTkQ8bu-OLYJHkQ0XitTjCkhsETyKQXaLMI3HpV5iES4pBm_mjMeMjqOILYJHEQ0prHvGUVDiZfenN_MQYOQLp0XwKAZ7N-TxuP_CkKlF8Cj87E6yNKHZCAoRWgCPwUvuJMtFno16O7DyHsF0SEDrUWXWynsEXmInIhU8GhNMcW0BPAYvr5OqZnSajGCgqQXwGPKhDawawxDXFuCSIQ4HDDyrx2xFcW0BPIZowFBHbEzdiGsL4DGQgR-mER9TwmlqATwG6jPwkJMx2UBjC-AxDN7Go5yQcEw6RLlF8CguUjqLKp6QJL3chl5kK9SLBX90R6iUoKT4dfnwbXlHyWRxd3feGVJv64mnl7A844zF2dewfz5ulmsH2xrRNBPRNA4zsSLvmDPOQWv8LFXDjFTtlyf8mx1geGX7QwNYatydujdHbb8Z5mpfydaJY1Xjmw1og1kr8I3rSxi23YLAzNiJe2nwjukdTqI8rSKWwZRFUOc1ieI6ZiyhaRVWEKW8qvMoj6eTS0Vua9ck8ltDUuNWGfzSscMBBJYtZnizfNzgqnHH1cVl-0Ao0C0iqek7FBP8CLDX2ChcwWdTzhb2hriekMVjJxvdifo7i7XYdG9Wwigs94dOHaBr3jBnB3PswKkuW21Y22tv7y-Qe80btq8EmwyX_9Cpv4Aba2wFlqI6ysacFHQHxJhOSO6U6Actej9Jtrj48aPsuxWb28WfuFfNvE3wLSLp_kLChjo2SjXaOux8Th5lk2gSY6Fe2kYxYb3Zit6WpgGB607tcbFT3EYRvHna98o1Sj1p3MgnuwxSf24JaTCIZLffHjezu7vyxjnwfrXCxaz4ZYnn9_d3GBGCCMGr-4di-R7AvZw7TC1r1XEo9Y51IEreGXz_7V_l--8VGL4rVGugtXDOva47RlaIrPBvbn202gPeQXOADtfHltso0XgHXe9WYO6EXMgOuGneTot6iTzB35Rxy8y4ObIGN7IFfIt37Bkcjrdwe9Y9lUyXTDzbiBGIZOdDctfLLN1hdNmfC_cP-mXox7XLV_0ucvHoUuT0QEjNqgbKg9l1wIQPOFxXX3QnBZTnc-xSv-0r1byjz3-7vVuUN-v74tfT0GnEOfhc1zxfaDClYd0WTHmKUwn67OMT557Jtl-F01rYgTPn94f778uHze3yEa_u7xbLB-v5U_eDfEkJrTPezpHt1i60__x8kE-yG3e-fwqPyylMiBJegR-NhUIkM5_n_JNlzrBe69vN8vFsR3GZsoiQjzL2bgceZvbX0wZ6nHTQ6tjxSwVuf59tlvjLBsMZ4CTayPapbGTVsU5-Rrj5aMlcuOty9MNnvmbvwcjVM3SnQD2hL39sHmbl7OHm0VoZBP3cc4t58bpvEJ25pkrnOtL6A3saXolrKnKasyu4jtIoCUOSxvRqd10zCKd5THOWRayeJnFOgKY1o6Ke0ojHV_KahCQOk3AaUZqHdFLn0xxCEVdJzvKYJCgOYc9kM2ma5_1EddsrqfURrvOIhNOrhlXQaPdHEUPXJIur7toKBdVxq1EcNlIb_QFjpGnguhg21WV72XMj2b-22XL8Is2u32oQWX3sz_1eoydXx6653hlzcHXZlbytNLtjNeFqj8jKanT6CU4bESIrZ6VGZOUM_W8AAAD__0w7II8">