//===- NumberObjectConversionChecker.cpp -------------------------*- C++ -*-==// // // 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 // //===----------------------------------------------------------------------===// // // This file defines NumberObjectConversionChecker, which checks for a // particular common mistake when dealing with numbers represented as objects // passed around by pointers. Namely, the language allows to reinterpret the // pointer as a number directly, often without throwing any warnings, // but in most cases the result of such conversion is clearly unexpected, // as pointer value, rather than number value represented by the pointee object, // becomes the result of such operation. // // Currently the checker supports the Objective-C NSNumber class, // and the OSBoolean class found in macOS low-level code; the latter // can only hold boolean values. // // This checker has an option "Pedantic" (boolean), which enables detection of // more conversion patterns (which are most likely more harmless, and therefore // are more likely to produce false positives) - disabled by default, // enabled with `-analyzer-config osx.NumberObjectConversion:Pedantic=true'. // //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" #include "clang/Lex/Lexer.h" #include "llvm/ADT/APSInt.h" usingnamespaceclang; usingnamespaceento; usingnamespaceast_matchers; namespace { class NumberObjectConversionChecker : public Checker<check::ASTCodeBody> { … }; class Callback : public MatchFinder::MatchCallback { … }; } // end of anonymous namespace void Callback::run(const MatchFinder::MatchResult &Result) { … } void NumberObjectConversionChecker::checkASTCodeBody(const Decl *D, AnalysisManager &AM, BugReporter &BR) const { … } void ento::registerNumberObjectConversionChecker(CheckerManager &Mgr) { … } bool ento::shouldRegisterNumberObjectConversionChecker(const CheckerManager &mgr) { … }