isuckatcs added inline comments.
================
Comment at: clang-tools-extra/clang-tidy/bugprone/ExceptionEscapeCheck.cpp:88
+
+ for (auto [ThrowType, ThrowLoc] : AnalyzeResult.getExceptionTypes())
+ diag(ThrowLoc, "may throw %0 here", DiagnosticIDs::Note)
----------------
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:14
void ExceptionAnalyzer::ExceptionInfo::registerException(
- const Type *ExceptionType) {
+ const Type *ExceptionType, const SourceLocation Loc) {
assert(ExceptionType != nullptr && "Only valid types are accepted");
----------------
Is there any particular reason for taking `SourceLocation` by value? A `const
SourceLocation &` would avoid an unnecessary copy.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:21
void ExceptionAnalyzer::ExceptionInfo::registerExceptions(
- const Throwables &Exceptions) {
- if (Exceptions.size() == 0)
+ const Throwables &Exceptions, const SourceLocation Loc) {
+ if (Exceptions.empty())
----------------
Same question here regarding the argument type.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:25
Behaviour = State::Throwing;
- ThrownExceptions.insert(Exceptions.begin(), Exceptions.end());
+ for (const auto [ThrowType, ThrowLoc] : Exceptions)
+ ThrownExceptions.emplace(ThrowType, ThrowLoc.isInvalid() ? Loc : ThrowLoc);
----------------
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:26
+ for (const auto [ThrowType, ThrowLoc] : Exceptions)
+ ThrownExceptions.emplace(ThrowType, ThrowLoc.isInvalid() ? Loc : ThrowLoc);
}
----------------
There shouldn't be any invalid location in the container. An exception is
thrown by a statement, so we know where in source that happens.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:352
+
+ auto ShouldRemoveFnt = [HandlerTy, &Context](const Type *ExceptionTy) {
CanQualType ExceptionCanTy = ExceptionTy->getCanonicalTypeUnqualified();
----------------
For a moment it wasn't entirely clear for me what `Fnt` meant, I suggest using
naming like `FnType` or `FunctionType`.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:391
+ return true;
+ return false;
}
----------------
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:408
- for (const Type *T : TypesToDelete)
- ThrownExceptions.erase(T);
+ CaughtExceptions.emplace(*It);
+ It = ThrownExceptions.erase(It);
----------------
This introduces a side effect to this function and makes it do 2 things at the
same time. Besides filtering the caught exceptions, it also collects and
returns them through a reference parameter.
I don't mind the latter, but in that case I'd like to see the caught exceptions
returned from the function as a part of the return statement. Also notice that
if `CaughtExceptions` is not empty, `Result` is `true`, which makes the latter
redundant. I suggest dropping the `bool` return type and returning the
`Throwables` instead.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:428
+ (IgnoredTypes.count(TD->getName()) > 0)) {
+ It = ThrownExceptions.erase(It);
+ continue;
----------------
You are erasing something from a container on which you're iteration over. Are
you sure the iterators are not invalidated, when the internal representation
changes?
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:542
+ CaughtExceptions)) {
+ CaughtExceptions.emplace(CaughtType, SourceLocation());
ExceptionInfo Rethrown = throwsException(Catch->getHandlerBlock(),
----------------
Here we rethrow something from a `try` block if I understand it correctly.
```lang=c++
void foo() {
throw 3;
}
void bar() {
try {
foo();
} catch(short) {
}
}
```
The best way would be to set the `SourceLocation` to the point, where `foo()`
is called.
I think you would need to create a new `struct` called `ThrowableInfo`, which
contains,
every information that we need to know about the `Throwable` e.g.: type,
location, parent
context, etc. That would also be more extensible.
If there's no way to deduce this location for some reason, you can still set
the location
to the `try` block and create messages like `rethrown from try here`, etc. Just
don't create
invalid `SourceLocation`s please, because besides them being incorrect, they
are also
a source of bugs and crashes.
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp:573
Excs.getExceptionTypes(), CallStack));
- for (const Type *Throwable : Excs.getExceptionTypes()) {
+ for (auto [Throwable, ThrowLoc] : Excs.getExceptionTypes()) {
if (const auto ThrowableRec = Throwable->getAsCXXRecordDecl()) {
----------------
================
Comment at: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h:40
/// exception at runtime.
+
class ExceptionInfo {
----------------
Remove this `\n` please, we don't have an additional new line above the
`ExceptionAnalyzer` class either, so please keep it consistent.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153298/new/
https://reviews.llvm.org/D153298
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits