---
target: obj-x86_64-pc-linux-gnu
# It is used by 'mach static-analysis' and 'phabricator static-analysis bot'
# in order to have consistency across the used checkers.
# All the clang checks used by the static-analysis tools.
#
# To add a new checker:
# 1. Add it in this file
# 2. Create a C/C++ test case in tools/clang-tidy/test/ reproducing the
#    warning/error that the checker will detect
# 3. Run './mach static-analysis autotest -d' to create the reference
# 4. Check the json file in tools/clang-tidy/test/
# 5. Commit this file + the .cpp test case + the json result
platforms:
  - linux64
  - macosx64
  - win32
  - win64
# Minimum clang-tidy version that is required for all the following checkers
# to work properly.
# This is also used by 'mach lint -l clang-format'
package_version: "21.1.8"

# Header file that are platform dependant and generate false positive, we don't
# want to analyze them.
header_skiplist:
  - js/src/jit/MacroAssembler.h

clang_checkers:
  - name: -*
    publish: !!bool no
  - name: modernize-use-equals-default
    reliability: high
  - name: modernize-use-equals-delete
    reliability: high
  - name: modernize-use-transparent-functors
    reliability: high
  - name: readability-redundant-string-cstr
    reliability: high
  - name: readability-redundant-string-init
    reliability: high
  - name: modernize-loop-convert
    reliability: high
    config:
      - key: MinConfidence
        value: safe
      - key: UseCxx20ReverseRanges
        value: false
  - name: modernize-type-traits
    reliability: high
  - name: modernize-use-bool-literals
    reliability: high
  - name: modernize-use-std-numbers
    reliability: high
    config:
      - key: DiffThreshold
        value: 0.0000001
  - name: bugprone-forwarding-reference-overload
    reliability: high
  - name: bugprone-move-forwarding-reference
    reliability: high
  - name: bugprone-redundant-branch-condition
    reliability: high
  - name: misc-definitions-in-headers
    reliability: high
  - name: performance-for-range-copy
    reliability: high
    config:
      - key: AllowedTypes
        value: (mozilla::)?RefPtr
  - name: performance-inefficient-string-concatenation
    reliability: high
  - name: performance-inefficient-vector-operation
    reliability: high
  - name: performance-trivially-destructible
    reliability: high
  - name: modernize-use-nullptr
    reliability: high

