mirror of
https://github.com/curl/curl.git
synced 2026-04-14 18:11:40 +03:00
Enable in one existing Linux, macOS and Windows job.
Cost:
- Linux: +1.3 minutes.
- macOS: +1.5 minutes.
- Windows: +2.5 minutes.
Fix or silence issues found:
- conncache: silence NULL deref warning.
```
lib/conncache.c:564:18: warning: dereference of NULL '*data.multi' [CWE-476] [-Wanalyzer-null-dereference]
```
Ref: ede6a8e087 #19378
- http2: check pointer for NULL.
```
lib/http2.c:388:7: error: dereference of NULL ‘data’ [CWE-476] [-Wanalyzer-null-dereference]
```
- http2: silence potential NULL deref in `cf_h2_recv`.
```
lib/http2.c: In function 'cf_h2_recv':
lib/curl_trc.h:62:15: warning: dereference of NULL 'data' [CWE-476] [-Wanalyzer-null-dereference]
```
- openldap: silence deref before NULL check.
Seen in GHA/Linux.
```
lib/openldap.c: In function ‘oldap_state_mechs_resp’:
lib/curl_trc.h:140:7: warning: check of ‘data’ for NULL after already dereferencing it [-Wanalyzer-deref-before-check]
```
- sendf: silence NULL deref false positive in `Curl_creader_set_fread`.
It looks impossible to happen.
```
lib/sendf.c:1133:7: warning: dereference of NULL 'r' [CWE-476] [-Wanalyzer-null-dereference]
```
- ws: silence deref before NULL check.
```
lib/ws.c: In function 'ws_send_raw_blocking':
lib/curl_trc.h:205:7: warning: check of 'data' for NULL after already dereferencing it [-Wanalyzer-deref-before-check]
```
- var: fix potential NULL deref
```
src/var.c:216:29: warning: dereference of NULL 'envp' [CWE-476] [-Wanalyzer-null-dereference]
```
- cli_hx_upload.c: fix NULL check after dereference.
```
tests/libtest/cli_hx_upload.c:170:7: warning: check of '*t.method' for NULL after already dereferencing it [-Wanalyzer-deref-before-check]
```
- unit1607, unit1609: fix theoretical NULL ptr dereference.
```
tests/unit/unit1607.c:211:12: warning: dereference of NULL 'addr' [CWE-476] [-Wanalyzer-null-dereference]
tests/unit/unit1609.c:193:12: warning: dereference of NULL 'addr' [CWE-476] [-Wanalyzer-null-dereference]
```
- globally disable checks triggering false positives only:
```
docs/examples/externalsocket.c:135:8: warning: 'connect' on possibly invalid file descriptor 'sockfd' [-Wanalyzer-fd-use-without-check]
lib/bufq.c:465:16: warning: infinite loop [CWE-835] [-Wanalyzer-infinite-loop] (gcc-15 Windows)
lib/doh.c:1035:34: warning: stack-based buffer over-read [CWE-126] [-Wanalyzer-out-of-bounds] (gcc-15 macOS)
lib/ftp.c:4022:20: warning: infinite loop [CWE-835] [-Wanalyzer-infinite-loop] (gcc-15 macOS)
lib/http2.c:689:28: warning: buffer over-read [CWE-126] [-Wanalyzer-out-of-bounds] (gcc-15 macOS)
lib/socketpair.c:195:5: warning: leak of file descriptor 'curl_dbg_socket(2, 1, 0, 192, "D:/a/curl/curl/lib/socketpair.c")' [CWE-775] [-Wanalyzer-fd-leak]
src/tool_doswin.c:810:7: warning: leak of file descriptor '*tdata.socket_l' [CWE-775] [-Wanalyzer-fd-leak]
src/tool_doswin.c:816:9: warning: leak of file descriptor '*tdata.socket_l' [CWE-775] [-Wanalyzer-fd-leak]
src/tool_main.c:96:1: warning: leak of file descriptor 'fd[0]' [CWE-775] [-Wanalyzer-fd-leak]
src/tool_main.c:96:1: warning: leak of file descriptor 'fd[1]' [CWE-775] [-Wanalyzer-fd-leak]
src/tool_urlglob.c:48:17: warning: leak of 'malloc(8)' [CWE-401] [-Wanalyzer-malloc-leak]
src/tool_writeout.c:870:3: warning: leak of FILE 'stream2' [CWE-775] [-Wanalyzer-file-leak]
tests/libtest/lib518.c:90:1: warning: leak of FILE [CWE-775] [-Wanalyzer-file-leak]
tests/libtest/lib537.c:87:1: warning: leak of FILE [CWE-775] [-Wanalyzer-file-leak]
tests/server/tftpd.c:1147:10: warning: 'bind' on possibly invalid file descriptor 'sock' [-Wanalyzer-fd-use-without-check]
tests/server/tftpd.c:1155:10: warning: 'bind' on possibly invalid file descriptor 'sock' [-Wanalyzer-fd-use-without-check]
tests/server/tftpd.c:1259:10: warning: 'connect' on possibly invalid file descriptor '4294967295' [-Wanalyzer-fd-use-without-check]
```
Also:
- cmake: update clang-tidy typecheck comment.
Ref: https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html
Closes #20921
100 lines
4.7 KiB
CMake
100 lines
4.7 KiB
CMake
#***************************************************************************
|
|
# _ _ ____ _
|
|
# Project ___| | | | _ \| |
|
|
# / __| | | | |_) | |
|
|
# | (__| |_| | _ <| |___
|
|
# \___|\___/|_| \_\_____|
|
|
#
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
#
|
|
# This software is licensed as described in the file COPYING, which
|
|
# you should have received as part of this distribution. The terms
|
|
# are also available at https://curl.se/docs/copyright.html.
|
|
#
|
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
# copies of the Software, and permit persons to whom the Software is
|
|
# furnished to do so, under the terms of the COPYING file.
|
|
#
|
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
# KIND, either express or implied.
|
|
#
|
|
# SPDX-License-Identifier: curl
|
|
#
|
|
###########################################################################
|
|
add_custom_target(curl-examples)
|
|
|
|
# Get check_PROGRAMS, COMPLICATED_MAY_BUILD, COMPLICATED_EXAMPLES variables
|
|
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
|
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
|
|
|
|
set(_with_deps "")
|
|
set(_all_src "")
|
|
set(_all_canary "")
|
|
set(_all "all")
|
|
foreach(_target IN LISTS COMPLICATED_MAY_BUILD check_PROGRAMS _all) # keep 'COMPLICATED_MAY_BUILD' first, and '_all' last
|
|
# Strip .c suffix from COMPLICATED_MAY_BUILD items
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
|
|
cmake_path(GET _target STEM _target)
|
|
else()
|
|
get_filename_component(_target "${_target}" NAME_WE)
|
|
endif()
|
|
set(_more_libs "")
|
|
set(_target_name "curl-example-${_target}")
|
|
if(_target STREQUAL "all")
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
|
|
add_library(${_target_name} OBJECT EXCLUDE_FROM_ALL ${_all_src})
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") # MSVC but exclude clang-cl
|
|
# CMake generates a static library for the OBJECT target. Silence these 'lib.exe' warnings:
|
|
# warning LNK4006: main already defined in ....obj; second definition ignored
|
|
# warning LNK4221: This object file does not define any previously undefined public symbols,
|
|
# [...] not be used by any link operation that consumes this library
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
|
|
set_target_properties(${_target_name} PROPERTIES STATIC_LIBRARY_OPTIONS "-ignore:4006;-ignore:4221")
|
|
else()
|
|
set_target_properties(${_target_name} PROPERTIES STATIC_LIBRARY_FLAGS "-ignore:4006 -ignore:4221")
|
|
endif()
|
|
endif()
|
|
else()
|
|
add_library(${_target_name} STATIC EXCLUDE_FROM_ALL ${_all_src})
|
|
endif()
|
|
if(_with_deps)
|
|
set(_more_libs ${CURL_LIBS}) # If any examples required dependencies, link them
|
|
endif()
|
|
add_custom_target(curl-examples-build) # Special target to compile all tests quickly and build a single test to probe linkage
|
|
add_dependencies(curl-examples-build ${_target_name} ${_all_canary}) # Include a full build of a single test
|
|
else()
|
|
# Check if the example requires a build option. Then check if that build option is enabled.
|
|
# If it is, link all dependencies to the example.
|
|
set(_requires_regex "/\\* Requires: ([A-Z0-9_]+) \\*/")
|
|
file(STRINGS "${_target}.c" _req REGEX "${_requires_regex}")
|
|
string(REGEX REPLACE "${_requires_regex}" "\\1" _req "${_req}")
|
|
if(_req)
|
|
if(${${_req}})
|
|
string(APPEND _with_deps " ${_target}:${_req}")
|
|
set(_more_libs ${CURL_LIBS})
|
|
else()
|
|
continue() # Option required, but not found
|
|
endif()
|
|
endif()
|
|
set(_all_canary ${_target_name}) # Save the last test for the curl-examples-build target
|
|
list(APPEND _all_src "${_target}.c")
|
|
add_executable(${_target_name} EXCLUDE_FROM_ALL "${_target}.c")
|
|
add_dependencies(curl-examples ${_target_name})
|
|
endif()
|
|
target_link_libraries(${_target_name} ${LIB_SELECTED} ${CURL_NETWORK_AND_TIME_LIBS} ${_more_libs})
|
|
target_compile_definitions(${_target_name} PRIVATE "CURL_NO_OLDIES" "$<$<BOOL:${WIN32}>:WIN32_LEAN_AND_MEAN>")
|
|
if(CURL_ANALYZER_CFLAGS)
|
|
set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_OPTIONS ${CURL_ANALYZER_CFLAGS})
|
|
endif()
|
|
set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME "${_target}" PROJECT_LABEL "Example ${_target}" UNITY_BUILD OFF)
|
|
endforeach()
|
|
|
|
if(_with_deps)
|
|
message(STATUS "Enabled examples with dependencies:${_with_deps}")
|
|
endif()
|
|
|
|
if(CURL_BUILD_EVERYTHING STREQUAL "QUICK")
|
|
set_target_properties(curl-examples-build PROPERTIES EXCLUDE_FROM_ALL FALSE)
|
|
elseif(CURL_BUILD_EVERYTHING AND NOT CURL_BUILD_EVERYTHING STREQUAL "NOEXAMPLES")
|
|
set_target_properties(curl-examples PROPERTIES EXCLUDE_FROM_ALL FALSE)
|
|
endif()
|