使用new()运算符分配内存时,Mudflap会抛出核心转储。

6

这是我的代码片段。

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

当使用mudflap编译时

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

但是,如果不使用mudflap选项进行编译,它就不会抛出核心转储。

我对mudflap比较陌生。请告诉我是否使用了错误的mudflap方式。

FYI:

$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
在我的Red Hat 5.4,gcc 4.7.2上一切都很正常。 - BoBTFish
1
我可以建议在问题中包含回溯吗?要获取回溯,请使用gdbgdb a.out core)打开核心转储文件,然后在内部使用bt命令。 - Jan Hudec
@BoBTFish:如果复制代码时出现了拼写错误,而实际代码确实创建了一个数组,那么mudflap就会正确地抛出异常。 - Jan Hudec
@JanHudec 这是核心转储的回溯。 - rohitsoren
@BoBTFish 抱歉,不要用变量名。我不是在尝试创建一个数组。 - rohitsoren
1个回答

0

在我的编译器(x86上的Solaris)上,您的示例可以原样编译通过,但实际上,它非常简单,平台不应该有任何影响。按照您编写的方式,您的代码应该能够在任何地方编译和运行。这似乎是MudFlap的一些缺点。

在我的当前环境中,我无法访问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。也许它在某个配置设置中让你指定要使用和管理原始指针。无论如何,无论情况如何,你最好采用智能指针方法。

尝试一下,告诉我们是否有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接