Skip to content

Commit 10b4d6d

Browse files
committed
Use static analyzer
1 parent 9ca7aa3 commit 10b4d6d

File tree

5 files changed

+146
-13
lines changed

5 files changed

+146
-13
lines changed

.clang-tidy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Checks: "concurrency-*, performance-*, portability-*, bugprone-*, -bugprone-easily-swappable-parameters"
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Static Analysis
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
build:
7+
name: ${{ matrix.preset }}
8+
strategy:
9+
fail-fast: false
10+
matrix:
11+
preset: [linux-clang, linux-gcc, macos, windows]
12+
include:
13+
- preset: linux-clang
14+
os: ubuntu-latest
15+
generator: '"Ninja Multi-Config"'
16+
cc: clang
17+
cxx: clang++
18+
- preset: linux-gcc
19+
os: ubuntu-latest
20+
generator: '"Ninja Multi-Config"'
21+
cc: gcc
22+
cxx: g++
23+
- preset: macos
24+
os: macos-latest
25+
generator: Xcode
26+
- preset: windows
27+
os: windows-latest
28+
generator: '"Visual Studio 17 2022"'
29+
runs-on: ${{ matrix.os }}
30+
steps:
31+
- name: Checkout
32+
uses: actions/checkout@v4
33+
34+
- name: Install dependencies on Linux
35+
if: runner.os == 'Linux'
36+
run: |
37+
sudo apt-get update
38+
sudo apt-get install -y ninja-build cppcheck clang-tidy
39+
- name: Install dependencies on macOS
40+
if: runner.os == 'macOS'
41+
run: brew install cppcheck
42+
43+
- name: Set CMake caches
44+
run: |
45+
echo 'set(HTTPLIB_COMPILE ON CACHE STRING "")' >> cache.cmake
46+
echo 'set(HTTPLIB_USE_STATIC_ANALYZER ON CACHE STRING "")' >> cache.cmake
47+
48+
- name: Set CMake caches for Linux
49+
if: runner.os == 'Linux'
50+
run: |
51+
echo 'set(CMAKE_C_COMPILER "${{ matrix.cc }}" CACHE STRING "")' >> cache.cmake
52+
echo 'set(CMAKE_CXX_COMPILER "${{ matrix.cxx }}" CACHE STRING "")' >> cache.cmake
53+
54+
- name: Configure
55+
run: cmake -B build -G ${{ matrix.generator }} -C cache.cmake
56+
57+
- name: Build
58+
run: cmake --build build

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ ipch
4343
!/.gitattributes
4444
!/.travis.yml
4545
!.github
46+
!.clang-tidy

CMakeLists.txt

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ option(HTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN "Enable feature to load system cer
108108
# Defaults to static library
109109
option(BUILD_SHARED_LIBS "Build the library as a shared library instead of static. Has no effect if using header-only." OFF)
110110

111+
option(HTTPLIB_USE_STATIC_ANALYZER "" OFF)
112+
113+
if(HTTPLIB_USE_STATIC_ANALYZER)
114+
include(cmake/UseStaticAnalyzer.cmake)
115+
endif()
116+
111117
if(BUILD_SHARED_LIBS AND WIN32 AND HTTPLIB_COMPILE)
112118
# Necessary for Windows if building shared libs
113119
# See https://stackoverflow.com/a/40743080
@@ -226,19 +232,6 @@ if(HTTPLIB_COMPILE)
226232
SOVERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}"
227233
OUTPUT_NAME cpp-httplib
228234
)
229-
230-
if(MSVC)
231-
target_compile_options(${PROJECT_NAME} PRIVATE
232-
/W4 /permissive-
233-
234-
# Turn off warnings of external libraries
235-
/external:anglebrackets /external:W0 /analyze:external-
236-
)
237-
else()
238-
target_compile_options(${PROJECT_NAME} PRIVATE
239-
-Wall -Wextra -pedantic
240-
)
241-
endif()
242235
else()
243236
# This is for header-only.
244237
set(_INTERFACE_OR_PUBLIC INTERFACE)

