=?utf-8?q?Donát?= Nagy <donat.n...@ericsson.com>, =?utf-8?q?Donát?= Nagy <donat.n...@ericsson.com>, =?utf-8?q?Donát?= Nagy <donat.n...@ericsson.com>, =?utf-8?q?Donát?= Nagy <donat.n...@ericsson.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/91...@github.com>
================ @@ -136,53 +100,49 @@ void ErrnoModeling::checkBeginFunction(CheckerContext &C) const { ASTContext &ACtx = C.getASTContext(); ProgramStateRef State = C.getState(); - if (const auto *ErrnoVar = dyn_cast_or_null<VarDecl>(ErrnoDecl)) { - // There is an external 'errno' variable. - // Use its memory region. - // The memory region for an 'errno'-like variable is allocated in system - // space by MemRegionManager. - const MemRegion *ErrnoR = - State->getRegion(ErrnoVar, C.getLocationContext()); + const MemRegion *ErrnoR; + + if (ErrnoDecl) { + // There is an external 'errno' variable, so we can simply use the memory + // region that's associated with it. + ErrnoR = State->getRegion(ErrnoDecl, C.getLocationContext()); assert(ErrnoR && "Memory region should exist for the 'errno' variable."); - State = State->set<ErrnoRegion>(ErrnoR); - State = - errno_modeling::setErrnoValue(State, C, 0, errno_modeling::Irrelevant); - C.addTransition(State); - } else if (ErrnoDecl) { - assert(isa<FunctionDecl>(ErrnoDecl) && "Invalid errno location function."); - // There is a function that returns the location of 'errno'. - // We must create a memory region for it in system space. - // Currently a symbolic region is used with an artifical symbol. - // FIXME: It is better to have a custom (new) kind of MemRegion for such - // cases. + } else { + // There is no 'errno' variable, so create a new symbolic memory region + // that can be used to model the return value of the "get the location of + // errno" internal functions. + // NOTE: this `SVal` is created even if errno is not defined or used. SValBuilder &SVB = C.getSValBuilder(); MemRegionManager &RMgr = C.getStateManager().getRegionManager(); const MemSpaceRegion *GlobalSystemSpace = RMgr.getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); // Create an artifical symbol for the region. - // It is not possible to associate a statement or expression in this case. + // Note that it is not possible to associate a statement or expression in + // this case and the `symbolTag` (opaque pointer tag) is just the address + // of the data member `ErrnoDecl` of the singleton `ErrnoModeling` checker + // object. const SymbolConjured *Sym = SVB.conjureSymbol( nullptr, C.getLocationContext(), ACtx.getLValueReferenceType(ACtx.IntTy), C.blockCount(), &ErrnoDecl); // The symbolic region is untyped, create a typed sub-region in it. // The ElementRegion is used to make the errno region a typed region. - const MemRegion *ErrnoR = RMgr.getElementRegion( + ErrnoR = RMgr.getElementRegion( ACtx.IntTy, SVB.makeZeroArrayIndex(), RMgr.getSymbolicRegion(Sym, GlobalSystemSpace), C.getASTContext()); - State = State->set<ErrnoRegion>(ErrnoR); - State = - errno_modeling::setErrnoValue(State, C, 0, errno_modeling::Irrelevant); - C.addTransition(State); } + State = State->set<ErrnoRegion>(ErrnoR); ---------------- steakhal wrote: ```suggestion assert(ErrnoR); State = State->set<ErrnoRegion>(ErrnoR); ``` https://github.com/llvm/llvm-project/pull/91531 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits