[PATCH] D125400: [clang][Analyzer] Add errno state to standard functions modeling.
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 24 07:11:46 PDT 2022
steakhal added inline comments.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:412
+ class ZeroRelatedErrnoConstraint : public ErrnoConstraintKind {
+ clang::BinaryOperatorKind Relation;
+
----------------
The explicit qualification is not necessary. There are other cases like this.
In the constraint manager, we tend to use `Op` for //operator kinds//, it would be nice to use the same taxonomy here.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:417
+ errno_modeling::ErrnoCheckState CS)
+ : ErrnoConstraintKind(CS), Relation(Rel) {}
+
----------------
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:406
+ /// It may return empty string if no note tag is to be added.
+ virtual std::string describe(StringRef FunctionName) const = 0;
+
----------------
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:443-446
+ Optional<DefinedOrUnknownSVal> Cond =
+ SVB.evalBinOpNN(State, Relation, ErrnoSVal, ZeroVal,
+ SVB.getConditionType())
+ .getAs<DefinedOrUnknownSVal>();
----------------
Just use `.castAs<NonLoc>()`. You will assert it anyway, and I find this much more readable.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:454-460
+ std::string Result = "Assuming that function '";
+ Result.append(FunctionName.str());
+ Result.append("' fails, in this case the value 'errno' becomes ");
+ Result.append(BinaryOperator::getOpcodeStr(Relation).str());
+ Result.append(" 0 and ");
+ Result.append(describeErrnoCheckState(CheckState));
+ return Result;
----------------
I believe you should use `Twine` for this.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:1028
+ std::string Note = Case.getErrnoConstraint().describe(
+ D ? D->getNameAsString() : "<unknown>");
+ if (Note.empty())
----------------
What is `<unknown>` in this context? Please add a test for it or remove this branch.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:1037-1042
+ [Node, Note]() -> std::string {
+ // Don't emit "Assuming..." note when we ended up
+ // knowing in advance which branch is taken.
+ if (Node->succ_size() == 1)
+ return "";
+ return Note.str();
----------------
Why did you change these?
================
Comment at: clang/test/Analysis/errno-stdlibraryfunctions.c:20-24
+void test2() {
+ if (access("path", 0) == -1) {
+ if (errno != 0) { }
+ }
+}
----------------
================
Comment at: clang/test/Analysis/errno-stdlibraryfunctions.c:28
+ if (access("path", 0) != -1) {
+ // expected-note at -1{{Assuming that function 'access' is successful, in this case the value 'errno' may be undefined after the call and should not be used}}
+ if (errno != 0) { }
----------------
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D125400/new/
https://reviews.llvm.org/D125400
More information about the cfe-commits
mailing list