g_cache_insert()因空指针错误而崩溃

时间:2010-12-19 12:48:41

标签: glib

我在glib中写了一个测试示例:

#undef G_DISABLE_ASSERT
#undef G_LOG_DOMAIN

#include <stdio.h>
#include <string.h>
#include "glib.h"

void function(gchar *key,gchar *value,gint *user_data)
{
 // give the count of the number of times the function was called
 (*user_data)++;
}

void cache_test()
{
 gchar *str1,*str2,*str3;
 GCache *cache = NULL;
 gint user_data = 0;

 g_assert((cache = g_cache_new( (GCacheNewFunc) g_ascii_strup,
     g_free, (GCacheDupFunc) g_strdup, g_free, g_str_hash, 
        g_str_hash, g_str_equal)) != NULL);
 g_print("\n g_assert g_cache_new");
    str1 = g_cache_insert(cache,"test");
    g_print("\n str1 = g_cache_insert(cache,test)");
    g_assert(!strcmp("TEST",str1));
    g_print("\n g_assert(!strcmp(TEST,str1))");
 str2 = g_cache_insert(cache,"test");
 g_print("\n str2 = g_cache_insert(cache,test)");
 g_assert(!strcmp("TEST",str1));
 g_print("\n g_assert(!strcmp(TEST,str1))");
 str3 = g_cache_insert(cache,"glib");
 g_print("\n str3 = g_cache_insert(cache,glib)");
 g_assert(!strcmp("GLIB",str3));
 g_print("\n g_assert(!strcmp(GLIB,str3))");
 g_cache_key_foreach (cache,(GHFunc)function,&user_data);
 g_print("\n g_cache_key_foreach (cache,(GHFunc)function,&user_data)");
 //g_cache_key_foreach would call function twice and make user_data == 2
 g_assert(user_data == 2);

 g_cache_value_foreach (cache,(GHFunc)function,&user_data);
 g_print("\n g_cache_key_foreach (cache,(GHFunc)function,&user_data)");
 //g_cache_value_foreach would call function twice and make user_data == 4
 g_assert(user_data == 4);

 g_cache_remove(cache,str1);
 g_print("\n g_cache_remove(cache,str1)");
 g_cache_remove(cache,str2); 
 g_print("\n g_cache_remove(cache,str1)");
 g_cache_remove(cache,str3); 
 g_print("\n g_cache_remove(cache,str1)");
 g_cache_destroy(cache);
 g_print("\n g_cache_destroy(cache)");
}


int main (int   argc,
      char *argv[])
{
 cache_test();
 return 0;
}

现在我的测试示例在str1 = g_cache_insert(cache,“test”)崩溃;因为空指针解除引用。 我可能出错的任何帮助?

<小时/> 的修改

我只是尝试了另外一个快速修复测试代码以确认您的建议(g_ascii_strup中的错误)。我用了电话

cache = g_cache_new((GCacheNewFunc) g_strdup, 
  g_free, (GCacheDupFunc)g_strdup, g_free, g_str_hash, 
  g_str_hash, g_str_equal); 

ie而不是g_ascii_strup()我使用g_strdup ...我没有看到任何崩溃。我在这里错过了什么吗?

最新的glib版本中是否修复了g_ascii_strup()错误?如果您知道错误号码,我可以提供错误编号吗?

1 个答案:

答案 0 :(得分:1)

我会取出(GCacheNewFunc)和(GCacheDupFunc)强制转换,因为它们打破了类型安全性,在这种情况下,隐藏了一个错误:g_ascii_strup接受一个可能是垃圾的长度参数。而是使用正确的签名创建一个函数,并在该函数内调用g_ascii_strup。那你就不需要演员了。

我猜这就是问题所在。但如果没有,我要做的就是在你的GLib上获得调试符号,然后在gdb中获得回溯。