2011-09-04 101 views
0

我在这里转贴的问题:的strstr()C和未初始化值

strstr valgrind error

+0

它看起来就像是抱怨,因为如果str参数进行初始化(进入FUNC2)的valgrind不知道。你可以尝试像'char * t2 = malloc(1); t2 = str;'看看它是否抱怨? –

+0

此外,避免使用'str = realloc(str,....);' - 如果失败,'str'将被设置为'null',并且您将失去指向最初分配的内存的指针到它。这是一个经典的内存泄漏。 –

+0

您的问题可能是由于字符串不正确的空终止引起的,但是如果您发布了func1()的整个代码以及valgrind的错误消息,那只能是可诊断的。 – jpalecek

回答

1

第一个问题,我看到的是,FUNC2没有错误检查。无论valgrind是注意到这一点,还是抱怨别的,我都不确定。

如果你知道,在所有用例FUNC2将永远std == NULL被调用,那你就不要需要错误检查。但valgrind无法知道,即使这是真的。是否支票如:

func2(str, line) 
{ 
    char * t1 = str, * t2 = str; 

    if (str == NULL) return; 

    ... 
} 

有帮助吗?

+0

这不太可能。 Valgrind并不关心你是否在代码中进行任何检查,因为它根本不分析代码。事实上,它只报告运行时在特定运行中发生的事件(如未初始化的数据使用,空值/悬空指针引用等)。 – jpalecek

+0

如果valgrind正在抱怨正在使用未初始化的值,检查此类错误应该防止发生这种情况,因此(间接地)会修复此问题。 – ssube

+0

...除了你不能在C中检查未初始化的数据。如果它是空的解除引用,valgrind会这么说;它报告未初始化数据的事实表明错误在于别处。 – jpalecek

0

我认为问题是,Valgrind的指出:

str = realloc(str, ....); //this is within the loop 

可以设置str为NULL(如果realloc()失败)。

看看像下面让Valgrind的快乐:

char* tmp = realloc(str, ...); 
if (!tmp) { 
    abort(); // or some other error handling 
} 
str = tmp;