[Lldb-commits] [lldb] r327356 - [ExpressionParser] Fix crash when evaluating invalid expresssions.

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 20 13:07:16 PDT 2018


Thanks for fixing this is the right way and taking the time!

Greg


> On Mar 20, 2018, at 12:49 PM, Davide Italiano via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> Fixed in a nicer/cleaner way (that doesn't regress the current
> behavior), thank you everybody for your excellent feedback!
> 
> davide at Davidinos-Mac-Pro ~/w/l/llvm-project-20170507> git llvm push
> Pushing 1 commit:
>  8875fcce772 [ExpressionParser] Re-implement r327356 in a less disruptive way.
> Sending        lldb/trunk/include/lldb/Symbol/ClangASTContext.h
> Deleting       lldb/trunk/lit/Expr/Inputs/basic.cpp
> Deleting       lldb/trunk/lit/Expr/TestCallCppSym.test
> Adding         lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload
> Adding         lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/Makefile
> Adding         lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/TestOperatorOverload.py
> Adding         lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/a.cpp
> Adding         lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/operator-overload/b.cpp
> Sending        lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
> Sending        lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
> Sending        lldb/trunk/source/Symbol/ClangASTContext.cpp
> Transmitting file data ........done
> Committing transaction...
> Committed revision 328025.
> Committed 8875fcce772 to svn.
> 
> Thanks,
> 
> --
> Davide
> 
> On Thu, Mar 15, 2018 at 8:36 AM, Davide Italiano <dccitaliano at gmail.com> wrote:
>> On Wed, Mar 14, 2018 at 1:52 AM, Pavel Labath <labath at google.com> wrote:
>>> I'm not familiar with all of the magic we do when we synthesize clang Decls,
>>> but I feel I should point out that we can't get out of business of
>>> sanity-checking the declarations we inject into clang. The reason for that
>>> is, even if we had debug info for operator==, the debug info itself could
>>> describe it's prototype as operator==(...) (due to a compiler bug, corrupt
>>> file, or whatever). So we still need to make sure that the declarations we
>>> synthesize from debug info don't violate clang's invariants (and that's what
>>> we try to do at present, cf.
>>> ClangASTContext::CheckOverloadedOperatorParameterCount).
>>> 
>>> So maybe the solution here is not to refuse injecting any declarations
>>> without debug info, but instead to make sure that whatever declarations we
>>> inject that way satisfy the same validity criteria as the ones we synthesize
>>> from the debug info?
>>> 
>> 
>> I'll think about this more. On a more practical note, I was a able to
>> reproduce this with a fairly self contained C++ program :)
>> 
>> dcci at Davides-MacBook-Pro ~/w/l/b/bin> cat patatino.cpp
>> class Patatino {
>> public:
>>  double _blah;
>>  Patatino(int blah) : _blah(blah) {}
>> };
>> 
>> bool operator==(const Patatino& a, const Patatino& b) {
>>  return a._blah < b._blah;
>> }
>> 
>> 
>> dcci at Davides-MacBook-Pro ~/w/l/b/bin> cat patatuccio.cpp
>> class Baciotto {
>> public:
>>  int _meh;
>>  Baciotto(int meh) : _meh(meh) {}
>> };
>> 
>> int main(void) {
>>  Baciotto x(12);
>>  return 0;
>> }
>> 
>> 
>> $ ./clang++ patatuccio.cpp -o patatuccio.o -c -g
>> $ ./clang++ patatino.cpp -o patatino.o -c
>> $ ./clang++ patatino.o patatuccio.o -o patatuccio
>> 
>> $ nm ./patatuccio
>> 0000000100000f70 t __ZN8BaciottoC1Ei
>> 0000000100000fa0 t __ZN8BaciottoC2Ei.
>> 0000000100000f10 T __ZeqRK8PatatinoS1_.  <--- this is the wrong symbol picked up
>> 0000000100000000 T __mh_execute_header
>> 0000000100000f40 T _main
>>                 U dyld_stub_binder
>> 
>> $ echo '__ZeqRK8PatatinoS1_' | c++filt
>> operator==(Patatino const&, Patatino const&)
>> 
>> And in lldb:
>> 
>> (lldb) n
>> Process 35027 stopped
>> * thread #1, queue = 'com.apple.main-thread', stop reason = step over
>>    frame #0: 0x0000000100000f5f patatuccio`main at patatuccio.cpp:9
>>   6
>>   7   int main(void) {
>>   8    Baciotto x(12);
>> -> 9    return 0;
>>   10   }
>> (lldb) expr x == nil
>> Assertion failed: (i < getNumParams() && "Illegal param #"), function
>> getParamDecl, file
>> /Users/dcci/work/llvm/llvm/tools/clang/include/clang/AST/Decl.h, line
>> 2232.
>> fish: './lldb' terminated by signal SIGABRT (Abort)
>> 
>> 
>> I'll try debugging this more.
>> 
>> Thanks!
>> 
>> --
>> Davide
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits



More information about the lldb-commits mailing list