================
@@ -778,42 +781,61 @@ void StreamChecker::evalFgetc(const FnDescription *Desc, 
const CallEvent &Call,
   assertStreamStateOpened(OldSS);
 
----------------
steakhal wrote:
At first glance you should be right. However, when I tried it, it didn't break 
any tests but this one.
I presume there must be something else going on that prevents escaping the 
stream pointer.
I've not checked.

Alternatively what I did was this:
```c++
[[nodiscard]] static ProgramStateRef
escapeArgsAfterIndex(ProgramStateRef State, CheckerContext &C,
                     const CallEvent &Call, unsigned FirstEscapingArgIndex) {
  const auto *CE = Call.getOriginExpr();
  assert(CE);

  if (Call.getNumArgs() <= FirstEscapingArgIndex)
    return State;

  SmallVector<SVal> EscapingArgs;
  EscapingArgs.reserve(Call.getNumArgs() - FirstEscapingArgIndex);
  for (auto EscArgIdx :
       llvm::seq<int>(FirstEscapingArgIndex, Call.getNumArgs()))
    EscapingArgs.push_back(Call.getArgSVal(EscArgIdx));
  State = State->invalidateRegions(EscapingArgs, CE, C.blockCount(),
                                   C.getLocationContext(),
                                   /*CausesPointerEscape=*/false);
  return State;
}

// at the callsite:
State = escapeArgsAfterIndex(State, C, Call, /*FirstEscapingArgIndex=*/2);
```

https://github.com/llvm/llvm-project/pull/73638
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to