Source code
Revision control
Copy as Markdown
Other Tools
# -*- 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
option(
    "--enable-warnings-as-errors",
    env="MOZ_ENABLE_WARNINGS_AS_ERRORS",
    default=moz_automation,
    help="{Enable|Disable} treating warnings as errors",
)
@depends("--enable-warnings-as-errors")
def warnings_as_errors(warnings_as_errors):
    if not warnings_as_errors:
        return ""
    return "-Werror"
set_config("WARNINGS_AS_ERRORS", warnings_as_errors)
not_clang_cl = depends(c_compiler)(lambda c: c.type != "clang-cl")
not_clang = depends(c_compiler)(lambda c: c.type != "clang")
not_clang_based = depends(c_compiler)(lambda c: c.type not in ("clang", "clang-cl"))
# GCC/Clang warnings:
# Lots of useful warnings
add_warning("-Wall", when=not_clang_cl)
# In clang-cl, -Wall actually means -Weverything. -W3 does mean -Wall.
add_warning("-W3", when=depends(c_compiler)(lambda c: c.type == "clang-cl"))
# catch implicit truncation of enum values assigned to smaller bit fields
check_and_add_warning("-Wbitfield-enum-conversion", min_clang_version="5.0.0")
# catches bugs, e.g. "if (c); foo();", few false positives
add_warning("-Wempty-body")
# catches mismatched printf integer sizes.
check_and_add_warning("-Wformat-type-confusion", min_clang_version="10.0.0")
# catches return types with qualifiers like const
add_warning("-Wignored-qualifiers")
# catches pointer arithmetic using NULL or sizeof(void)
add_warning("-Wpointer-arith")
# catch modifying constructor parameter that shadows member variable
check_and_add_warning(
    "-Wshadow-field-in-constructor-modified", min_clang_version="4.0.0"
)
# catches comparing signed/unsigned ints
add_warning("-Wsign-compare")
# catches comparisons of values and sized types are always true or false
check_and_add_warning(
    "-Wtautological-constant-in-range-compare", min_clang_version="6.0.0"
)
# catches overflow bugs, few false positives
add_warning("-Wtype-limits")
# This can be triggered by certain patterns used deliberately in portable code
check_and_add_warning(
    "-Wno-error=tautological-type-limit-compare", min_clang_version="6.0.0"
)
# catches some dead code
add_warning("-Wunreachable-code")
check_and_add_warning("-Wunreachable-code-return", min_clang_version="4.0.0")
# catches parameters that are set but not read
# Only enable on clang because gcc reports false positives.
check_and_add_warning(
    "-Wunused-but-set-parameter",
    min_clang_version="13.0.0",
    when=depends(c_compiler)(lambda c: c.type in ("clang", "clang-cl")),
)
# turned on by -Wall, but we use offsetof on non-POD types frequently
add_warning("-Wno-invalid-offsetof", cxx_compiler)
# catches objects passed by value to variadic functions.
check_and_add_warning("-Wclass-varargs", min_clang_version="4.0.0")
# catches empty if/switch/for initialization statements that have no effect
check_and_add_warning("-Wempty-init-stmt", cxx_compiler, min_clang_version="8.0.0")
# catches some implicit conversion of floats to ints
check_and_add_warning("-Wfloat-overflow-conversion", min_clang_version="4.0.0")
check_and_add_warning("-Wfloat-zero-conversion", min_clang_version="4.0.0")
# catches issues around loops
check_and_add_warning("-Wloop-analysis", min_clang_version="4.0.0")
# But, disable range-loop-analysis because it can raise unhelpful false
# positives.
check_and_add_warning("-Wno-range-loop-analysis", min_clang_version="4.0.0")
# Enable some C++20 compat warnings. We can remove these flags after we compile
check_and_add_warning("-Wcomma-subscript", cxx_compiler, when=not_clang_based)
check_and_add_warning("-Wenum-compare-conditional", min_clang_version="10.0.0")
check_and_add_warning("-Wenum-float-conversion", min_clang_version="10.0.0")
check_and_add_warning("-Wvolatile", cxx_compiler, when=not_clang)
# Disable some C++20 errors to be fixed in bugs 1791958, 1791955, and 1775161.
check_and_add_warning(
    "-Wno-deprecated-anon-enum-enum-conversion",
    cxx_compiler,
    min_clang_version="10.0.0",
)
check_and_add_warning(
    "-Wno-deprecated-enum-enum-conversion", cxx_compiler, min_clang_version="10.0.0"
)
# Suppress C++20 warnings about implicit capture of `this` until they are fixed
# so temporarily downgrade all gcc -Wdeprecated errors to warnings.
check_and_add_warning(
    "-Wno-deprecated-this-capture", cxx_compiler, min_clang_version="6.0.0"
)
check_and_add_warning("-Wno-error=deprecated", when=building_with_gcc)
# Enable some C++23 compat warnings. We can remove these flags after we compile
check_and_add_warning("-Wdeprecated-literal-operator", cxx_compiler)
check_and_add_warning("-Winvalid-utf8")
# catches possible misuse of the comma operator
check_and_add_warning("-Wcomma", cxx_compiler, min_clang_version="4.0.0")
# catches duplicated conditions in if-else-if chains
check_and_add_warning("-Wduplicated-cond", when=not_clang_based)
# catches unintentional switch case fallthroughs
check_and_add_warning("-Wimplicit-fallthrough", cxx_compiler, min_clang_version="4.0.0")
# Warn about suspicious uses of logical operators in expressions.
check_and_add_warning("-Wlogical-op", when=not_clang_based)
# Enable some ObjC diagnostics that are only relevant when targeting macOS:
with only_when(depends(target)(lambda t: t.kernel == "Darwin")):
    # catch redeclaration of ObjC method parameter name
    check_and_add_warning("-Wduplicate-method-arg")
    # catch multiple declarations of ObjC method found
    check_and_add_warning("-Wduplicate-method-match")
    # catch ObjC method with no return type specified
    check_and_add_warning("-Wmissing-method-return-type")
    # catch implicit conversions between ObjC BOOL and int
    check_and_add_warning("-Wobjc-signed-char-bool")
    # catch semicolon before ObjC method body
    check_and_add_warning("-Wsemicolon-before-method-body")
    # catch ObjC method parameter type not matching super class method
    check_and_add_warning("-Wsuper-class-method-mismatch")