cmake/UseStaticAnalyzer.cmake

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
find_program(CLANG_TIDY NAMES clang-tidy)
2+
3+
if(CLANG_TIDY)
4+
list(APPEND CLANG_TIDY_OPTIONS -p ${CMAKE_BINARY_DIR})
5+
set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY} ${CLANG_TIDY_OPTIONS})
6+
set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY} ${CLANG_TIDY_OPTIONS})
7+
endif()
8+
9+
find_program(CPPCHECK NAMES cppcheck)
10+
11+
if(CPPCHECK)
12+
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/cppcheck)
13+
list(APPEND CPPCHECK_OPTIONS
14+
--cppcheck-build-dir=${CMAKE_BINARY_DIR}/cppcheck
15+
--enable=all
16+
)
17+
18+
set(CMAKE_C_CPPCHECK ${CPPCHECK} ${CPPCHECK_OPTIONS})
19+
set(CMAKE_CXX_CPPCHECK ${CPPCHECK} ${CPPCHECK_OPTIONS})
20+
endif()
21+
22+
if(MSVC)
23+
add_compile_options(
24+
/W4 /permissive-
25+
26+
# Turn on useful warnings
27+
/w14242 # 'identfier': conversion from 'type1' to 'type1', possible loss of data
28+
/w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
29+
/w14287 # 'operator': unsigned/negative constant mismatch
30+
/we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside the for-loop scope
31+
/w14296 # 'operator': expression is always 'boolean_value'
32+
/w14311 # 'variable': pointer truncation from 'type1' to 'type2'
33+
/w14545 # expression before comma evaluates to a function which is missing an argument list
34+
/w14546 # function call before comma missing argument list
35+
/w14547 # 'operator': operator before comma has no effect; expected operator with side-effect
36+
/w14549 # 'operator': operator before comma has no effect; did you intend 'operator'?
37+
/w14555 # expression has no effect; expected expression with side-effect
38+
/w14619 # pragma warning: there is no warning number 'number'
39+
/w14640 # Enable warning on thread unsafe static member initialization
40+
/w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may cause unexpected runtime behavior.
41+
/w14905 # wide string literal cast to 'LPSTR'
42+
/w14906 # string literal cast to 'LPWSTR'
43+
/w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied
44+
45+
# Turn off warnings of external libraries
46+
/external:anglebrackets /external:W0 /analyze:external-
47+
48+
# Treat warnings as errors
49+
/wd4263 # 'function': member function does not override any base class virtual member function
50+
/wd4265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may not be destructed correctly
51+
)
52+
else()
53+
add_compile_options(
54+
-Wall -Wextra -pedantic
55+
56+
# Turn on useful warnings
57+
-Wold-style-cast # warn for c-style casts
58+
-Wcast-align # warn for potential performance problem casts
59+
-Wunused # warn on anything being unused
60+
-Wpedantic # warn if non-standard C++ is used
61+
-Wconversion # warn on type conversions that may lose data
62+
-Wsign-conversion # warn on sign conversions
63+
-Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist
64+
$<$<CXX_COMPILER_ID:GNU>:-Wduplicated-cond> # warn if if / else chain has duplicated conditions
65+
$<$<CXX_COMPILER_ID:GNU>:-Wduplicated-branches> # warn if if / else branches have duplicated code
66+
$<$<CXX_COMPILER_ID:GNU>:-Wlogical-op> # warn about logical operations being used where bitwise were probably wanted
67+
$<$<CXX_COMPILER_ID:GNU>:-Wuseless-cast> # warn if you perform a cast to the same type
68+
-Wdouble-promotion # warn if float is implicitly promoted to double
69+
-Wformat=2 # warn on security issues around functions that format output(i.e., printf)
70+
-Wimplicit-fallthrough # warn when case statements fall-through.(Included with -Wextra in GCC, not in clang)
71+
72+
# Treat warnings as errors
73+
-Werror=non-virtual-dtor # warn the user if a class with virtual functions has a non-virtual destructor. This helps catch hard to track down memory errors
74+
-Werror=overloaded-virtual # warn if you overload(not override) a virtual function
75+
-Werror=null-dereference # warn if a null dereference is detected
76+
77+
# Ignore warnings
78+
-Wno-gnu-zero-variadic-macro-arguments
79+
)
80+
endif()

0 commit comments

Comments
 (0)