//===----- UninitializedPointee.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 functions and methods for handling pointers and references // to reduce the size and complexity of UninitializedObjectChecker.cpp. // // To read about command line options and documentation about how the checker // works, refer to UninitializedObjectChecker.h. // //===----------------------------------------------------------------------===// #include "UninitializedObject.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" #include "clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h" #include <optional> usingnamespaceclang; usingnamespaceclang::ento; namespace { /// Represents a pointer or a reference field. class LocField final : public FieldNode { … }; /// Represents a nonloc::LocAsInteger or void* field, that point to objects, but /// needs to be casted back to its dynamic type for a correct note message. class NeedsCastLocField final : public FieldNode { … }; /// Represents a Loc field that points to itself. class CyclicLocField final : public FieldNode { … }; } // end of anonymous namespace // Utility function declarations. struct DereferenceInfo { … }; /// Dereferences \p FR and returns with the pointee's region, and whether it /// needs to be casted back to it's location type. If for whatever reason /// dereferencing fails, returns std::nullopt. static std::optional<DereferenceInfo> dereference(ProgramStateRef State, const FieldRegion *FR); /// Returns whether \p T can be (transitively) dereferenced to a void pointer /// type (void*, void**, ...). static bool isVoidPointer(QualType T); //===----------------------------------------------------------------------===// // Methods for FindUninitializedFields. //===----------------------------------------------------------------------===// bool FindUninitializedFields::isDereferencableUninit( const FieldRegion *FR, FieldChainInfo LocalChain) { … } //===----------------------------------------------------------------------===// // Utility functions. //===----------------------------------------------------------------------===// static std::optional<DereferenceInfo> dereference(ProgramStateRef State, const FieldRegion *FR) { … } static bool isVoidPointer(QualType T) { … }