# catches string literals used in boolean expressions
check_and_add_warning("-Wstring-conversion", min_clang_version="4.0.0")
# we inline 'new' and 'delete' in mozalloc
check_and_add_warning("-Wno-inline-new-delete", cxx_compiler, min_clang_version="4.0.0")
# Prevent the following GCC warnings from being treated as errors:
# too many false positives
check_and_add_warning("-Wno-error=maybe-uninitialized", when=not_clang_based)
# we don't want our builds held hostage when a platform-specific API
# becomes deprecated.
check_and_add_warning("-Wno-error=deprecated-declarations", min_clang_version="4.0.0")
# false positives depending on optimization
check_and_add_warning("-Wno-error=array-bounds", min_clang_version="4.0.0")
# false positives depending on optimizations
check_and_add_warning("-Wno-error=free-nonheap-object", min_clang_version="12.0.0")
# Would be a pain to fix all occurrences, for very little gain
check_and_add_warning("-Wno-multistatement-macros", when=not_clang_based)
# Disable the -Werror for -Wclass-memaccess as we have a long
# tail of issues to fix
check_and_add_warning("-Wno-error=class-memaccess", when=not_clang_based)
# -Watomic-alignment is a new warning in clang 7 that seems way too broad.
check_and_add_warning("-Wno-error=atomic-alignment", min_clang_version="7.0.0")
# New warning with clang 15. Catches uses of deprecated builtins in abseil-cpp.
check_and_add_warning("-Wno-error=deprecated-builtins", min_clang_version="15.0.0")
# catches format/argument mismatches with printf
c_format_warning, cxx_format_warning = check_and_add_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_warning(
    "-Wformat-security",
    when=c_format_warning & cxx_format_warning,
    min_clang_version="4.0.0",
)
check_and_add_warning(
    "-Wformat-overflow=2", when=c_format_warning & cxx_format_warning & not_clang_based
)
# Other Windows specific things
with only_when(target_is_windows):
    # When compiling for Windows with gcc, we encounter lots of "#pragma warning"'s
    # which is an MSVC-only pragma that GCC does not recognize.
    # With clang-cl, as it claims to be MSVC it would be difficult to add
    # #if defined(_MSC_VER) && !defined(__clang__) everywhere we use such pragmas,
    # so just ignore them.
    check_and_add_warning("-Wno-unknown-pragmas")
    with only_when(depends(c_compiler)(lambda c: c.type == "clang-cl")):
        # We get errors about various #pragma intrinsic directives from
        # clang-cl, and we don't need to hear about those.
        check_and_add_warning("-Wno-ignored-pragmas")
        # clang-cl's Intrin.h marks things like _ReadWriteBarrier as
        # __attribute((__deprecated__)).  This is nice to know, but since we don't
        # get the equivalent warning from MSVC, let's just ignore it.
        check_and_add_warning("-Wno-deprecated-declarations")
        # This warns for reasonable things like:
        #   enum { X = 0xffffffffU };
        # which is annoying for IDL headers.
        check_and_add_warning("-Wno-microsoft-enum-value", cxx_compiler)
        # This warns for cases that would be reached by the Microsoft
        # #include rules, but also currently warns on cases that would
        # *also* be reached by standard C++ include rules.  That
        # behavior doesn't seem useful, so we turn it off.
        check_and_add_warning("-Wno-microsoft-include", cxx_compiler)
        # We use a function like:
        #   __declspec(noreturn) __inline void f() {}
        # which -Winvalid-noreturn complains about.  Again, MSVC seems
        # OK with it, so let's silence the warning.
        check_and_add_warning("-Wno-invalid-noreturn")
        # Missing |override| on virtual function declarations isn't
        # something that MSVC currently warns about.
        check_and_add_warning("-Wno-inconsistent-missing-override", cxx_compiler)
        # We use -DHAS_EXCEPTIONS=0, which removes the |throw()|
        # declaration on |operator delete(void*)|.  However, clang-cl
        # must internally declare |operator delete(void*)| differently,
        # which causes this warning for virtually every file in the
        # tree.  clang-cl doesn't support -fno-exceptions or equivalent,
        # so there doesn't seem to be any way to convince clang-cl to
        # declare |delete| differently.  Therefore, suppress this
        # warning.
        check_and_add_warning("-Wno-implicit-exception-spec-mismatch", cxx_compiler)
        # Macros like STDMETHOD() and IFACEMETHOD() can declare
        # __attribute__((nothrow)) on their respective method declarations,
        # while the definitions are left without the matching attribute.
        check_and_add_warning("-Wno-microsoft-exception-spec", cxx_compiler)
        # At least one MSVC header and several headers in-tree have
        # unused typedefs, so turn this on.
        check_and_add_warning("-Wno-unused-local-typedef", cxx_compiler)
        # jemalloc uses __declspec(allocator) as a profiler hint,
        # which clang-cl doesn't understand.
        check_and_add_warning("-Wno-ignored-attributes", cxx_compiler)
        # __attribute__((unused)) really means "might be unused" and
        # we use it to avoid warnings about things that are unused
        # in some compilation units, but used in many others.  This
        # warning insists on complaining about the latter case, which
        # is annoying, and rather noisy.
        check_and_add_warning("-Wno-used-but-marked-unused", cxx_compiler)
    with only_when(depends(c_compiler)(lambda c: c.type != "clang-cl")):
        # When compiling for Windows with gcc, gcc throws false positives and true
        # positives where the callsite is ifdef-ed out
        check_and_add_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_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_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_warning("-Wno-enum-compare")
