C/Glib,我是否正确截断了这个gchar数组?

C/Glib,我是否正确截断了这个gchar数组?,c,string,free,glib,C,String,Free,Glib,我试图重构/修复一个函数,我是否正确地执行了此截断?如果不是,一般应如何进行?他特别想知道潜在的泄漏 void process_entry(GMenuTreeEntry *entry) { char *name = g_strdup (gmenu_tree_entry_get_name(entry)); char *exec = g_strdup (gmenu_tree_entry_get_exec(entry)); int i; for (i = 0; i &

我试图重构/修复一个函数,我是否正确地执行了此截断?如果不是,一般应如何进行?他特别想知道潜在的泄漏

void process_entry(GMenuTreeEntry *entry)
{
    char *name = g_strdup (gmenu_tree_entry_get_name(entry));
    char *exec = g_strdup (gmenu_tree_entry_get_exec(entry));
    int i;

    for (i = 0; i < strlen(exec) - 1; i++) {
        if (exec[i] == '%')
        {
            switch (exec[i+1]) {
                case 'f': case 'F':
                case 'u': case 'U':
                case 'd': case 'D':
                case 'n': case 'N':
                case 'i': case 'c': case 'k': case 'v': case 'm':
                    exec[i-1] = '\0';
                    i++;
                    break;
            }
        }
    }

    g_printf("<item label=\"%s\">\n", g_strjoinv("&amp;", g_strsplit(name,"&",0))),
    g_printf("<action name=\"Execute\"><command>%s</command></action>\n", exec),
    g_printf("</item>\n");

    g_free(name);
    g_free(exec);
}
void process\u条目(GMenuTreeEntry*条目)
{
char*name=g_strdup(gmenu_tree_entry_get_name(entry));
char*exec=g_strdup(gmenu_tree_entry_get_exec(entry));
int i;
对于(i=0;i

这是一些GPL代码,非常感谢您的帮助。一般来说,我对C语言还是很陌生,而且我是一个很能说会道的新手。

gchar
char
完全相同,所以无论您在这里做什么,都同样适用于常规的C字符串


当您对字符串调用
free()
g_free()
时,它不会计算
strlen()
来确定要释放多少内存;它释放最初在该地址分配的内存量。否则,您永远无法释放未指定其分配内存长度的指针。因此截断字符串是安全的。

gchar
char
完全相同,因此无论您在这里做什么,都同样适用于常规C字符串


当您对字符串调用
free()
g_free()
时,它不会计算
strlen()
来确定要释放多少内存;它释放最初在该地址分配的内存量。否则,您永远无法释放未指定其分配内存长度的指针。因此,截断字符串是安全的。

当然,在提交该函数之前,您将对其进行单元测试。不要只满足于这些,但基本测试必须针对null、空、“%a”、“a%”、“a”和“%”进行测试。我估计其中有三个是错误的。是的,当然有漏洞,就在你认为有漏洞的地方。是的,插入'\0'是截断C字符串的一种非常简单的方法。ptomato很好地回答了截断部分。至于泄漏,您正在泄漏g_strjoinv和g_strsplit的返回值。您应该将结果保存到一个临时变量中,然后使用该值调用g_printf,然后对其调用g_free和g_strfreev。当然,在将该函数提交到任何地方之前,您都将对其进行单元测试。不要只满足于这些,但基本测试必须针对null、空、“%a”、“a%”、“a”和“%”进行测试。我估计其中有三个是错误的。是的,当然有漏洞,就在你认为有漏洞的地方。是的,插入'\0'是截断C字符串的一种非常简单的方法。ptomato很好地回答了截断部分。至于泄漏,您正在泄漏g_strjoinv和g_strsplit的返回值。您应该将结果保存到一个临时变量中,然后使用该值调用g_printf,然后对其调用g_free和g_strfreev。