2010-12-19 2 views
0

널 포인터 오류로 충돌 : 지금 내 테스트 예 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; 
} 

(캐시, "테스트"); 널 포인터 역 참조 때문에. 내가 잘못 될 수있는 도움이 필요하십니까?


편집은

난 그냥 (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); 

예 : g_ascii_strup 내가 여기서 아무것도 놓치고 있니?

그리고 최신 glib 릴리스에서 g_ascii_strup() 버그가 수정 되었습니까? 알고 있다면 버그 번호를 알려주시겠습니까?

+0

@Havoc은 캐스트가 프로그램에서 버그를 숨기고,'g_ascii_strup() '이 아니라는 것을 의미했습니다. – ptomato

답변

1

(GCacheNewFunc) 및 (GCacheDupFunc) 캐스트는 타입 안전성을 손상시키고이 경우 버그를 숨기기 때문에 제거됩니다. g_ascii_strup은 아마도 가비지가 될 길이 매개 변수를 취합니다. 대신 적절한 서명으로 함수를 만들고 그 함수 안에서 g_ascii_strup을 호출하십시오. 그렇다면 캐스팅이 필요하지 않습니다.

그게 문제라고 생각합니다. 하지만 그렇지 않다면, 내가 할 수있는 것은 GLib에 디버그 심볼을 얻고 gdb에서 백 트레이스를 얻는 것입니다.

관련 문제