[clang] [clang][analyzer] Add taintedness to argv (PR #178054)
Daniel Krupp via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 20 06:38:30 PST 2026
================
@@ -827,8 +829,60 @@ void GenericTaintChecker::initTaintRules(CheckerContext &C) const {
std::make_move_iterator(Rules.end()));
}
+// The incoming parameters of the main function get tainted
+// if the program called in an untrusted environment.
+void GenericTaintChecker::checkBeginFunction(CheckerContext &C) const {
+ if (!C.inTopFrame() || C.getAnalysisManager()
+ .getAnalyzerOptions()
+ .ShouldAssumeControlledEnvironment)
+ return;
+
+ const auto *FD = dyn_cast<FunctionDecl>(C.getLocationContext()->getDecl());
+ if (!FD || !FD->isMain() || FD->param_size() < 2)
+ return;
+
+ ProgramStateRef State = C.getState();
+ const MemRegion *ArgvReg =
+ State->getRegion(FD->parameters()[1], C.getLocationContext());
+ SVal ArgvSVal = State->getSVal(ArgvReg);
+ State = addTaint(State, ArgvSVal);
+ StringRef ArgvName = FD->parameters()[1]->getName();
+
+ const MemRegion *ArgcReg =
+ State->getRegion(FD->parameters()[0], C.getLocationContext());
+ SVal ArgcSVal = State->getSVal(ArgcReg);
+ State = addTaint(State, ArgcSVal);
+ StringRef ArgcName = FD->parameters()[0]->getName();
+ if (auto N = ArgcSVal.getAs<NonLoc>()) {
----------------
dkrupp wrote:
I think it may no be necessary as we check if the analyzed function is a "real" main function with the isMain() call
```
const auto *FD = dyn_cast<FunctionDecl>(C.getLocationContext()->getDecl());
if (!FD || !FD->isMain() || FD->param_size() < 2)
return;
```
If this passes, then the types should be ok.
https://github.com/llvm/llvm-project/pull/178054
More information about the cfe-commits
mailing list