r179395 - [analyzer]Print field region even when the base region is not printable
Jordan Rose
jordan_rose at apple.com
Fri Apr 12 12:35:17 PDT 2013
On Apr 12, 2013, at 11:40 , Anna Zaks <ganna at apple.com> wrote:
> Author: zaks
> Date: Fri Apr 12 13:40:21 2013
> New Revision: 179395
>
> URL: http://llvm.org/viewvc/llvm-project?rev=179395&view=rev
> Log:
> [analyzer]Print field region even when the base region is not printable
>
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
> cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp
> cfe/trunk/test/Analysis/inlining/path-notes.c
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h?rev=179395&r1=179394&r2=179395&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h Fri Apr 12 13:40:21 2013
> @@ -169,6 +169,8 @@ public:
> /// \brief Print the region for use in diagnostics.
> virtual void printPretty(raw_ostream &os) const;
>
> + virtual void printPrettyNoQuotes(raw_ostream &os) const;
Can this be named more clearly? This is being used when printing part of a larger expression, so how about something like 'printPrettyPartial' or 'printPiecePretty'?
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp?rev=179395&r1=179394&r2=179395&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp Fri Apr 12 13:40:21 2013
> @@ -559,6 +559,15 @@ bool MemRegion::canPrintPretty() const {
> }
>
> void MemRegion::printPretty(raw_ostream &os) const {
> + assert(canPrintPretty() && "This region cannot be printed pretty.");
> + os << "'";
> + printPrettyNoQuotes(os);
> + os << "'";
> + return;
> +}
> +void MemRegion::printPrettyNoQuotes(raw_ostream &os) const {
> + assert(canPrintPretty() && "This region cannot be printed pretty.");
> return;
> }
This should just be llvm_unreachable. If a region really is pretty-printed by not printing anything, it should override both methods.
Oh shoot, CXXBaseObjectRegion is such a region. Here is the test case:
struct Base { int *x; };
struct Derived : public Base {};
void test(Derived d) {
d.x = 0;
*d.x = 1;
}
> @@ -566,7 +575,7 @@ bool VarRegion::canPrintPretty() const {
> return true;
> }
>
> -void VarRegion::printPretty(raw_ostream &os) const {
> +void VarRegion::printPrettyNoQuotes(raw_ostream &os) const {
> os << getDecl()->getName();
> }
>
> @@ -574,17 +583,32 @@ bool ObjCIvarRegion::canPrintPretty() co
> return true;
> }
>
> -void ObjCIvarRegion::printPretty(raw_ostream &os) const {
> +void ObjCIvarRegion::printPrettyNoQuotes(raw_ostream &os) const {
> os << getDecl()->getName();
> }
>
> bool FieldRegion::canPrintPretty() const {
> - return superRegion->canPrintPretty();
> + return true;
> +}
> +
> +void FieldRegion::printPrettyNoQuotes(raw_ostream &os) const {
> + if (superRegion->canPrintPretty()) {
> + superRegion->printPrettyNoQuotes(os);
> + os << "." << getDecl()->getName();
> + } else {
> + os << "field " << "\'" << getDecl()->getName() << "'";
> + }
> }
Won't this break for nested fields?
struct Outer {
struct Inner {
int *p;
} inner;
};
void test(Outer *wrapperPtr) {
wrapperPtr->inner.p = 0;
*wrapperPtr->inner.p = 1;
}
I think you're going to need to have different levels of 'canPrintPretty' to fix this one.
> void FieldRegion::printPretty(raw_ostream &os) const {
> - superRegion->printPretty(os);
> - os << "." << getDecl()->getName();
> + if (superRegion->canPrintPretty()) {
> + os << "\'";
> + printPrettyNoQuotes(os);
> + os << "'";
> + } else {
> + printPrettyNoQuotes(os);
> + }
> + return;
> }
I feel like this is indicative of the problems aboveāthe same check has to be repeated here and in FieldRegion::printPrettyNoQuotes
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130412/725abaf4/attachment.html>
More information about the cfe-commits
mailing list