# clang_checkers:
#   - name: -*
#     publish: !!bool no
#   - name: bugprone-argument-comment
#     reliability: high
#   - name: bugprone-assert-side-effect
#     reliability: high
#   - name: bugprone-bool-pointer-implicit-conversion
#     reliability: low
#   - name: bugprone-forward-declaration-namespace
#     reliability: high
#   - name: bugprone-incorrect-roundings
#     reliability: high
#   - name: bugprone-integer-division
#     reliability: high
#   - name: bugprone-macro-parentheses
#     reliability: medium
#   - name: bugprone-macro-repeated-side-effects
#     reliability: high
#   - name: bugprone-misplaced-widening-cast
#     reliability: high
#   - name: bugprone-move-forwarding-reference
#     reliability: high
#   - name: bugprone-multiple-statement-macro
#     # Incompatible with our code base, see bug 1496379.
#     publish: !!bool no
#     reliability: high
#   - name: bugprone-sizeof-expression
#     reliability: high
#   - name: bugprone-string-constructor
#     reliability: high
#   - name: bugprone-string-integer-assignment
#     reliability: high
#   - name: bugprone-suspicious-memset-usage
#     reliability: high
#   - name: bugprone-suspicious-missing-comma
#     reliability: high
#   - name: bugprone-suspicious-semicolon
#     reliability: high
#   - name: bugprone-suspicious-string-compare
#     reliability: high
#   - name: bugprone-swapped-arguments
#     reliability: high
#   - name: bugprone-switch-missing-default-case
#     reliability: high
#   - name: bugprone-too-small-loop-variable
#     reliability: high
#   - name: bugprone-unused-raii
#     reliability: high
#   - name: bugprone-use-after-move
#     reliability: high
#   - name: clang-analyzer-core.CallAndMessage
#     reliability: medium
#   - name: clang-analyzer-core.DivideZero
#     reliability: high
#   - name: clang-analyzer-core.NonNullParamChecker
#     reliability: high
#   - name: clang-analyzer-core.NullDereference
#     reliability: medium
#   - name: clang-analyzer-core.UndefinedBinaryOperatorResult
#     reliability: medium
#   - name: clang-analyzer-core.uninitialized.Assign
#     reliability: medium
#   - name: clang-analyzer-core.uninitialized.Branch
#     reliability: medium
#   - name: clang-analyzer-cplusplus.Move
#     reliability: high
#   - name: clang-analyzer-cplusplus.NewDelete
#     reliability: medium
#   - name: clang-analyzer-cplusplus.NewDeleteLeaks
#     reliability: medium
#   - name: clang-analyzer-deadcode.DeadStores
#     reliability: high
#   - name: clang-analyzer-optin.performance.Padding
#     reliability: high
#     config:
#       - key: AllowedPad
#         value: 2
#   - name: clang-analyzer-security.FloatLoopCounter
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.bcmp
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.bcopy
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.bzero
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.getpw
#     reliability: high
#   # Don't add clang-analyzer-security.insecureAPI.gets here; it's deprecated.
#   - name: clang-analyzer-security.insecureAPI.mkstemp
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.mktemp
#     reliability: high
#   - name: clang-analyzer-security.insecureAPI.rand
#     reliability: low
#     # C checker, outdated and doesn't check for the new std::rand calls.
#     publish: !!bool no
#   - name: clang-analyzer-security.insecureAPI.strcpy
#     reliability: low
#     # The functions that should be used differ on POSIX and Windows, and there
#     # isn't a consensus on how we should approach this.
#     publish: !!bool no
#   - name: clang-analyzer-security.insecureAPI.UncheckedReturn
#     reliability: low
#   - name: clang-analyzer-security.insecureAPI.vfork
#     reliability: medium
#   - name: clang-analyzer-unix.Malloc
#     reliability: high
#   - name: clang-analyzer-unix.cstring.BadSizeArg
#     reliability: high
#   - name: clang-analyzer-unix.cstring.NullArg
#     reliability: high
#   - name: cppcoreguidelines-narrowing-conversions
#     reliability: high
#   - name: cppcoreguidelines-pro-type-member-init
#     reliability: medium
#   - name: misc-include-cleaner
#     # Disable this checker until we move to before/after
#     reliability: high
#     publish: !!bool no
#   - name: misc-non-copyable-objects
#     reliability: high
#   - name: misc-redundant-expression
#     reliability: medium
#   - name: misc-unused-alias-decls
#     reliability: high
#   - name: misc-unused-using-decls
#     reliability: high
#   - name: modernize-avoid-bind
#     restricted-platforms:
#       - win32
#       - win64
#     reliability: medium
#   - name: modernize-concat-nested-namespaces
#     reliability: high
#   - name: modernize-deprecated-ios-base-aliases
#     reliability: high
#   - name: modernize-loop-convert
#     reliability: high
#   - name: modernize-raw-string-literal
#     reliability: high
#   - name: modernize-redundant-void-arg
#     reliability: high
#     # We still have some old C code that is built with a C compiler, so this
#     # might break the build.
#     publish: !!bool no
#   - name: modernize-shrink-to-fit
#     reliability: high
#   - name: modernize-use-auto
#     reliability: high
#     # Controversial, see bug 1371052.
#     publish: !!bool no
#   - name: modernize-use-bool-literals
#     reliability: high
#   - name: modernize-use-equals-default
#     reliability: high
#   - name: modernize-use-equals-delete
#     reliability: high
#   - name: modernize-use-nullptr
#     reliability: high
#   - name: modernize-use-override
#     reliability: low
#     # Too noisy because of how we implement NS_IMETHOD. See Bug 1420366.
#     publish: !!bool no
#   - name: modernize-use-using
#     reliability: high
#   - name: mozilla-*
#     reliability: high
#   - name: performance-avoid-endl
#     reliability: high
#     # enable from clang 18
#     #  - name: performance-enum-size
#     #    reliability: high
#   - name: performance-faster-string-find
#     reliability: high
#   - name: performance-for-range-copy
#     reliability: high
#   - name: performance-implicit-conversion-in-loop
#     reliability: high
#   - name: performance-inefficient-algorithm
#     restricted-platforms:
#       - linux64
#       - macosx64
#     reliability: high
#   - name: performance-inefficient-string-concatenation
#     reliability: high
#   - name: performance-inefficient-vector-operation
#     reliability: high
#   - name: performance-move-const-arg
#     reliability: high
#     config:
#       - key: CheckTriviallyCopyableMove
#         # As per Bug 1558359 - disable detection of trivially copyable types
#         # that do not have a move constructor.
#         value: 0
#   - name: performance-move-constructor-init
#     reliability: high
#   - name: performance-noexcept-move-constructor
#     reliability: high
#   - name: performance-type-promotion-in-math-fn
#     reliability: high
#   - name: performance-unnecessary-copy-initialization
#     reliability: high
#   - name: performance-unnecessary-value-param
#     reliability: high
#     config:
#       - key: AllowedTypes
#         # Allow EnumSet because it only has a non-trivial copy constructor
#         # in debug builds.
#         # Allow Range because it only has more than two pointer-sized members
#         # in debug (or fuzzing) builds.
#         value: ::mozilla::(EnumSet|Range)
#   - name: readability-braces-around-statements
#     reliability: high
#     config:
#       - key: ShortStatementLines
#         # Allow `if (foo) return;` without braces
#         # Still warns on `if (foo)\n return;`
#         value: 1
#   - name: readability-const-return-type
#     reliability: high
#   # Note: this can be loosened up by using the ShortStatementLines option
#   - name: readability-container-size-empty
#     reliability: high
#   - name: readability-delete-null-pointer
#     reliability: high
#   - name: readability-else-after-return
#     reliability: high
#     config:
#       - key: WarnOnConditionVariables
#         # Disable as we don't mind this kind of behavior
#         value: 0
#   - name: readability-implicit-bool-conversion
#     reliability: low
#     # On automation the config flags act strange. Please see Bug 1500241.
#     publish: !!bool no
#     config:
#       - key: AllowIntegerConditions
#         # The check will allow conditional integer conversions.
#         value: 1
#       - key: AllowPointerConditions
#         # The check will allow conditional pointer conversions.
#         value: 1
#   - name: readability-inconsistent-declaration-parameter-name
#     reliability: high
#   - name: readability-isolate-declaration
#     # As per bug 1558987 - we don't want to have this enabled
#     publish: !!bool no
#     reliability: high
#   - name: readability-magic-numbers
#     # Bug 1553495 - we must see first its impact on our code.
#     publish: !!bool no
#     reliability: high
#   - name: readability-misleading-indentation
#     reliability: high
#   - name: readability-non-const-parameter
#     reliability: high
#   - name: readability-qualified-auto
#     reliability: high
#   - name: readability-redundant-control-flow
#     reliability: high
#   - name: readability-redundant-member-init
#     reliability: high
#   - name: readability-redundant-preprocessor
#     reliability: high
#   - name: readability-redundant-smartptr-get
#     reliability: high
#   - name: readability-redundant-string-cstr
#     reliability: high
#   - name: readability-redundant-string-init
#     reliability: high
#   - name: readability-static-accessed-through-instance
#     reliability: high
#   - name: readability-simplify-boolean-expr
#     reliability: high
#     config:
#       - key: SimplifyDeMorgan
#         # Don't want to enable DeMorgan expressions because of MOZ_ASSERT()
#         # See Bug 1804160
#         value: 0
#   - name: readability-uniqueptr-delete-release
#     reliability: high
#   # Don't publish the google checkers since we are interested in only having
#   # a general idea how code complies with the rules added by these checkers.
#   - name: google-build-explicit-make-pair
#     reliability: low
#     publish: !!bool no
#   - name: google-build-namespaces
#     reliability: low
#     publish: !!bool no
#   - name: google-build-using-namespace
#     reliability: low
#     publish: !!bool no
#   - name: google-default-arguments
#     reliability: low
#     publish: !!bool no
#   - name: google-explicit-constructor
#     reliability: low
#     publish: !!bool no
#   - name: google-global-names-in-headers
#     reliability: low
#     publish: !!bool no
#   - name: google-readability-casting
#     reliability: low
#     publish: !!bool no
#   - name: google-readability-function-size
#     reliability: low
#     publish: !!bool no
#   - name: google-readability-namespace-comments
#     reliability: low
#     publish: !!bool no
#   - name: google-readability-todo
#     reliability: low
#     publish: !!bool no
#   - name: google-runtime-int
#     reliability: low
#     publish: !!bool no
#   - name: google-runtime-operator
#     reliability: low
#     publish: !!bool no
#   - name: google-runtime-references
#     reliability: low
#     publish: !!bool no
