New-Cli-Installer/cmake/CompilerWarnings.cmake

227 lines
8.5 KiB
CMake
Raw Normal View History

2021-11-26 02:34:58 +08:00
function(set_project_warnings project_name)
2022-11-19 08:19:55 +08:00
option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF)
2022-11-17 06:15:20 +08:00
option(ENABLE_HARD_WARNINGS "Enable HARD warnings for static ananlyzer" OFF)
2021-11-26 02:34:58 +08:00
2021-12-01 12:20:39 +08:00
set(MSVC_WARNINGS
2021-12-01 20:37:18 +08:00
/W4 # Baseline reasonable warnings
/w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss of data
/w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
/w14263 # 'function': member function does not override any base class virtual member function
/w14265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may not
# be destructed correctly
/w14287 # 'operator': unsigned/negative constant mismatch
/we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside
# the for-loop scope
/w14296 # 'operator': expression is always 'boolean_value'
/w14311 # 'variable': pointer truncation from 'type1' to 'type2'
/w14545 # expression before comma evaluates to a function which is missing an argument list
2021-12-01 12:20:39 +08:00
/w14546 # function call before comma missing argument list
2021-12-01 20:37:18 +08:00
/w14547 # 'operator': operator before comma has no effect; expected operator with side-effect
/w14549 # 'operator': operator before comma has no effect; did you intend 'operator'?
/w14555 # expression has no effect; expected expression with side- effect
/w14619 # pragma warning: there is no warning number 'number'
/w14640 # Enable warning on thread un-safe static member initialization
/w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may cause unexpected runtime behavior.
/w14905 # wide string literal cast to 'LPSTR'
/w14906 # string literal cast to 'LPWSTR'
/w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied
/permissive- # standards conformance mode for MSVC compiler.
2021-12-01 12:20:39 +08:00
)
2021-11-26 02:34:58 +08:00
2021-12-01 12:20:39 +08:00
set(CLANG_WARNINGS
-Wall
2021-12-01 20:37:18 +08:00
-Wextra # reasonable and standard
-Wshadow # warn the user if a variable declaration shadows one from a parent context
-Wnon-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
-Wold-style-cast # warn for c-style casts
-Wcast-align # warn for potential performance problem casts
-Wunused # warn on anything being unused
-Woverloaded-virtual # warn if you overload (not override) a virtual function
-Wpedantic # warn if non-standard C++ is used
-Wconversion # warn on type conversions that may lose data
-Wsign-conversion # warn on sign conversions
-Wnull-dereference # warn if a null dereference is detected
-Wdouble-promotion # warn if float is implicit promoted to double
-Wformat=2 # warn on security issues around functions that format output (ie printf)
-Wimplicit-fallthrough # warn on statements that fallthrough without an explicit annotation
2021-12-01 12:20:39 +08:00
)
2021-11-26 02:34:58 +08:00
2022-11-17 06:15:20 +08:00
if(WARNINGS_AS_ERRORS AND NOT ENABLE_HARD_WARNINGS)
2021-12-01 12:20:39 +08:00
set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror)
set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX)
endif()
2021-11-26 02:34:58 +08:00
2021-12-01 12:20:39 +08:00
set(GCC_WARNINGS
${CLANG_WARNINGS}
2022-08-10 02:17:08 +08:00
-Wno-deprecated
2021-12-01 20:37:18 +08:00
-Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist
-Wduplicated-cond # warn if if / else chain has duplicated conditions
-Wduplicated-branches # warn if if / else branches have duplicated code
-Wlogical-op # warn about logical operations being used where bitwise were probably wanted
-Wuseless-cast # warn if you perform a cast to the same type
2022-01-03 05:45:54 +08:00
2022-06-06 04:36:15 +08:00
#-Wsuggest-attribute=cold
2022-03-21 07:31:24 +08:00
#-Wsuggest-attribute=format
2022-01-03 05:45:54 +08:00
-Wsuggest-attribute=malloc
-Wsuggest-attribute=noreturn
-Wsuggest-attribute=pure
2022-02-12 08:38:15 +08:00
#-Wsuggest-final-methods
#-Wsuggest-final-types
2022-11-19 08:19:55 +08:00
-Wsuggest-override
2022-01-03 05:45:54 +08:00
-Wdiv-by-zero
-Wanalyzer-double-fclose
-Wanalyzer-double-free
-Wanalyzer-malloc-leak
-Wanalyzer-use-after-free
2022-11-17 06:15:20 +08:00
## some more analyzer flags
2022-11-19 08:19:55 +08:00
-Wnonnull
-Wnonnull-compare
-Wnormalized=nfkc
-Wnull-dereference
-Wopenacc-parallelism
-Wopenmp-simd
-Wpmf-conversions
-Waggressive-loop-optimizations
2022-11-17 06:15:20 +08:00
-Wanalyzer-tainted-allocation-size
-Wanalyzer-use-of-uninitialized-value
-Wanalyzer-use-of-pointer-in-stale-stack-frame
-Wanalyzer-free-of-non-heap
-Wanalyzer-mismatching-deallocation
-Wanalyzer-null-dereference
-Wanalyzer-possible-null-dereference
2021-12-01 12:20:39 +08:00
)
2021-11-26 02:34:58 +08:00
2022-11-17 06:15:20 +08:00
if(ENABLE_HARD_WARNINGS)
2022-11-19 08:19:55 +08:00
set(CLANG_WARNINGS ${CLANG_WARNINGS}
-Weverything
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-c++11-compat
-Wno-c++14-compat
-Wno-documentation-unknown-command
-Wno-reserved-identifier
)
2022-11-17 06:15:20 +08:00
set(GCC_WARNINGS
${GCC_WARNINGS}
-fanalyzer
-Wanalyzer-too-complex
## just for testing
2022-11-19 08:19:55 +08:00
-Weffc++
-Walloca
-Walloc-zero
-Wcannot-profile
-Wcast-align
-Wcast-align=strict
-Wcast-function-type
-Wcast-qual
-Wcatch-value=3
-Wchar-subscripts
-Wclass-conversion
-Wclass-memaccess
-Wclobbered
-Wcomma-subscript
-Wcomment
-Wcomments
-Wconditionally-supported
-Wconversion
-Wconversion-null
-Wcoverage-invalid-line-number
-Wcoverage-mismatch
-Wcpp
-Wctad-maybe-unsupported
-Wctor-dtor-privacy
-Wdangling-else
-Wdangling-pointer=2
-Wdate-time
-Wdelete-incomplete
-Wdelete-non-virtual-dtor
-Wframe-address
-Wfree-nonheap-object
-Whsa
-Wlto-type-mismatch
-Wno-namespaces
-Wnarrowing
-Wnoexcept
-Wnoexcept-type
-Wnon-template-friend
-Wnon-virtual-dtor
-Wodr
-Wold-style-cast
-Woverflow
-Woverlength-strings
-Woverloaded-virtual
-Wpacked
-Wpacked-bitfield-compat
-Wpacked-not-aligned
-Wno-padded
-Wparentheses
-Wpessimizing-move
-Wplacement-new=2
-Wpragmas
-Wprio-ctor-dtor
-Wpsabi
-Wrange-loop-construct
-Wredundant-decls
-Wredundant-move
-Wredundant-tags
-Wregister
-Wscalar-storage-order
-Wsequence-point
-Wshadow=compatible-local
-Wshadow=global
-Wshadow=local
-Wstack-protector
-Wsync-nand
-Wsynth
-Wtsan
-Wtype-limits
-Wundef
-Wuninitialized
-Wunknown-pragmas
-Wunreachable-code
-Wunsafe-loop-optimizations
-Wuse-after-free=3
-Wvector-operation-performance
-Wvexing-parse
-Wvirtual-inheritance
-Wvirtual-move-assign
-Wvla
-Wvla-parameter
-Wvolatile
-Wvolatile-register-var
-Wwrite-strings
-Wzero-as-null-pointer-constant
-Wzero-length-bounds
2022-11-17 06:15:20 +08:00
-Wanalyzer-exposure-through-output-file
-Wanalyzer-file-leak
-Wanalyzer-null-argument
-Wanalyzer-possible-null-argument
-Wanalyzer-shift-count-negative
-Wanalyzer-shift-count-overflow
-Wanalyzer-stale-setjmp-buffer
-Wanalyzer-unsafe-call-within-signal-handler
-Wanalyzer-write-to-const
-Wanalyzer-write-to-string-literal
)
endif()
2021-12-01 12:20:39 +08:00
if(MSVC)
set(PROJECT_WARNINGS ${MSVC_WARNINGS})
2021-12-01 20:37:18 +08:00
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
2021-12-01 12:20:39 +08:00
set(PROJECT_WARNINGS ${CLANG_WARNINGS})
2021-12-01 20:37:18 +08:00
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
2021-12-01 12:20:39 +08:00
set(PROJECT_WARNINGS ${GCC_WARNINGS})
2021-12-01 20:37:18 +08:00
else()
message(AUTHOR_WARNING "No compiler warnings set for '${CMAKE_CXX_COMPILER_ID}' compiler.")
2021-12-01 12:20:39 +08:00
endif()
2021-11-26 02:34:58 +08:00
2021-12-01 12:20:39 +08:00
target_compile_options(${project_name} INTERFACE ${PROJECT_WARNINGS})
2021-11-26 02:34:58 +08:00
endfunction()