brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · e414353 Raw
109 lines · c
1//=== ErrnoModeling.h - Tracking value of 'errno'. -----------------*- C++ -*-//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// Defines inter-checker API for using the system value 'errno'.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_ERRNOMODELING_H14#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_ERRNOMODELING_H15 16#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"17#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"18#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"19#include <optional>20 21namespace clang {22namespace ento {23namespace errno_modeling {24 25/// Describe how reads and writes of \c errno are handled by the checker.26enum ErrnoCheckState : unsigned {27  /// We do not know anything about 'errno'.28  /// Read and write is always allowed.29  Irrelevant = 0,30 31  /// Value of 'errno' should be checked to find out if a previous function call32  /// has failed.33  /// When this state is set \c errno must be read by the program before a next34  /// standard function call or other overwrite of \c errno follows, otherwise35  /// a bug report is emitted.36  MustBeChecked = 1,37 38  /// Value of 'errno' is not allowed to be read, it can contain an unspecified39  /// value.40  /// When this state is set \c errno is not allowed to be read by the program41  /// until it is overwritten or invalidated.42  MustNotBeChecked = 243};44 45/// Returns the value of 'errno', if 'errno' was found in the AST.46std::optional<SVal> getErrnoValue(ProgramStateRef State);47 48/// Returns the errno check state, \c Errno_Irrelevant if 'errno' was not found49/// (this is not the only case for that value).50ErrnoCheckState getErrnoState(ProgramStateRef State);51 52/// Returns the location that points to the \c MemoryRegion where the 'errno'53/// value is stored. Returns \c std::nullopt if 'errno' was not found. Otherwise54/// it always returns a valid memory region in the system global memory space.55std::optional<Loc> getErrnoLoc(ProgramStateRef State);56 57/// Set value of 'errno' to any SVal, if possible.58/// The errno check state is set always when the 'errno' value is set.59ProgramStateRef setErrnoValue(ProgramStateRef State,60                              const LocationContext *LCtx, SVal Value,61                              ErrnoCheckState EState);62 63/// Set value of 'errno' to a concrete (signed) integer, if possible.64/// The errno check state is set always when the 'errno' value is set.65ProgramStateRef setErrnoValue(ProgramStateRef State, CheckerContext &C,66                              uint64_t Value, ErrnoCheckState EState);67 68/// Set the errno check state, do not modify the errno value.69ProgramStateRef setErrnoState(ProgramStateRef State, ErrnoCheckState EState);70 71/// Clear state of errno (make it irrelevant).72ProgramStateRef clearErrnoState(ProgramStateRef State);73 74/// Determine if `Call` is a call to an internal function that returns the75/// location of `errno` (in environments where errno is accessed this way).76bool isErrnoLocationCall(const CallEvent &Call);77 78/// Create a NoteTag that displays the message if the 'errno' memory region is79/// marked as interesting, and resets the interestingness.80const NoteTag *getErrnoNoteTag(CheckerContext &C, const std::string &Message);81 82/// Set errno state for the common case when a standard function is successful.83/// Set \c ErrnoCheckState to \c MustNotBeChecked (the \c errno value is not84/// affected).85ProgramStateRef setErrnoForStdSuccess(ProgramStateRef State, CheckerContext &C);86 87/// Set errno state for the common case when a standard function fails.88/// Set \c errno value to be not equal to zero and \c ErrnoCheckState to89/// \c Irrelevant . The irrelevant errno state ensures that no related bug90/// report is emitted later and no note tag is needed.91/// \arg \c ErrnoSym Value to be used for \c errno and constrained to be92/// non-zero.93ProgramStateRef setErrnoForStdFailure(ProgramStateRef State, CheckerContext &C,94                                      NonLoc ErrnoSym);95 96/// Set errno state for the common case when a standard function indicates97/// failure only by \c errno. Sets \c ErrnoCheckState to \c MustBeChecked, and98/// invalidates the errno region (clear of previous value).99/// \arg \c Elem CFG Element that causes invalidation of \c errno.100ProgramStateRef setErrnoStdMustBeChecked(ProgramStateRef State,101                                         CheckerContext &C,102                                         ConstCFGElementRef Elem);103 104} // namespace errno_modeling105} // namespace ento106} // namespace clang107 108#endif // LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_ERRNOMODELING_H109