diff options
author | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 13:58:24 +0300 |
---|---|---|
committer | thegeorg <thegeorg@yandex-team.com> | 2024-03-13 14:11:53 +0300 |
commit | 11a895b7e15d1c5a1f52706396b82e3f9db953cb (patch) | |
tree | fabc6d883b0f946151f61ae7865cee9f529a1fdd /contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp | |
parent | 9685917341315774aad5733b1793b1e533a88bbb (diff) | |
download | ydb-11a895b7e15d1c5a1f52706396b82e3f9db953cb.tar.gz |
Export clang-format16 via ydblib project
6e6be3a95868fde888d801b7590af4044049563f
Diffstat (limited to 'contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp')
-rw-r--r-- | contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp b/contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp new file mode 100644 index 0000000000..c2631ce9b4 --- /dev/null +++ b/contrib/libs/clang16/tools/extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp @@ -0,0 +1,66 @@ +//===--- UndefinedMemoryManipulationCheck.cpp - clang-tidy-----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "UndefinedMemoryManipulationCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang::tidy::bugprone { + +namespace { +AST_MATCHER(CXXRecordDecl, isNotTriviallyCopyable) { + // For incomplete types, assume they are TriviallyCopyable. + return Node.hasDefinition() ? !Node.isTriviallyCopyable() : false; +} +} // namespace + +void UndefinedMemoryManipulationCheck::registerMatchers(MatchFinder *Finder) { + const auto NotTriviallyCopyableObject = + hasType(ast_matchers::hasCanonicalType( + pointsTo(cxxRecordDecl(isNotTriviallyCopyable())))); + + // Check whether destination object is not TriviallyCopyable. + // Applicable to all three memory manipulation functions. + Finder->addMatcher(callExpr(callee(functionDecl(hasAnyName( + "::memset", "::memcpy", "::memmove"))), + hasArgument(0, NotTriviallyCopyableObject)) + .bind("dest"), + this); + + // Check whether source object is not TriviallyCopyable. + // Only applicable to memcpy() and memmove(). + Finder->addMatcher( + callExpr(callee(functionDecl(hasAnyName("::memcpy", "::memmove"))), + hasArgument(1, NotTriviallyCopyableObject)) + .bind("src"), + this); +} + +void UndefinedMemoryManipulationCheck::check( + const MatchFinder::MatchResult &Result) { + if (const auto *Call = Result.Nodes.getNodeAs<CallExpr>("dest")) { + QualType DestType = Call->getArg(0)->IgnoreImplicit()->getType(); + if (!DestType->getPointeeType().isNull()) + DestType = DestType->getPointeeType(); + diag(Call->getBeginLoc(), "undefined behavior, destination object type %0 " + "is not TriviallyCopyable") + << DestType; + } + if (const auto *Call = Result.Nodes.getNodeAs<CallExpr>("src")) { + QualType SourceType = Call->getArg(1)->IgnoreImplicit()->getType(); + if (!SourceType->getPointeeType().isNull()) + SourceType = SourceType->getPointeeType(); + diag(Call->getBeginLoc(), + "undefined behavior, source object type %0 is not TriviallyCopyable") + << SourceType; + } +} + +} // namespace clang::tidy::bugprone |