2010-12-19 9 views
0

nullポインタエラーでクラッシュ:今、私のテスト例はSTR1 = g_cache_insertでクラッシュし g_cache_insertは()私は口が達者で試験例を書いた

#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; 
} 

(キャッシュ、 "テスト"); NULLポインタの逆参照が原因です。 私が間違っている可能性のあるヘルプ?


編集

私はちょうど(g_ascii_strupのバグの)あなたの提案を確認するためにテストコードに1つのより簡単な修正を試してみました。私は私がすべてのクラッシュを見ていない... g_strdup使用コール

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

すなわち代わりのg_ascii_strupを()を使用しました。ここに何もないのですか?

と最新のglibのリリースで修正されたg_ascii_strup()のバグですか?あなたがそれを知っている場合、バグ番号を持っていてもいいですか?

+0

@Havocはキャストがない 'g_ascii_strup()'で、あなたのプログラムにバグが隠れていたもので。 – ptomato

答えて

1

(GCacheNewFunc)と(GCacheDupFunc)キャストは型の安全性が損なわれているため、この場合、バグを隠しているので、g_ascii_strupはおそらくガベージになる長さパラメータをとります。代わりに、適切な署名で関数を作成し、その関数の中でg_ascii_strupを呼び出します。その後、キャストは必要ありません。

私はそれが問題だと思うだろう。ていない場合でも、私は何だろうと、あなたのGLibのデバッグシンボルを取得し、GDBでバックトレースを取得することです。

関連する問題