]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cmake: replace the way clang-tidy verifies tests, fix issues found
authorViktor Szakats <commit@vsz.me>
Sun, 22 Jun 2025 01:17:33 +0000 (03:17 +0200)
committerViktor Szakats <commit@vsz.me>
Sun, 22 Jun 2025 21:08:46 +0000 (23:08 +0200)
Replace existing `mk-unity.pl` `--embed` workaround with running
`clang-tidy` manually on individual test source instead. This aligns
with how clang-tidy works and removes `mk-unity.pl` from the solution.

Also:
- mqttd: fix potentially uninitialized buffer by zero filling it.
  ```
  tests/server/mqttd.c:484:41: error: The left operand of '<<' is a garbage value
    [clang-analyzer-core.UndefinedBinaryOperatorResult,-warnings-as-errors]
    484 |       payload_len = (size_t)(buffer[10] << 8) | buffer[11];
        |                                         ^
  [...]
  tests/server/mqttd.c:606:45: error: The left operand of '<<' is a garbage value
    [clang-analyzer-core.UndefinedBinaryOperatorResult,-warnings-as-errors]
    606 |       topiclen = (size_t)(buffer[1 + bytes] << 8) | buffer[2 + bytes];
        |                                             ^
  ```
- sockfilt: fix potential out-of-bound pointer:
  ```
  tests/server/sockfilt.c:1128:33: error: The 2nd argument to 'send' is a buffer
     with size 17010 but should be a buffer with size equal to or greater than
     the value of the 3rd argument (which is 18446744073709551615)
     [clang-analyzer-unix.StdCLibraryFunctions,-warnings-as-errors]
   1128 |         ssize_t bytes_written = swrite(sockfd, buffer, buffer_len);
        |                                 ^
  ```
- clang-tidy: suppress bogus `bzero()` warnings that happens
  inside the notorious `FD_ZERO()` macros, on macOS.

Ref: https://github.com/curl/curl/pull/17680#issuecomment-2991730158

Closes #17705

14 files changed:
.github/workflows/linux.yml
CMake/Macros.cmake
CMakeLists.txt
lib/Makefile.am
scripts/mk-unity.pl
src/Makefile.am
tests/CMakeLists.txt
tests/client/CMakeLists.txt
tests/libtest/CMakeLists.txt
tests/server/CMakeLists.txt
tests/server/mqttd.c
tests/server/sockfilt.c
tests/tunit/CMakeLists.txt
tests/unit/CMakeLists.txt

index 62354742f8d8c25a49d0737e64d486754af7d227..22622b34950717108f257e5ffe62c17862161e78 100644 (file)
@@ -38,7 +38,7 @@ permissions: {}
 env:
   MAKEFLAGS: -j 5
   CURL_CI: github
-  CURL_CLANG_TIDYFLAGS: '-checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,-clang-analyzer-valist.Uninitialized'
+  CURL_CLANG_TIDYFLAGS: '-checks=-clang-analyzer-security.insecureAPI.bzero,-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,-clang-analyzer-valist.Uninitialized'
   # renovate: datasource=github-tags depName=libressl-portable/portable versioning=semver registryUrl=https://github.com
   LIBRESSL_VERSION: 4.1.0
   # renovate: datasource=github-tags depName=wolfSSL/wolfssl versioning=semver extractVersion=^v?(?<version>.+)-stable$ registryUrl=https://github.com
index dfc0a95d93a9ec0da09807114a06952b575ddea7..362ccc3dc66dac52e78dc1aaf283264efeae0c28 100644 (file)
@@ -95,3 +95,71 @@ macro(curl_prefill_type_size _type _size)
   set(SIZEOF_${_type} ${_size})
   set(SIZEOF_${_type}_CODE "#define SIZEOF_${_type} ${_size}")
 endmacro()
