NoQ added a subscriber: rnkovacs.
NoQ added a comment.

We should add at least some tests for the other three functions.



================
Comment at: clang/include/clang/StaticAnalyzer/Checkers/Checkers.td:278
+def CastValueChecker : Checker<"CastValue">,
+  HelpText<"Model casts">,
+  Documentation<NotDocumented>;
----------------
"Model implementation of custom RTTIs."


================
Comment at: 
clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h:250
 
+  /// A shorthand version of getNoteTag that accepts a plain note.
+  ///
----------------
Great! I recognize the need for such function now.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp:25-27
+  using CastCheck =
+      std::function<void(const CastValueChecker *, const CallExpr *,
+                         DefinedOrUnknownSVal, CheckerContext &)>;
----------------
Charusso wrote:
> NoQ wrote:
> > Kinda nice, but a simple pointer-to-member would have been sufficient and 
> > much more lightweight:
> > 
> > ```lang=c++
> > using CastCheck = void (CastValueChecker::*)(const CallExpr *,
> >                          DefinedOrUnknownSVal, CheckerContext &);
> > ```
> > 
> > (not sure, i don't fully understand the performance implications of using 
> > `std::function`)
> It took me an hour to realize I have to push the class as the signature of 
> the function to create a member-callback. I think it is not that lightweight, 
> but it is modern. I believe it is made for that purpose when you could write 
> `Foo[13]` or `*(13 + P)`, where the latter creeps me out.
> 
> Thanks for the copy-pasteable code, I really enjoy to see what do you think 
> exactly, but this is the first time when I would pick my idea. (I would had 
> recommended that modern way in your patch just I thought it is not working 
> with methods.)
Ok then!


================
Comment at: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp:58-59
+  QualType Ty = Cast->getType();
+  if (const CXXRecordDecl *CD = Ty->getPointeeCXXRecordDecl())
+    return CD->getName();
+
----------------
I suspect that this may crash if `CD` is an anonymous structure. So you should 
use `getNameAsString()` instead.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp:61
+
+  return Ty.getAsString();
+}
----------------
Use after free! `QualType::getAsString()` returns a temporary `std::string`. 
You're returning a `StringRef` that outlives the string it refers to. The 
solution is usually to return the `std::string` by value.

//*summons @rnkovacs*//

Generally, i'd rather bail out on this branch. If we're seeing a dyn_cast of 
something that //isn't a class//, we're already doing something wrong.


================
Comment at: clang/test/Analysis/cast-value.cpp:3
+// RUN:  -analyzer-checker=core,apiModeling.CastValue,debug.ExprInspection \
+// RUN:  -verify=logic %s
+// RUN: %clang_analyze_cc1 \
----------------
Nice!

I guess putting them into separate files would have been easier this time.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D64374/new/

https://reviews.llvm.org/D64374



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to