c - gsoap/valgrind;没有泄漏,但内存错误

标签 c valgrind gsoap

我正在使用 gSoap 编写 Web 服务客户端并使用 Valgrind 检查内存问题。

Valgrind 报告没有泄漏,但显示了这个奇怪的(至少对我而言)内存错误消息:

==3529== Conditional jump or move depends on uninitialised value(s)
==3529==    at 0x405D6DC: soap_reference (stdsoap2.c:6926)
==3529==    by 0x405305D: soap_serialize_string (sepomexC.c:4982)
==3529==    by 0x404AF5E: soap_serialize_ns1__asentamientosPorCodigoPostalRqType (sepomexC.c:2629)
==3529==    by 0x40500F3: soap_serialize_PointerTons1__asentamientosPorCodigoPostalRqType (sepomexC.c:4103)
==3529==    by 0x4046666: soap_serialize___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1233)
==3529==    by 0x4053A7D: soap_call___sep__consultarAsentamientosPorCodigoPostal (sepomexClient.c:186)
==3529==    by 0x40417CA: consultarAsentamientosPorCodigoPostal (main.c:73)
==3529==    by 0x804870C: main (sepomexmain.c:31)
==3529== 
==3529== Conditional jump or move depends on uninitialised value(s)
==3529==    at 0x4061AA5: soap_element_id (stdsoap2.c:9583)
==3529==    by 0x4068B0C: soap_outstring (stdsoap2.c:12681)
==3529==    by 0x4052DAE: soap_out_xsd__integer (sepomexC.c:4918)
==3529==    by 0x404B062: soap_out_ns1__asentamientosPorCodigoPostalRqType (sepomexC.c:2643)
==3529==    by 0x4050179: soap_out_PointerTons1__asentamientosPorCodigoPostalRqType (sepomexC.c:4111)
==3529==    by 0x4046698: soap_out___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1238)
==3529==    by 0x4046818: soap_put___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1274)
==3529==    by 0x4053AF6: soap_call___sep__consultarAsentamientosPorCodigoPostal (sepomexClient.c:193)
==3529==    by 0x40417CA: consultarAsentamientosPorCodigoPostal (main.c:73)
==3529==    by 0x804870C: main (sepomexmain.c:31)

==3529== 
==3529== HEAP SUMMARY:
==3529==     in use at exit: 0 bytes in 0 blocks
==3529==   total heap usage: 160 allocs, 160 frees, 16,161 bytes allocated
==3529== 
==3529== All heap blocks were freed -- no leaks are possible
==3529== 
==3529== For counts of detected and suppressed errors, rerun with: -v
==3529== Use --track-origins=yes to see where uninitialised values come from
==3529== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 21 from 8)

没有泄漏是个好消息,但是这些错误重要吗?据我了解,它们是在 stdsoap2.c(一个 gSoap 文件)中生成的。

谢谢。

编辑:感谢您的回答。正如你们中的一些人告诉我的,我有未初始化的东西,这是我的请求结构变量。我是这样修复的:

struct ns1__myRequestType request;
memset(&request, 0, sizeof(struct ns1__myRequestType));

现在 Valgrind 的输出是“干净的”:) 非常感谢。

最佳答案

它基本上是指根据未初始化的变量进行一些分支。它们可以简单地是库函数范围内的自动变量,分配在堆栈上,并且在用于 ifwhileswitch,或其他形式的分支表达式。一般来说,这不是一件好事,因为它可能导致未定义的行为,但如果错误是库内部的,则编写者可能正在执行某种类型的假定内存覆盖操作等。它们非正式地“初始化”,而不是在标准 C 语法中显式初始化。另一种可能性是您还可以将指向未初始化变量的指针传递给其中一个库函数,这将是糟糕的编程形式,并可能产生不可预测的结果或安全风险。

关于c - gsoap/valgrind;没有泄漏,但内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206090/

相关文章:

c - 在 C 中从文件中读取时向前看一个字符

c - getpgid 未使用 valgrind 实现

c++ - 将 float vector 转换为十六进制/二进制字符串

c++ - gSOAP 多线程

gsoap 错误 : SOAP-ENV:Client [no subcode]

c - 使用时钟循环链表的问题

c - 指向宏中类型的指针,C

c++ - firebreath npplugin 中的文件写入权限被拒绝

c - 内存泄漏释放 g_strdup

c++ - Valgrind 输出和 rdtsc 不一致......为什么会这样?