summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/warnings.configure
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xbuild/moz.configure/warnings.configure253
1 files changed, 253 insertions, 0 deletions
diff --git a/build/moz.configure/warnings.configure b/build/moz.configure/warnings.configure
new file mode 100755
index 0000000000..d0db70f6d3
--- /dev/null
+++ b/build/moz.configure/warnings.configure
@@ -0,0 +1,253 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+option(
+ "--enable-warnings-as-errors",
+ env="MOZ_ENABLE_WARNINGS_AS_ERRORS",
+ default=depends("MOZ_AUTOMATION")(lambda x: bool(x)),
+ help="{Enable|Disable} treating warnings as errors",
+)
+
+
+@depends("--enable-warnings-as-errors")
+def rust_warning_flags(warnings_as_errors):
+ flags = []
+
+ # Note that cargo passes --cap-lints warn to rustc for third-party code, so
+ # we don't need a very complicated setup.
+ if warnings_as_errors:
+ flags.append("-Dwarnings")
+ else:
+ flags.extend(("--cap-lints", "warn"))
+
+ return flags
+
+
+c_warning_flag = dependable("-Werror")
+
+
+@depends("--enable-warnings-as-errors", c_warning_flag)
+def warnings_as_errors(warnings_as_errors, c_warning_flag):
+ if not warnings_as_errors:
+ return ""
+
+ return c_warning_flag
+
+
+set_config("WARNINGS_AS_ERRORS", warnings_as_errors)
+# We have a peculiar setup in old-configure.in where some compilation tests
+# depend on enabling warnings-as-errors even if it's disabled for Firefox
+# compilation. We therefore need this assignment.
+add_old_configure_assignment("WARNINGS_AS_ERRORS", c_warning_flag)
+
+
+# GCC/Clang warnings:
+# https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
+# https://clang.llvm.org/docs/DiagnosticsReference.html
+
+# lots of useful warnings
+add_gcc_warning("-Wall")
+
+# catch implicit truncation of enum values assigned to smaller bit fields
+check_and_add_gcc_warning("-Wbitfield-enum-conversion")
+
+# catches bugs, e.g. "if (c); foo();", few false positives
+add_gcc_warning("-Wempty-body")
+
+# catches return types with qualifiers like const
+add_gcc_warning("-Wignored-qualifiers")
+
+# function declaration hides virtual function from base class.
+# Don't enable for GCC, since it's more strict than clang,
+# and the additional cases it covers are not valuable.
+add_gcc_warning(
+ "-Woverloaded-virtual",
+ cxx_compiler,
+ when=depends(cxx_compiler)(lambda c: c.type != "gcc"),
+)
+
+# catches pointer arithmetic using NULL or sizeof(void)
+add_gcc_warning("-Wpointer-arith")
+
+# catch modifying constructor parameter that shadows member variable
+check_and_add_gcc_warning("-Wshadow-field-in-constructor-modified")
+
+# catches comparing signed/unsigned ints
+add_gcc_warning("-Wsign-compare")
+
+# catches overflow bugs, few false positives
+add_gcc_warning("-Wtype-limits")
+
+# catches some dead code
+add_gcc_warning("-Wunreachable-code")
+check_and_add_gcc_warning("-Wunreachable-code-return")
+
+# catches treating string literals as non-const
+add_gcc_warning("-Wwrite-strings", cxx_compiler)
+
+# turned on by -Wall, but we use offsetof on non-POD types frequently
+add_gcc_warning("-Wno-invalid-offsetof", cxx_compiler)
+
+# catches objects passed by value to variadic functions.
+check_and_add_gcc_warning("-Wclass-varargs")
+
+# catches empty if/switch/for initialization statements that have no effect
+check_and_add_gcc_warning("-Wempty-init-stmt", cxx_compiler)
+
+# catches some implicit conversion of floats to ints
+check_and_add_gcc_warning("-Wfloat-overflow-conversion")
+check_and_add_gcc_warning("-Wfloat-zero-conversion")
+
+# catches issues around loops
+check_and_add_gcc_warning("-Wloop-analysis")
+# But, disable range-loop-analysis because it can raise unhelpful false
+# positives.
+check_and_add_gcc_warning("-Wno-range-loop-analysis")
+
+# catches C++ version forward-compat issues
+check_and_add_gcc_warning("-Wc++2a-compat", cxx_compiler)
+
+# catches possible misuse of the comma operator
+check_and_add_gcc_warning("-Wcomma", cxx_compiler)
+
+# catches duplicated conditions in if-else-if chains
+check_and_add_gcc_warning("-Wduplicated-cond")
+
+# catches unintentional switch case fallthroughs
+check_and_add_gcc_warning("-Wimplicit-fallthrough", cxx_compiler)
+
+# catches unused variable/function declarations
+check_and_add_gcc_warning("-Wunused-function", cxx_compiler)
+check_and_add_gcc_warning("-Wunused-variable", cxx_compiler)
+
+# catches expressions used as a null pointer constant
+# XXX: at the time of writing, the version of clang used on the OS X test
+# machines has a bug that causes it to reject some valid files if both
+# -Wnon-literal-null-conversion and -Wsometimes-uninitialized are
+# specified. We work around this by instead using
+# -Werror=non-literal-null-conversion, but we only do that when
+# --enable-warnings-as-errors is specified so that no unexpected fatal
+# warnings are produced.
+check_and_add_gcc_warning(
+ "-Werror=non-literal-null-conversion", when="--enable-warnings-as-errors"
+)
+
+# catches string literals used in boolean expressions
+check_and_add_gcc_warning("-Wstring-conversion")
+
+# catches comparisons that are always true or false
+check_and_add_gcc_warning("-Wtautological-overlap-compare")
+check_and_add_gcc_warning("-Wtautological-unsigned-enum-zero-compare")
+check_and_add_gcc_warning("-Wtautological-unsigned-zero-compare")
+# This can be triggered by certain patterns used deliberately in portable code
+check_and_add_gcc_warning("-Wno-error=tautological-type-limit-compare")
+
+# we inline 'new' and 'delete' in mozalloc
+check_and_add_gcc_warning("-Wno-inline-new-delete", cxx_compiler)
+
+# Prevent the following GCC warnings from being treated as errors:
+# too many false positives
+check_and_add_gcc_warning("-Wno-error=maybe-uninitialized")
+
+# we don't want our builds held hostage when a platform-specific API
+# becomes deprecated.
+check_and_add_gcc_warning("-Wno-error=deprecated-declarations")
+
+# false positives depending on optimization
+check_and_add_gcc_warning("-Wno-error=array-bounds")
+
+# can't get rid of those PGO warnings
+check_and_add_gcc_warning("-Wno-error=coverage-mismatch")
+
+# -Wbackend-plugin warnings from Android PGO profile-use builds:
+# error: /builds/worker/workspace/build/src/mozglue/misc/AutoProfilerLabel.cpp:
+# Function control flow change detected (hash mismatch)
+# _ZN7mozilla17AutoProfilerLabelD2Ev [-Werror,-Wbackend-plugin]
+check_and_add_gcc_warning("-Wno-error=backend-plugin")
+
+# false positives depending on optimizations
+check_and_add_gcc_warning("-Wno-error=free-nonheap-object")
+
+# Would be a pain to fix all occurrences, for very little gain
+check_and_add_gcc_warning("-Wno-multistatement-macros")
+
+# Disable the -Werror for return-std-move because of a false positive
+# on nsTAutoStringN: https://bugs.llvm.org/show_bug.cgi?id=37249
+check_and_add_gcc_warning("-Wno-error=return-std-move")
+
+# Disable the -Werror for -Wclass-memaccess as we have a long
+# tail of issues to fix
+check_and_add_gcc_warning("-Wno-error=class-memaccess")
+
+# -Watomic-alignment is a new warning in clang 7 that seems way too broad.
+# https://bugs.llvm.org/show_bug.cgi?id=38593
+check_and_add_gcc_warning("-Wno-error=atomic-alignment")
+
+# New warning with gcc 9. Not useful
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1515356
+check_and_add_gcc_warning("-Wno-error=deprecated-copy")
+
+# catches format/argument mismatches with printf
+c_format_warning, cxx_format_warning = check_and_add_gcc_warning(
+ "-Wformat", when=depends(target)(lambda t: t.kernel != "WINNT")
+)
+
+# Add compile-time warnings for unprotected functions and format functions
+# that represent possible security problems. Enable this only when -Wformat
+# is enabled, otherwise it is an error
+check_and_add_gcc_warning(
+ "-Wformat-security", when=c_format_warning & cxx_format_warning
+)
+check_and_add_gcc_warning(
+ "-Wformat-overflow=2", when=c_format_warning & cxx_format_warning
+)
+
+# Other MinGW specific things
+with only_when(depends(target)(lambda t: t.kernel == "WINNT")):
+ # When compiling for Windows with gcc, we encounter lots of "#pragma warning"'s
+ # which is an MSVC-only pragma that GCC does not recognize.
+ check_and_add_gcc_warning("-Wno-unknown-pragmas")
+
+ # When compiling for Windows with gcc, gcc throws false positives and true
+ # positives where the callsite is ifdef-ed out
+ check_and_add_gcc_warning("-Wno-unused-function")
+
+ # When compiling for Windows with gcc, gcc cannot produce this warning
+ # correctly: it mistakes DWORD_PTR and ULONG_PTR as types you cannot
+ # give NULL to. (You can in fact do that.)
+ check_and_add_gcc_warning("-Wno-conversion-null")
+
+ # Throughout the codebase we regularly have switch statements off of enums
+ # without covering every value in the enum. We don't care about these warnings.
+ check_and_add_gcc_warning("-Wno-switch")
+
+ # Another code pattern we have is using start and end constants in enums of
+ # different types. We do this for safety, but then when comparing it throws
+ # an error, which we would like to ignore. This seems to only affect the MinGW
+ # build, but we're not sure why.
+ check_and_add_gcc_warning("-Wno-enum-compare")
+
+# We hit this all over the place with the gtest INSTANTIATE_TEST_CASE_P macro
+check_and_add_gcc_warning("-Wno-gnu-zero-variadic-macro-arguments")
+
+# Make it an error to be missing function declarations for C code.
+check_and_add_gcc_warning("-Werror=implicit-function-declaration", c_compiler)
+
+# New in clang 11. We can't really do anything about this warning.
+check_and_add_gcc_warning("-Wno-psabi")
+
+# Disable broken missing-braces warning on old clang versions
+check_and_add_gcc_warning(
+ "-Wno-missing-braces",
+ when=depends(c_compiler)(lambda c: c.type == "clang" and c.version < "6.0"),
+)
+
+
+# Please keep these last in this file
+add_old_configure_assignment("_WARNINGS_CFLAGS", warnings_flags.cflags)
+add_old_configure_assignment("_WARNINGS_CXXFLAGS", warnings_flags.cxxflags)
+add_old_configure_assignment("_WARNINGS_HOST_CFLAGS", warnings_flags.host_cflags)
+add_old_configure_assignment("_WARNINGS_HOST_CXXFLAGS", warnings_flags.host_cxxflags)