[cfe-dev] Illegal instruction problem

Philip Ashmore contact at philipashmore.com
Tue Nov 29 14:20:40 PST 2011


On 29/11/11 20:38, Eli Friedman wrote:
> On Tue, Nov 29, 2011 at 12:25 PM, Philip Ashmore
> <contact at philipashmore.com>  wrote:
>> Sorry Chris for sending this to you personally before - I meant to send
>> it to the list.
>>
>> On 28/11/11 14:40, Chris Lattner wrote:
>>>
>>> On Nov 27, 2011, at 6:02 PM, Philip Ashmore wrote:
>>>
>>>> Hi there.
>>>>
>>>> I've just committed new versions of some of my packages in SourceForge:
>>>>
>>>> v3c-2.2.0-01
>>>> treedb-1.2.0-02
>>>> meta-treedb-1.3.0-03
>>>>
>>>> I've got a problem with the release build (which uses -03 optimisation)
>>>> of treedb.
>>>>
>>>> The "fuse" tests fail with an illegal instruction fault.
>>>
>>> Hi Philip,
>>>
>>> The most likely cause of this is that you're using undefined behavior
>>> (e.g. an uninitialized variable, array out of bounds, etc) in your
>>> code that the optimizer is detecting.  Please see:
>>> http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
>>>
>>> for more information.
>>>
>>> -Chris
>> OK. Well, I did find a problem in v3c with valgrind - I'll push a new
>> release after writing
>> this. It has nothing to do with this problem though - fcntl(F_GETLK)
>> doesn't set l_pid if
>> there's no lock.
>>
>> Unfortunately valgrind can't go through setuid/setgid programs, which is
>> what the fuse library does
>> - it runs fusermount, so I couldn't valgrind the whole test.
>>
>> So I tried another way.
>>
>> 1. In treedb
>>     $ cd build/v3c/3-comet
>>     $ mkdir fuse
>> 2. Run the daemon in foreground mode on the "fuse" directory and add
>> debug output 'cause we can:
>>     $ TREEDB_FUSE_TMPDIR=$(readlink -f .) LD_LIBRARY_PATH=.libs:../.libs
>> ./lt-treedb-malloc-daemon-d -d fuse
>> 3. Debug malloc-test-d
>>     $ kdbg .libs/malloc-test-d
>> 4. Set the command line argument to reserve a 50M heap :
>> kdbg->Execution->Arguments 50M
>> 5. Set environment variables in kdbg->Execution->Arguments->Environment
>>     LD_LIBRARY_PATH=.libs:../.libs
>>     V3C_TREEDB_MALLOC_FUSE_DIR=fuse
>> 6. Run the program kdbg->Execution->Run or F5
>>
>> It hit an "ud2" instruction - kdbg reports SIGILL - Illegal instruction,
>
> LLVM generates a ud2 in some cases where it can locally prove code is
> unreachable because it has undefined behavior.  You're most likely
> hitting that.
>
>> at treedb's v3c/avl-impl.h line
>> 227, in treedb_malloc_AvlAllocator_used_insert_node_after_64 - the
>> function name is a macro expansion
>> and I've expanded it here as that's what's in the stack trace.
>>
>> Unfortunately v3c/avl-impl.h line 227 isn't in the above function - it's
>> inside
>> AVL_TREE_NS(unpack_node)(...) - I won't expand the macro-mangled name here.
>>
>> So either kdbg-2.5.0-1 is wrong (not impossible) or the debug
>> information or llvm/clang is wrong.
>
> Are you sure it isn't due to inlining?
>
> -Eli
insert_node_after() calls unpack_node(), not the other way around, so yes, I'm sure.

Please give it a try.

Philip




More information about the cfe-dev mailing list