C中的strstr()和未初始化的值

C中的strstr()和未初始化的值,c,C,我在这里提出了这个问题: 我看到的第一个问题是func2没有错误检查。我不确定valgrind是注意到了这一点,还是在抱怨其他事情 如果您知道在所有用例中,func2永远不会用std==NULL调用,那么您就不需要进行错误检查。但瓦尔格兰德不知道,即使这是真的。支票是否类似于: func2(str, line) { char * t1 = str, * t2 = str; if (str == NULL) return; ... } 有什么帮助吗?我认为问题在于va

我在这里提出了这个问题:


我看到的第一个问题是func2没有错误检查。我不确定valgrind是注意到了这一点,还是在抱怨其他事情

如果您知道在所有用例中,func2永远不会用
std==NULL
调用,那么您就不需要进行错误检查。但瓦尔格兰德不知道,即使这是真的。支票是否类似于:

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

    if (str == NULL) return;

    ...
}

有什么帮助吗?

我认为问题在于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;

它似乎在抱怨,因为valgrind不知道str参数是否已初始化(进入func2)。你能试一下像
char*t2=malloc(1);t2=str并查看是否有投诉?同时,避免使用
str=realloc(str,…)
--如果失败,
str
将设置为
null
,您将丢失指向最初分配给它的内存的指针。这是一个典型的内存泄漏。您的问题可能是由字符串的不正确null终止引起的,但只有在发布func1()的全部代码和valgrind的错误消息时,才可以诊断。您的代码过于简化。无法从您提供的内容中了解发生了什么。例如,使用
func2
的返回值覆盖
str
的原始值。这很重要。但是无法查看
func2
返回的内容。
func2
返回的是什么?为什么要用它覆盖
str
的旧值?我想这就是问题所在。
str
的原始值已完全初始化,valgrind对此没有任何问题。稍后,当您删除
str
的原始值并用
func2
返回的一些垃圾替换它时,问题就开始了。发布
func2
的完整代码。这不太可能。Valgrind不关心代码中是否有任何检查,因为它根本不分析代码。事实上,它只报告在特定运行中的运行时发生的事件(如未初始化的数据使用、null/挂起指针引用等)。如果valgrind抱怨使用了未初始化的值,检查此类错误应该可以防止这种情况发生,从而(间接地)解决问题。。。。除了不能在C中检查未初始化的数据外,如果它是null解引用,valgrind会这么说;它报告未初始化数据的事实表明错误在别处。