[llvm-bugs] [Bug 38310] New: Memory errors in DIBuilder::createFile() that result in a seg fault
via llvm-bugs
llvm-bugs at lists.llvm.org
Wed Jul 25 08:15:30 PDT 2018
https://bugs.llvm.org/show_bug.cgi?id=38310
Bug ID: 38310
Summary: Memory errors in DIBuilder::createFile() that result
in a seg fault
Product: new-bugs
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: new bugs
Assignee: unassignedbugs at nondot.org
Reporter: vext01 at gmail.com
CC: llvm-bugs at lists.llvm.org
Hi,
I was doing some simple code-gen using the C++ API from llvm-7 (trunk) and I
think I've found some memory errors.
Here's a minimal example, xxx.cpp:
```
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/DIBuilder.h"
#include <iostream>
using namespace llvm;
int
main(void)
{
LLVMContext TheContext;
StringRef ModName("mymod");
Module TheModule(ModName, TheContext);
DIBuilder DBuilder(TheModule);
StringRef DFile("main.xxx");
StringRef DDir(".");
std::cout << "making the file" << std::endl;
DBuilder.createFile(DFile, DDir);
std::cout << "made the file" << std::endl;
return 0;
}
```
I have two versions of LLVM to test this with:
```
$ llvm-config-6.0 --version
6.0.1
$ llvm-config --version
7.0.0svn
```
LLVM-6.0.1 is from the llvm apt repo, and LLVM-7.0 is manually built from trunk
(last tried using the 2018-07-25 code).
And here's the Makefile used to build using those versions:
```
BIN=xxx
all: ${BIN}-6 ${BIN}-7
${BIN}-6: ${BIN}.cpp
clang++ -g $< `llvm-config-6.0 --cxxflags --ldflags --system-libs
--libs core` -o $@
${BIN}-7: ${BIN}.cpp
clang++ -g $< `llvm-config --cxxflags --ldflags --system-libs --libs
core` -o $@
```
After building, this program works fine under LLVM-6.0.1, but crashes on trunk:
```
$ ./xxx-6
making the file
made the file
$ ./xxx-7
making the file
Segmentation fault
```
Here's a trace, sadly it's not very useful:
```
(gdb) run
Starting program: /home/vext01/research/llvm-api-examples/xxx/xxx-7
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
making the file
Program received signal SIGSEGV, Segmentation fault.
0x00000000004080d9 in llvm::DIBuilder::createFile(llvm::StringRef,
llvm::StringRef, llvm::Optional<llvm::DIFile::ChecksumInfo<llvm::StringRef> >,
llvm::Optional<llvm::StringRef>) ()
(gdb) bt
#0 0x00000000004080d9 in llvm::DIBuilder::createFile(llvm::StringRef,
llvm::StringRef, llvm::Optional<llvm::DIFile::ChecksumInfo<llvm::StringRef> >,
llvm::Optional<llvm::StringRef>) ()
#1 0x000000000040799b in main () at xxx.cpp:21
```
If we valgrind the non-crashing 6.0.1 version:
```
$ valgrind --leak-check=full ./xxx-6
==26367== Memcheck, a memory error detector
==26367== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==26367== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright
info
==26367== Command: ./xxx-6
==26367==
making the file
made the file
==26367==
==26367== HEAP SUMMARY:
==26367== in use at exit: 72,952 bytes in 1,158 blocks
==26367== total heap usage: 1,497 allocs, 339 frees, 278,644 bytes allocated
==26367==
==26367== LEAK SUMMARY:
==26367== definitely lost: 0 bytes in 0 blocks
==26367== indirectly lost: 0 bytes in 0 blocks
==26367== possibly lost: 0 bytes in 0 blocks
==26367== still reachable: 72,952 bytes in 1,158 blocks
==26367== suppressed: 0 bytes in 0 blocks
==26367== Reachable blocks (those to which a pointer was found) are not shown.
==26367== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==26367==
==26367== For counts of detected and suppressed errors, rerun with: -v
==26367== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
```
So that's fine.
Now the crashing trunk binary:
```
$ valgrind --leak-check=full ./xxx-7
==26419== Memcheck, a memory error detector
==26419== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==26419== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright
info
==26419== Command: ./xxx-7
==26419==
making the file
==26419== Use of uninitialised value of size 8
==26419== at 0x4080D9: llvm::DIBuilder::createFile(llvm::StringRef,
llvm::StringRef, llvm::Optional<llvm::DIFile::ChecksumInfo<llvm::StringRef> >,
llvm::Optional<llvm::StringRef>) (in
/home/vext01/research/llvm-api-examples/xxx/xxx-7)
==26419== by 0x40799A: main (xxx.cpp:21)
==26419==
==26419== Invalid read of size 1
==26419== at 0x4080D9: llvm::DIBuilder::createFile(llvm::StringRef,
llvm::StringRef, llvm::Optional<llvm::DIFile::ChecksumInfo<llvm::StringRef> >,
llvm::Optional<llvm::StringRef>) (in
/home/vext01/research/llvm-api-examples/xxx/xxx-7)
==26419== by 0x40799A: main (xxx.cpp:21)
==26419== Address 0x10000000f is not stack'd, malloc'd or (recently) free'd
==26419==
==26419==
==26419== Process terminating with default action of signal 11 (SIGSEGV)
==26419== Access not within mapped region at address 0x10000000F
==26419== at 0x4080D9: llvm::DIBuilder::createFile(llvm::StringRef,
llvm::StringRef, llvm::Optional<llvm::DIFile::ChecksumInfo<llvm::StringRef> >,
llvm::Optional<llvm::StringRef>) (in
/home/vext01/research/llvm-api-examples/xxx/xxx-7)
==26419== by 0x40799A: main (xxx.cpp:21)
==26419== If you believe this happened as a result of a stack
==26419== overflow in your program's main thread (unlikely but
==26419== possible), you can try to increase the size of the
==26419== main thread stack using the --main-stacksize= flag.
==26419== The main thread stack size used in this run was 8388608.
==26419==
==26419== HEAP SUMMARY:
==26419== in use at exit: 8,001 bytes in 68 blocks
==26419== total heap usage: 73 allocs, 5 frees, 82,533 bytes allocated
==26419==
==26419== LEAK SUMMARY:
==26419== definitely lost: 0 bytes in 0 blocks
==26419== indirectly lost: 0 bytes in 0 blocks
==26419== possibly lost: 0 bytes in 0 blocks
==26419== still reachable: 8,001 bytes in 68 blocks
==26419== suppressed: 0 bytes in 0 blocks
==26419== Reachable blocks (those to which a pointer was found) are not shown.
==26419== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==26419==
==26419== For counts of detected and suppressed errors, rerun with: -v
==26419== Use --track-origins=yes to see where uninitialised values come from
==26419== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Segmentation fault
```
As you can see, there are memory errors, which I assume is causing the problem.
Looks like a bug to me.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20180725/cea895b5/attachment.html>
More information about the llvm-bugs
mailing list