# Make it an error to be missing function declarations for C code.
check_and_add_warning(
    "-Werror=implicit-function-declaration", c_compiler, min_clang_version="4.0.0"
)
# New in clang 11. We can't really do anything about this warning.
check_and_add_warning("-Wno-psabi", min_clang_version="11.0.0")
# Disable broken missing-braces warning on old clang versions
check_and_add_warning(
    "-Wno-missing-braces",
    when=depends(c_compiler)(lambda c: c.type == "clang" and c.version < "6.0"),
    min_clang_version="4.0.0",
)
# Turn on clang thread-safety analysis
# Older clangs don't support AutoUnlock, and have other issues
check_and_add_warning(
    "-Wthread-safety",
    when=depends(c_compiler)(
        lambda c: c.type in ("clang", "clang-cl") and c.version >= "8.0"
    ),
    min_clang_version="4.0.0",
)
# Warn if APIs are used without available() checks on macOS.
check_and_add_warning(
    "-Werror=unguarded-availability-new", when=target_is_osx, min_clang_version="5.0.0"
)
# clang 17 warns about builtins being redefined and... well, we do that in
# multiple places, some of which are third-party. Until the situation is
# fixed, disable the new warning.
check_and_add_warning("-Wno-error=builtin-macro-redefined", min_clang_version="4.0.0")
# clang 18 has a new warning about VLAs being an extension in C++, but we
# have a number of them.
check_and_add_warning(
    "-Wno-vla-cxx-extension", cxx_compiler, min_clang_version="18.0.0"
)
# Avoid requiring complicated logic for extra warning flags in moz.build files.
check_and_add_warning("-Wno-unknown-warning-option", min_clang_version="4.0.0")
# clang 21 warns about charN_t conversions, and we have a lot that need a careful
# audit rather than plainly adding static_casts.
check_and_add_warning("-Wno-character-conversion", min_clang_version="21.0.0")
# Please keep the following last in this file
set_config("WARNINGS_CFLAGS", warnings_flags.cflags)
set_config("WARNINGS_CXXFLAGS", warnings_flags.cxxflags)
set_config("WARNINGS_HOST_CFLAGS", warnings_flags.host_cflags)
set_config("WARNINGS_HOST_CXXFLAGS", warnings_flags.host_cxxflags)