2013-05-10 71 views
6

這是我的代碼片段。使用new()運算符分配內存時,mudflap會拋出核心轉儲

int main() 
    { 
    int *var = new int(6); 
    cout<<"Hello\n"; 
    delete var; 
    return 0; 
} 

當擋泥板編譯爲

$export MUDFLAP_OPTIONS="-print-leaks -mode-check" 
$g++ test.cpp -fmudflap -lmudflap 
$./a.out 
Segmentation fault (core dumped) 

但是當沒有擋泥板選項編譯它不會引發核心轉儲。 我是新來的擋泥板。請告訴我是否以錯誤的方式使用擋泥板。

供參考:

$uname -a 
Linux localhost.localdomain 2.6.18-308.4.1.el5 #1 SMP Wed Mar 28 01:54:56 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux 
$g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux-gnu/4.7.3/lto-wrapper 
Target: x86_64-redhat-linux-gnu 
Configured with: /root/rohit/gcc-4.7.3/configure --prefix=/usr/ 
Thread model: posix 
gcc version 4.7.3 (GCC) 

BT充分信息轉儲通過`./a.out」中產生

核心。

Program terminated with signal 11, Segmentation fault. 
[New process 22176] 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
(gdb) bt ful 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#1 0x0000003ca5e0882b in _Unwind_Backtrace() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#2 0x0000003c96ce5eb8 in backtrace() from /lib64/libc.so.6 
No symbol table info available. 
#3 0x00002b4acf58b417 in __mf_backtrace (symbols=0x6a51db8, guess_pc=0x2b4acf58d351, guess_omit_levels=2) 
    at /root/rohit/gcc-4.7.3/libmudflap/mf-runtime.c:1981 
     pc_array = (void **) 0x6a51e00 
     pc_array_size = 6 
     remaining_size = <value optimized out> 
     omitted_size = Unhandled dwarf expression opcode 0x9f 
     i = <value optimized out> 
#4 0x0000000000000002 in ??() 
No symbol table info available. 
#5 0x0000000000000004 in ??() 
No symbol table info available. 
#6 0x0000000000000000 in ??() 
No symbol table info available. 
+6

就像一個警告,你明白你的代碼不*創建一個數組,對吧? – BoBTFish 2013-05-10 13:51:01

+0

對於我來說,所有的工作都適用於Red Hat 5.4,gcc 4.7.2 – BoBTFish 2013-05-10 13:59:52

+1

我可以建議在問題中包含回溯嗎?要獲得回溯,使用'gdb'('gdb a.out core')打開核心轉儲,並使用裏面的'bt'命令。 – 2013-05-10 14:33:34

回答

0

您的示例編譯爲我的編譯器(x86上的Solaris),但實際上,它非常簡單,以至於平臺不應有所作爲。正如所寫,您的代碼應該編譯並在任何地方運行。這似乎是MudFlap的一些缺點。

我沒有訪問擋泥板在我目前的環境,但這裏的東西可能讓你完全避免的問題:

#include <iostream> 
#include <boost/shared_ptr.hpp> 
using namespace std; 

int main() { 
boost::shared_ptr<int> var (new int(6)); 
cout << "Hello #" << *var << endl; 
return 0; 
} 

我做野生的猜測,「隱藏」的動態分配在智能指針初始化中會欺騙MudFlap。

我猜你的片段是你簡化現實世界的問題。雖然我不知道爲什麼即使簡化版本不會在你的環境中編譯(它應該),但上述解決方案的優點是你不必擔心刪除指針,但是真實世界的範圍卻很大。

然後,也許MudFlap真的很聰明,試圖強迫你使用RAII。也許它有一些配置設置,讓你指定你想要使用和管理原始指針。無論如何,無論如何,您都可以順利使用智能指針方法。

試試吧,讓我們知道它是否有幫助。