1 //===--- ContainerDataPointerCheck.h - clang-tidy ---------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_CONTAINERDATAPOINTERCHECK_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_CONTAINERDATAPOINTERCHECK_H
12 #include "../ClangTidyCheck.h"
14 namespace clang::tidy::readability
{
15 /// Checks whether a call to `operator[]` and `&` can be replaced with a call to
18 /// This only replaces the case where the offset being accessed through the
19 /// subscript operation is a known constant 0. This avoids a potential invalid
20 /// memory access when the container is empty. Cases where the constant is not
21 /// explicitly zero can be addressed through the clang static analyzer, and
22 /// those which cannot be statically identified can be caught using UBSan.
23 class ContainerDataPointerCheck
: public ClangTidyCheck
{
25 ContainerDataPointerCheck(StringRef Name
, ClangTidyContext
*Context
);
27 bool isLanguageVersionSupported(const LangOptions
&LO
) const override
{
28 return LO
.CPlusPlus11
;
31 void storeOptions(ClangTidyOptions::OptionMap
&Opts
) override
;
32 void registerMatchers(ast_matchers::MatchFinder
*Finder
) override
;
34 void check(const ast_matchers::MatchFinder::MatchResult
&Result
) override
;
36 std::optional
<TraversalKind
> getCheckTraversalKind() const override
{
37 return TK_IgnoreUnlessSpelledInSource
;
41 const std::vector
<StringRef
> IgnoredContainers
;
43 } // namespace clang::tidy::readability
45 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_CONTAINERDATAPOINTERCHECK_H