+
+# Create a clang-tidy target for test targets
+macro(curl_clang_tidy_tests _target)
+  if(CURL_CLANG_TIDY)
+
+    # Collect header directories and macro definitions from lib dependencies
+    set(_includes_l "")
+    set(_definitions_l "")
+    get_target_property(_libs ${_target} LINK_LIBRARIES)
+    foreach(_lib IN LISTS _libs)
+      if(TARGET "${_lib}")
+        get_target_property(_val ${_lib} INCLUDE_DIRECTORIES)
+        if(_val)
+          list(APPEND _includes_l ${_val})
+        endif()
+        get_target_property(_val ${_lib} COMPILE_DEFINITIONS)
+        if(_val)
+          list(APPEND _definitions_l ${_val})
+        endif()
+      endif()
+    endforeach()
+
+    # Collect header directories applying to the target
+    get_directory_property(_includes_d INCLUDE_DIRECTORIES)
+    get_target_property(_includes_t ${_target} INCLUDE_DIRECTORIES)
+
+    set(_includes "${_includes_l};${_includes_d};${_includes_t}")
+    list(REMOVE_ITEM _includes "")
+    string(REPLACE ";" ";-I" _includes ";${_includes}")
+
+    # Collect macro definitions applying to the target
+    get_directory_property(_definitions_d COMPILE_DEFINITIONS)
+    get_target_property(_definitions_t ${_target} COMPILE_DEFINITIONS)
+
+    set(_definitions "${_definitions_l};${_definitions_d};${_definitions_t}")
+    list(REMOVE_ITEM _definitions "")
+    string(REPLACE ";" ";-D" _definitions ";${_definitions}")
+    list(SORT _definitions)  # Sort like CMake does
+
+    # Assemble source list
+    set(_sources "")
+    foreach(_source IN ITEMS ${ARGN})
+      if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${_source}")  # if not in source tree
+        set(_source "${CMAKE_CURRENT_BINARY_DIR}/${_source}")  # look in the build tree, for generated files, e.g. lib1521.c
+      endif()
+      list(APPEND _sources "${_source}")
+    endforeach()
+
+    add_custom_target("${_target}-clang-tidy" USES_TERMINAL
+      WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+      COMMAND ${CMAKE_C_CLANG_TIDY} ${_sources} -- ${_includes} ${_definitions}
+      DEPENDS ${_sources})
+    add_dependencies(tests-clang-tidy "${_target}-clang-tidy")
+
+    unset(_includes_d)
+    unset(_includes_t)
+    unset(_includes)
+    unset(_definitions_l)
+    unset(_definitions_d)
+    unset(_definitions_t)
+    unset(_definitions)
+    unset(_sources)
+    unset(_source)
+    unset(_libs)
+    unset(_lib)
+    unset(_val)
+  endif()
+endmacro()
index a20d19a8d22469d1c8228903f8e3d8b5a63a2382..08c6632669545054dc812c51d6abb03c05510c7a 100644 (file)
@@ -288,11 +288,9 @@ endif()
 
 option(CURL_CLANG_TIDY "Run the build through clang-tidy" OFF)
 if(CURL_CLANG_TIDY)
-  # clang-tidy is not looking into #included sources, thus not compatible with
-  # unity builds. Make test bundles compatible by embedding the source code.
-  set(CMAKE_UNITY_BUILD OFF)
-  set(CURL_MK_UNITY_OPTION "--embed")
+  set(CMAKE_UNITY_BUILD OFF)  # clang-tidy is not looking into #included sources, thus not compatible with unity builds.
   set(_tidy_checks "")
+  list(APPEND _tidy_checks "-clang-analyzer-security.insecureAPI.bzero")  # for FD_ZERO() (seen on macOS)
   list(APPEND _tidy_checks "-clang-analyzer-security.insecureAPI.strcpy")
   list(APPEND _tidy_checks "-clang-analyzer-optin.performance.Padding")
   list(APPEND _tidy_checks "-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling")
index 2f1908046f52adbd82d6beeb3ade2e0ff3f1106b..41889c955bc850e5987f819a71bd4a94fbc254de 100644 (file)
@@ -156,7 +156,7 @@ endif
 endif
 
 # disable the tests that are mostly causing false positives
-TIDYFLAGS := -checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling -quiet
+TIDYFLAGS := -checks=-clang-analyzer-security.insecureAPI.bzero,-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling -quiet
 if CURL_WERROR
 TIDYFLAGS += --warnings-as-errors=*
 endif
index a7d23f394ffeb1acd4d5c0a1bcd03ea634254352..e1bd39de6de85416b04c6fcb4ee85178fc4a1d71 100755 (executable)
@@ -31,16 +31,13 @@ use strict;
 use warnings;
 
 if(!@ARGV) {
-    die "Usage: $0 [--test <tests>] [--include <include-c-sources>] [--srcdir <srcdir>] [--embed]\n";
+    die "Usage: $0 [--test <tests>] [--include <include-c-sources>]\n";
 }
 
 my @src;
 my %include;
 my $in_include = 0;
-my $srcdir = "";
-my $in_srcdir = 0;
 my $any_test = 0;
