星号:双重免费或腐败(快速顶部)

时间:2017-02-07 02:00:39

标签: c asterisk

我将使用ast_malloc和ast_realloc函数拼接一个长字符串。当我加载此模块时,它将发生段错误。问题是什么?非常感谢! Asterisk的输出如下:

*** glibc detected *** asterisk: double free or corruption (fasttop):     0x00007fd56c000b20 ***
======= Backtrace: =========
/lib64/libc.so.6[0x33b9675f3e]
/lib64/libc.so.6[0x33b9678dd0]
/lib64/libc.so.6[0x33b967bd60]
/lib64/libc.so.6(realloc+0x158)[0x33b967c058]
/usr/lib64/asterisk/modules/app_test2.so(func+0x25)[0x7fd5330d19c5]
/usr/lib64/asterisk/modules/app_test2.so(+0xa92)[0x7fd5330d1a92]
asterisk[0x5175d5]
asterisk(ast_load_resource+0x34)[0x51a924]
asterisk[0x4c0f80]
asterisk(ast_cli_command_full+0x162)[0x4c3ad2]
asterisk(ast_cli_command_multiple_full+0x7c)[0x4c3cfc]
asterisk[0x450b9a]
asterisk[0x5c41cb]
/lib64/libpthread.so.0[0x33b9a07aa1]
/lib64/libc.so.6(clone+0x6d)[0x33b96e8aad]

以下代码如下:

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/strings.h"
#include "asterisk/json.h"
#include "asterisk/res_odbc.h"

ASTERISK_FILE_VERSION(__FILE__, "$Revision$")

#define AST_MODULE "app_test"

void func(char* test, const char* src)
{
    char* new_test = (char*)ast_realloc(test, strlen(test) + 32);

    if ( NULL == new_test ){
        ast_log(LOG_ERROR, "realloc error\n");
        return;
    }

    test = new_test;
    strcat(test, src);
}

static int load_module(void)
{

    int i;
    char* test;
    char* src = "MingYuan";
    test = (char*)ast_malloc(16);

    for (i = 0; i < 6; i++) {
        func(test, src);
    }

    ast_log(LOG_DEBUG, "\n++++\n%s\n*******\n", test);
    ast_free(test);

    return AST_MODULE_LOAD_SUCCESS;
}

static int unload_module(void)
{

    return 0;
}

AST_MODULE_INFO(
    ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "APP_TEST",
    .load = load_module,
    .unload = unload_module
);

1 个答案:

答案 0 :(得分:1)

strlen(test)中的{p> func没有意义,因为您还没有将字符串复制到test;这可能会导致不稳定的行为。我的建议是,test = (char*)ast_malloc(16);之后您可能想要strcpy(test, "");test[0] = '\0'; ......

由于C中的按值传递语义,func的来电者无法看到这些更改:

test = new_test;
strcat(test, src);

调用者在指针变量的某处会有一个旧的,无效的指针值,这在以后再次使用时肯定会导致更不稳定的行为......

我的建议是你开发函数,以便调用者分配内存;这不仅可以解决您的问题,而且还可以让您更加灵活地使用 分配内存的方式更加灵活。