[cfe-dev] [StaticAnalyzer] Potential bug in MemRegion.cpp?

Aditya Kumar hiraditya at codeaurora.org
Fri Sep 20 11:50:29 PDT 2013


Yes the program is private, so I have the Memregion::dump(), hope this
helps.
I was curious if I could figure out the statement/function in the program
where this bug occurs. That way I could try to get a minimal test case.
Is it possible to see the program code from within the debugger?

Program received signal SIGSEGV, Segmentation fault.
0x0000000000eaaf2e in clang::CXXRecordDecl::data (this=0x0)
	at
/prj/llvm-arm/home/kaditya/llvm-debug/llvm/tools/clang/lib/CodeGen/../../inc
lude/clang/AST/DeclCXX.h:559
559     	return *DefinitionData;
(gdb) up
#1  0x0000000000f0cc62 in clang::CXXRecordDecl::bases_begin (this=0x0)
	at
/prj/llvm-arm/home/kaditya/llvm-debug/llvm/tools/clang/lib/CodeGen/../../inc
lude/clang/AST/DeclCXX.h:673
673   	base_class_const_iterator bases_begin() const { return
data().getBases(); }
(gdb)
#2  0x000000000177a670 in isImmediateBase (Child=0x0, Base=0x4a55520)
	at
/prj/llvm-arm/home/kaditya/llvm-debug/llvm/tools/clang/lib/StaticAnalyzer/Co
re/MemRegion.cpp:1154
1154  	for (CXXRecordDecl::base_class_const_iterator I =
Child->bases_begin(),

#3  0x000000000177a8be in clang::ento::MemRegion::getAsOffset
(this=0x5cda100)
	at
/prj/llvm-arm/home/kaditya/llvm-debug/llvm/tools/clang/lib/StaticAnalyzer/Co
re/MemRegion.cpp:1242
1242          	if (!isImmediateBase(Child, BOR->getDecl()))

(gdb) p this->dump()
base{SymRegion{reg_$323<element{SymRegion{conj_$309{const void_cv_type *}},0
S32b,void *}>},Tile}->i_$1 = void
(gdb) p this->getString()
$2 = {static npos = 18446744073709551615,
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>>
= {<No data fields>}, <No data fields>},
	_M_p = 0x59f8bc8
"base{SymRegion{reg_$323<element{SymRegion{conj_$309{const void_cv_type
*}},0 S32b,void *}>},Tile}->i_"}}


Thanks
-Aditya

> -----Original Message-----
> From: Jordan Rose [mailto:jordan_rose at apple.com]
> Sent: Thursday, September 19, 2013 7:22 PM
> To: Aditya Kumar
> Cc: 'Clang Dev'
> Subject: Re: [cfe-dev] [StaticAnalyzer] Potential bug in MemRegion.cpp?
> 
> If it's not a private program you can create a bug at
http://llvm.org/bugs/ and
> attach the preprocessed file. If it is a private program (corporate or
> something) well...you could at least report where the caller is and what
the
> original MemRegion is (using MemRegion::dump) and I can try to figure it
out
> from that.
> 
> Jordan
> 
> 
> On Sep 19, 2013, at 17:15 , Aditya Kumar <hiraditya at codeaurora.org> wrote:
> 
> > I was compiling a program when I hit this segmentation fault. The
> > program is kind of big and I don't know how to reduce it to a minimal
test
> case.
> >
> >
> >
> >> -----Original Message-----
> >> From: Jordan Rose [mailto:jordan_rose at apple.com]
> >> Sent: Thursday, September 19, 2013 11:13 AM
> >> To: Aditya Kumar
> >> Cc: 'Clang Dev'
> >> Subject: Re: [cfe-dev] [StaticAnalyzer] Potential bug in MemRegion.cpp?
> >>
> >> I think the bug here is that "Child" should never be NULL. How are
> >> you getting into this situation?
> >>
> >> Jordan
> >>
> >> On Sep 19, 2013, at 8:15 , Aditya Kumar <hiraditya at codeaurora.org>
> wrote:
> >>
> >>> When the following function is called by (RegionOffset
> >>> MemRegion::getAsOffset() const:1257), and the first parameter
> >>> (Child) is a NULL pointer I get a segmentation fault.
> >>>
> >>> @file: MemRegion.cpp
> >>> 01164 static bool isImmediateBase(const CXXRecordDecl *Child,
> >>> 01165                             const CXXRecordDecl *Base) {
> >>> 01166   // Note that we do NOT canonicalize the base class here,
because
> >>> 01167   // ASTRecordLayout doesn't either. If that leads us down the
> > wrong
> >>> path,
> >>> 01168   // so be it; at least we won't crash.
> >>> 01169   for (CXXRecordDecl::base_class_const_iterator I =
> >>> Child->bases_begin(),
> >>> 01170                                                 E =
> >>> Child->bases_end();
> >>> 01171        I != E; ++I) {
> >>> 01172     if (I->getType()->getAsCXXRecordDecl() == Base)
> >>> 01173       return true;
> >>> 01174   }
> >>> 01175
> >>> 01176   return false;
> >>> 01177 }
> >>>
> >>> For now I just return `false' when `Child' pointer is NULL. Is this
> >>> fix okay or there is something else required to be done?
> >>>
> >>>
> >>> Thanks,
> >>> -Aditya
> >>>
> >>>
> >>> _______________________________________________
> >>> cfe-dev mailing list
> >>> cfe-dev at cs.uiuc.edu
> >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >
> >





More information about the cfe-dev mailing list