-my $embed = 0;
 foreach my $src (@ARGV) {
     if($src eq "--test") {
         $in_include = 0;
@@ -48,16 +45,6 @@ foreach my $src (@ARGV) {
     elsif($src eq "--include") {
         $in_include = 1;
     }
-    elsif($src eq "--embed") {
-        $embed = 1;
-    }
-    elsif($src eq "--srcdir") {
-        $in_srcdir = 1;
-    }
-    elsif($in_srcdir) {
-        $srcdir = $src;
-        $in_srcdir = 0;
-    }
     elsif($in_include) {
         $include{$src} = 1;
         push @src, $src;
@@ -78,18 +65,7 @@ my $tlist = "";
 foreach my $src (@src) {
     if($src =~ /([a-z0-9_]+)\.c$/) {
         my $name = $1;
-        if($embed) {
-            my $fn = $src;
-            if($srcdir ne "" && -e "$srcdir/$fn") {
-                $fn = $srcdir . "/" . $fn;
-            }
-            print "/* Embedding: \"$src\" */\n";
-            my $content = do { local $/; open my $fh, '<', $fn or die $!; <$fh> };
-            print $content;
-        }
-        else {
-            print "#include \"$src\"\n";
-        }
+        print "#include \"$src\"\n";
         if(not exists $include{$src}) {  # register test entry function
             $tlist .= "  {\"$name\", test_$name},\n";
         }
index f258a6b28ce8fe3408309c7297dbf0d1c9ab2bda..bf7a44bed78f0f43f9fd042ca5f1525ff84f9b85 100644 (file)
@@ -80,7 +80,7 @@ else
 curlx_src = $(CURLX_CFILES)
 endif
 curltool_unity.c: $(top_srcdir)/scripts/mk-unity.pl $(CURL_CFILES) $(curl_cfiles_gen) $(curlx_src)
-       @PERL@ $(top_srcdir)/scripts/mk-unity.pl --srcdir $(srcdir) --include $(CURL_CFILES) $(curl_cfiles_gen) $(curlx_src) > curltool_unity.c
+       @PERL@ $(top_srcdir)/scripts/mk-unity.pl --include $(CURL_CFILES) $(curl_cfiles_gen) $(curlx_src) > curltool_unity.c
 
 nodist_curl_SOURCES = curltool_unity.c
 curl_SOURCES =
@@ -205,7 +205,7 @@ endif
 endif
 
 # disable the tests that are mostly causing false positives
-TIDYFLAGS := -checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling -quiet
+TIDYFLAGS := -checks=-clang-analyzer-security.insecureAPI.bzero,-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling -quiet
 if CURL_WERROR
 TIDYFLAGS += --warnings-as-errors=*
 endif
index 0cf3e3752912f2c64ba8f956651c635085b91694..e428076cc5b457c836ee1effb66c3ded4b89511c 100644 (file)
@@ -34,6 +34,11 @@ if(BUILD_CURL_EXE)
   add_dependencies(testdeps curlinfo)
 endif()
 
+if(CURL_CLANG_TIDY)
+  add_custom_target(tests-clang-tidy)
+  add_dependencies(testdeps tests-clang-tidy)
+endif()
+
 add_subdirectory(http)
 add_subdirectory(client)
 add_subdirectory(server)
index 7d980010c07b2ddc3b97450b5c77fd127e899965..a2a67eea677d504fb49e1a94122d3a26067a91fd 100644 (file)
@@ -31,8 +31,8 @@ if(LIB_SELECTED STREQUAL LIB_STATIC)
 endif()
 
 add_custom_command(OUTPUT "${BUNDLE}.c"
-  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --include ${CURLX_CFILES} --test ${TESTFILES}
-    ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE}.c"
+  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+    --include ${CURLX_CFILES} --test ${TESTFILES} > "${BUNDLE}.c"
   DEPENDS
     "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
     ${FIRSTFILES} ${CURLX_CFILES} ${TESTFILES}
@@ -48,4 +48,6 @@ target_include_directories(${BUNDLE} PRIVATE
   "${CMAKE_CURRENT_SOURCE_DIR}"          # for the generated bundle source to find included test sources
 )
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIES")
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+
+curl_clang_tidy_tests(${BUNDLE} ${FIRSTFILES} ${TESTFILES})
index 9ef237ee0f8622084dc9285b43938b36da66e004..7a7e919e33beb03a3b02cae10a75af27905f027a 100644 (file)
@@ -40,8 +40,8 @@ add_custom_command(OUTPUT "lib1521.c"
 list(APPEND TESTFILES "lib1521.c")
 
 add_custom_command(OUTPUT "${BUNDLE}.c"
-  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --include ${UTILS} ${CURLX_CFILES} --test ${TESTFILES}
-    ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE}.c"
+  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+    --include ${UTILS} ${CURLX_CFILES} --test ${TESTFILES} > "${BUNDLE}.c"
   DEPENDS
     "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
     ${FIRSTFILES} ${UTILS} ${CURLX_CFILES} ${TESTFILES}
@@ -59,7 +59,9 @@ target_include_directories(${BUNDLE} PRIVATE
 )
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "${CURL_DEBUG_MACROS}")
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIES" "CURL_DISABLE_DEPRECATION")
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+
+curl_clang_tidy_tests(${BUNDLE} ${FIRSTFILES} ${UTILS} ${TESTFILES} ${STUB_GSS})
 
 if(HAVE_GSSAPI AND UNIX)
   add_library(stubgss SHARED EXCLUDE_FROM_ALL ${STUB_GSS})
index 1f5136fb4422ac17d3c22c5142ee4d20f47a9afc..9467a89c338903c0c775c4c45fbecbbfd1dc1e85 100644 (file)
@@ -27,8 +27,8 @@ curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile
 include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
 
 add_custom_command(OUTPUT "${BUNDLE}.c"
-  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --include ${UTILS} ${CURLX_CFILES} --test ${TESTFILES}
-    ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE}.c"
+  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+    --include ${UTILS} ${CURLX_CFILES} --test ${TESTFILES} > "${BUNDLE}.c"
   DEPENDS
     "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc"
     ${FIRSTFILES} ${UTILS} ${CURLX_CFILES} ${TESTFILES}
@@ -54,4 +54,6 @@ set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIE
 if(WIN32)
   set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_STATICLIB")
 endif()
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+
+curl_clang_tidy_tests(${BUNDLE} ${FIRSTFILES} ${UTILS} ${TESTFILES})
index 2c453f1c6d118adb6480016d762b51158eb62b88..fb89ccb77e7cfb102aeb65bf0c9832d0f97446fb 100644 (file)
@@ -438,6 +438,7 @@ static curl_socket_t mqttit(curl_socket_t fd)
     logmsg("Out of memory, unable to allocate buffer");
     goto end;
   }
+  memset(buffer, 0, buff_size);
 
   do {
     unsigned char usr_flag = 0x80;
index 93aff96104b595118d93c8697a80171772f7770f..c611b9d3bc058fc080bdefcdc083c330e6671526 100644 (file)
@@ -370,7 +370,7 @@ static void lograw(unsigned char *buffer, ssize_t len)
  * *buffer_len is the amount of data in the buffer (output)
  */
 static bool read_data_block(unsigned char *buffer, ssize_t maxlen,
-    ssize_t *buffer_len)
+                            ssize_t *buffer_len)
 {
   if(!read_stdin(buffer, 5))
     return FALSE;
@@ -1118,6 +1118,9 @@ static bool juggle(curl_socket_t *sockfdp,
       if(!read_data_block(buffer, sizeof(buffer), &buffer_len))
         return FALSE;
 
+      if(buffer_len < 0)
+        return FALSE;
+
       if(*mode == PASSIVE_LISTEN) {
         logmsg("*** We are disconnected!");
         if(!disc_handshake())
index 136a1226b482216332fbee8fc01ef6a07553a02b..07e2164c394d753fd39987afd12fd56720e15a32 100644 (file)
@@ -27,8 +27,8 @@ curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile
 include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
 
 add_custom_command(OUTPUT "${BUNDLE}.c"
-  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --test ${TESTFILES}
-    ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE}.c"
+  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+    --test ${TESTFILES} > "${BUNDLE}.c"
   DEPENDS
     "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc" ${FIRSTFILES} ${TESTFILES}
   VERBATIM)
@@ -47,4 +47,6 @@ target_include_directories(${BUNDLE} PRIVATE
 )
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "${CURL_DEBUG_MACROS}")
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIES" "CURL_DISABLE_DEPRECATION")
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+
+curl_clang_tidy_tests(${BUNDLE} ${FIRSTFILES} ${TESTFILES})
index 8077c18ff677de8d061a59236a10ea7d53b42afb..85fe7dbb5a153811e541943ae3365228e832b109 100644 (file)
@@ -27,8 +27,8 @@ curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile
 include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
 
 add_custom_command(OUTPUT "${BUNDLE}.c"
-  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --test ${TESTFILES}
-    ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE}.c"
+  COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl"
+    --test ${TESTFILES} > "${BUNDLE}.c"
   DEPENDS
     "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc" ${FIRSTFILES} ${TESTFILES}
   VERBATIM)
@@ -47,4 +47,6 @@ set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "${CURL_DEBUG_
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIES" "CURL_DISABLE_DEPRECATION")
 # unit tests are small pretend-libcurl-programs
 set_property(TARGET ${BUNDLE} APPEND PROPERTY COMPILE_DEFINITIONS "BUILDING_LIBCURL")
-set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
+set_target_properties(${BUNDLE} PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF C_CLANG_TIDY "")
+
+curl_clang_tidy_tests(${BUNDLE} ${FIRSTFILES} ${TESTFILES})