123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // Copyright (c) 2016 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- // This check ensures that 32/64-bit unstable types are not used in IPC.
- //
- // A type (or typedef) is unstable if it changes size between 32/ 64-bit
- // platforms. However, it's impossible to accurately identify unstable
- // typedefs, because their definitions rely on the preprocessor. For
- // example uintptr_t is either unsigned int or unsigned long.
- //
- // So we're not trying to be accurate, and just blacklisting some types
- // that are known to be unstable:
- // 1. Types: long / unsigned long (but not typedefs to)
- // 2. Typedefs: intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t,
- // size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t,
- // time_t, suseconds_t (including typedefs to)
- //
- // Additionally, templates referencing blacklisted types (e.g. vector<long>)
- // are also blacklisted.
- //
- // Blacklisted types are checked in:
- // 1. IPC::WriteParam() calls
- // 2. IPC::CheckedTuple<> specializations
- //
- #ifndef TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_
- #define TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_
- #include <vector>
- #include "clang/AST/AST.h"
- #include "clang/AST/ASTConsumer.h"
- #include "clang/AST/RecursiveASTVisitor.h"
- #include "clang/Frontend/CompilerInstance.h"
- #include "llvm/ADT/StringSet.h"
- namespace chrome_checker {
- class CheckIPCVisitor {
- public:
- explicit CheckIPCVisitor(clang::CompilerInstance& compiler);
- void set_context(clang::ASTContext* context) { context_ = context; }
- void BeginDecl(clang::Decl* decl);
- void EndDecl();
- void VisitTemplateSpecializationType(
- clang::TemplateSpecializationType* spec);
- void VisitCallExpr(clang::CallExpr* call_expr);
- private:
- // ValidateXXX functions return false if validation failed and diagnostic
- // was reported. They return true otherwise (not applicable / validation
- // succeeded).
- bool ValidateWriteParam(const clang::CallExpr* call_expr);
- bool ValidateWriteParamSignature(const clang::CallExpr* call_expr);
- bool ValidateWriteParamArgument(const clang::Expr* arg_expr);
- bool ValidateCheckedTuple(
- const clang::TemplateSpecializationType* spec);
- template <typename T>
- const T* GetParentDecl() const;
- bool IsBlacklistedType(clang::QualType type) const;
- bool IsBlacklistedTypedef(const clang::TypedefNameDecl* tdef) const;
- struct CheckDetails {
- clang::QualType entry_type;
- clang::QualType exit_type;
- llvm::SmallVector<const clang::TypedefType*, 5> typedefs;
- };
- bool CheckType(clang::QualType type, CheckDetails* details) const;
- bool CheckIntegerType(clang::QualType type, CheckDetails* details) const;
- bool CheckTemplateArgument(const clang::TemplateArgument& arg,
- CheckDetails* details) const;
- void ReportCheckError(const CheckDetails& details,
- clang::SourceLocation loc,
- unsigned error);
- clang::CompilerInstance& compiler_;
- clang::ASTContext* context_;
- unsigned error_write_param_bad_type_;
- unsigned error_tuple_bad_type_;
- unsigned error_write_param_bad_signature_;
- unsigned note_see_here_;
- std::vector<const clang::Decl*> decl_stack_;
- llvm::StringSet<> blacklisted_typedefs_;
- };
- } // namespace chrome_checker
- #endif // TOOLS_CLANG_PLUGINS_CHECKIPC_VISITOR_H_
|