[PATCH] D122150: [clang][analyzer] Add checker for bad use of 'errno'.
Balázs Kéri via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 20 00:41:11 PDT 2022
balazske marked an inline comment as done.
balazske added inline comments.
================
Comment at: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td:553-554
+ CheckerOptions<[
+ CmdLineOption<Boolean,
+ "AllowErrnoReadOutsideConditionExpressions",
+ "Allow read of undefined value from errno outside of conditions",
----------------
steakhal wrote:
> Well, now I see why you marked this `Hide` previously.
> This is a //modeling// checker, thus it won't appear in the documentation nor in the `-analyzer-checker-help` etc.
>
> Interestingly, other checkers mark some options `Hide` and other times `DontHide`.
> E.g. `DynamicMemoryModeling.Optimistic` is //displayed//, but the `DynamicMemoryModeling.AddNoOwnershipChangeNotes` is //hidden//.
> Whatever.
It looks good now, `ErrnoChecker` is not a modeling checker and the option should be accessible for users.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/ErrnoChecker.cpp:47
+ /// Indicates if a read (load) of \c errno is allowed in a non-condition part
+ /// of \c if, \c switch, loop and conditional statements when the errno
+ /// value may be undefined.
----------------
steakhal wrote:
> You prefixed the previous two keywords with the `\c` marker. Why is it missing from the `switch`?
Is it really missing? (I do not check Doxygen documentation, probably the new documentation appears in the online pages after the commit.)
================
Comment at: clang/lib/StaticAnalyzer/Checkers/ErrnoChecker.cpp:100
+ case Expr::BinaryConditionalOperatorClass:
+ CondFound = (S == cast<BinaryConditionalOperator>(ParentS)->getCommon());
+ break;
----------------
steakhal wrote:
> Oh, so the test added for this actually uncovered a bug?
Yes: Even if it looks natural that `getCond` can be used the same way as at normal `ConditionalOperator` this is not true: It returns something other (casted or converted) than the root condition expressions.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/ErrnoChecker.cpp:145
+
+ if (IsLoad) {
+ switch (EState) {
----------------
steakhal wrote:
> Might be more readable to early return instead.
There is a `else` part.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/ErrnoChecker.cpp:205
+ if (CallF->isExternC() && CallF->isGlobal() &&
+ C.getSourceManager().isInSystemHeader(CallF->getLocation()) &&
+ !isErrno(CallF)) {
----------------
steakhal wrote:
> Does this refer to the callsite or to the Decl location?
> I think the former, which would be a bug I think.
`CallF` is a `FunctionDecl` that should be the original (first) declaration of the function.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D122150/new/
https://reviews.llvm.org/D122150
More information about the cfe-commits
mailing list