널 포인터 오류로 충돌 : 지금 내 테스트 예 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() 버그가 수정 되었습니까? 알고 있다면 버그 번호를 알려주시겠습니까?
@Havoc은 캐스트가 프로그램에서 버그를 숨기고,'g_ascii_strup() '이 아니라는 것을 의미했습니다. – ptomato