- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个调用 getline()
的函数,它从标准文本文件中读取行。这些行以 \r\n
结尾,因为这是规范所要求的,因为它是 VCARD 文件的“互联网标准”。
无论如何,我在 OpenSUSE 11.3 上使用最新的 GCC 和 Valgrind 版本通过 Valgrind 运行这个宝贝;没有错误。但是,由于与此问题无关的原因,我将发行版切换到 Back Track 4(基于 Ubuntu),现在我收到了一大堆 Valgrind 错误:
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x40164A1: (within /lib/ld-2.11.1.so)
==21536== by 0x4007C04: (within /lib/ld-2.11.1.so)
==21536== by 0x4002A2C: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x40164AC: (within /lib/ld-2.11.1.so)
==21536== by 0x4007C04: (within /lib/ld-2.11.1.so)
==21536== by 0x4002A2C: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
--21536-- Warning: DWARF2 CFI reader: unhandled DW_OP_ opcode 0x55
--21536-- Warning: DWARF2 CFI reader: unhandled DW_OP_ opcode 0x55
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
--21536-- DWARF2 CFI reader: unhandled CFI instruction 0:10
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400B217: (within /lib/ld-2.11.1.so)
==21536== by 0x40031D0: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400AF0F: (within /lib/ld-2.11.1.so)
==21536== by 0x40031D0: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400B27A: (within /lib/ld-2.11.1.so)
==21536== by 0x40031D0: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400A5DE: (within /lib/ld-2.11.1.so)
==21536== by 0x40030FE: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400A5E6: (within /lib/ld-2.11.1.so)
==21536== by 0x40030FE: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x400AF0F: (within /lib/ld-2.11.1.so)
==21536== by 0x40030FE: (within /lib/ld-2.11.1.so)
==21536== by 0x4014206: (within /lib/ld-2.11.1.so)
==21536== by 0x4000C6C: (within /lib/ld-2.11.1.so)
==21536== by 0x4000856: (within /lib/ld-2.11.1.so)
==21536==
==21536== Invalid read of size 8
==21536== at 0x40B4785: (within /lib/tls/i686/cmov/libc-2.11.1.so)
==21536== by 0x8049EFB: main (vcutil.c:496)
==21536== Address 0x419d1b0 is 8 bytes before a block of size 120 alloc'd
==21536== at 0x4025D2E: malloc (vg_replace_malloc.c:207)
==21536== by 0x409DF9D: getdelim (in /lib/tls/i686/cmov/libc-2.11.1.so)
==21536== by 0x408F3A2: getline (in /lib/tls/i686/cmov/libc-2.11.1.so)
==21536== by 0x804947C: getUnfolded (vcutil.c:299)
==21536== by 0x8049EFB: main (vcutil.c:496)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x40B47AD: (within /lib/tls/i686/cmov/libc-2.11.1.so)
==21536== by 0x8049EFB: main (vcutil.c:496)
==21536==
==21536== Conditional jump or move depends on uninitialised value(s)
==21536== at 0x8049524: getUnfolded (vcutil.c:307)
==21536== by 0x8049EFB: main (vcutil.c:496)
我特别不知道这些行指的是什么
--21536-- Warning: DWARF2 CFI reader: unhandled DW_OP_ opcode 0x55
意思是。这些是我更改发行版后的新内容。
无论如何,作为引用,这里是我的函数:
VcStatus getUnfolded (FILE *const vcf, char **const buff) {
//int const buffSize = 30;
size_t lineSize = 0;
int done = 0; //Set to one if the next line checked does not entail unfolding
static char* queue = NULL; //A queue to store the next line read in
static int lineNum = 0;
char* buffer = NULL; //The dynamic memory that will be linked to buf
int valid_line = 0; //Set to one if the line contains characters other then whitespace
char* temp; //Used to point to the location of \r\n in the buffer
VcStatus error; //Initialize VcStatus with appropriate values
error.code = OK;
error.linefrom = lineNum;
error.lineto = 0;
//Special case for resetting getUnfolded()
if (vcf == NULL){
lineNum = 0;
if (queue != NULL) queue = NULL;
error.linefrom = 0;
error.lineto = 0;
return error;
}
//Copies any string contained in queue from last time into buffer
if (queue != NULL) {
buffer = malloc (strlen (queue)+1);
strcpy (buffer, queue);
strcpy (queue, "");
}
//If the end of file has been reached, last line is returned.
if (feof (vcf) != 0) {
queue = NULL;
lineNum += 1;
if (buffer != NULL) {
if (strcmp (buffer, "") != 0)*buff = buffer;
}
else *buff = NULL;
return error;
}
while (done == 0) {
//Gets a new line from the vcf file, and returns null if there is no more data to be returned
getline (&queue, &lineSize, vcf);
if (ferror(vcf) != 0) {
error.code = IOERR;
return error;
}
//Sets valid_line to 1 if the line read in contains any characters other then whitespace
for (int i = 0; i < strlen (queue); i++){
if (queue[i] != '\r' && queue[i] != '\n' && queue[i] != ' ' && queue[i] != '\t') valid_line = 1;
}
if (feof (vcf) && valid_line == 0) {
queue = NULL;
break;
}
if (valid_line == 1){
//Finds the 'internet standard' newline and replaces it with a null terminator
temp = strstr (queue, "\r\n");
if (temp != NULL) strcpy (temp, "\0");
//Sets the buffer equal to contents of queue and resets queue if buffer is empty
if (buffer == NULL) {
buffer = malloc (strlen (queue)+1);
lineNum = lineNum + 1;
strcpy (buffer, queue);
strcpy (queue, "");
//Checks for leading whitespace to indicate a folded line, and unfolds
}else if (queue [0] == ' ' || queue [0] == '\t') {
lineNum = lineNum + 1;
buffer = realloc (buffer, strlen (buffer)+strlen (queue)+2);
strcat (buffer, queue+1);
strcpy (queue, "");
//If both conditions above are false, buffer contains the next valid line
}else{
error.lineto = lineNum;
lineNum += 1;
done = 1;
}
}
}
*buff = buffer;
return error;
}
...以及向其发送测试数据的虚拟函数:
int main () {
FILE* fp = fopen ("test.vcf", "r");
char * buff;
getUnfolded (fp, &buff);
}
test.vcf文件真的只是一个简单的文本文件
任何帮助都会很棒。
最佳答案
您使用的 valgrind 版本已过时,因此它不会抑制正确的输出。这些错误在 suse 上仍然存在,它们只是被抑制了,因为它们在系统代码中。
您需要手动安装最新版本的valgrind
这是我用的论坛帖子
关于c - Valgrind 使用 getline() 给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086399/
我希望 valgrind 在发现第一个错误时停止并退出。 请勿推荐 --vgdb-error=1 :它不会退出 valgrind。您必须连接 gdb 并从那里终止。 --db-attach : 在最近
有人可以快速解释 Valgrind 的工作原理吗?一个例子:它如何知道内存何时被分配和释放? 最佳答案 Valgrind 基本上在“沙箱”中运行您的应用程序。在此沙箱中运行时,它能够插入自己的指令来进
我有一个因 SIGSEGV 而崩溃的应用程序。 --20183-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) -
我有一个因 SIGSEGV 而崩溃的应用程序。 --20183-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) -
我想使用 valgrind 检查长时间运行的进程是否存在内存泄漏。我怀疑我所追求的内存泄漏可能仅在执行几个小时后才会发生。我可以在 valgrind 下运行应用程序并获取 valgrind 日志,但这
我想用 valgrind 检查一个长时间运行的进程是否有内存泄漏。我怀疑我所追求的内存泄漏可能仅在执行数小时后才会发生。我可以在 valgrind 下运行应用程序并获得 valgrind 日志,但这样
如何在不通过 valgrind 命令选项启动它的情况下对每个 Process 实例执行 valgrind memcheck。 有没有办法将监控选项保存在进程中,而不是每次都使用 valgrind 命令
我使用了“--trace-children=yes”选项,我还使用了“--trace-children-skip=patt1,patt2,...”选项(过滤掉噪音过程)。但它对我来说仍然很慢,我的多进
我从 Valgrind 得到以下日志: MPK ==5263== 4 bytes in 1 blocks are still reachable in loss record 1 of 84 ==52
如何在 Valgrind 抑制文件中添加注释? 我需要为一个大型项目维护一个 Valgrind 抑制文件。我们从我们链接到的工具中过滤无法修复的错误。随着工具的新版本发布,此文件可能需要随着时间的推移
我有一个大程序要运行。使用 valgrind 需要几个小时才能运行。我听说有一些东西可以让我们为程序中的特定函数调用 valgrind。其余程序将正常执行(没有 valgrind env)。 任何人都
我可以用 valgrind 检测整数溢出缺陷吗?里面的哪个工具可以做到这一点? 最佳答案 Valgrind 没有可以检测整数溢出的工具。 您可能会使用 gcc 选项捕获这些错误: -ftrapv Th
我有一个简单的程序: int main(void) { const char sname[]="xxx"; sem_t *pSemaphor; if ((pSemaphor = sem_o
如何让 Valgrind 准确显示错误发生的位置?我编译了我的程序(通过 PuTTy 在 Windows 机器上通过 Linux 终端)添加了 -g 调试选项。 当我运行 Valgrind 时,我得到
或者最好是全部,而不仅仅是我的代码?我的程序使用 Gtk、Loudmouth 和其他一些东西,而这两个(以及它们背后的一些,libgcrypto、libssl)本身导致了如此多的错误,以至于我无法检测
我想尝试使用 valgrind 进行一些堆损坏检测。通过以下腐败“单元测试”: #include #include #include int main() { char * c = (ch
我看过类似的问题here ,但我的问题是我没有编辑 default.supp 文件的权限。例如,Valgrind 中是否有任何忽略所有抑制文件的命令行选项? 最佳答案 在 Valgrind 3.10.
我在一个运行无限循环的程序上使用 valgrind。 由于memcheck在程序结束后显示内存泄漏,但由于我的程序有无限循环,它永远不会结束。 那么有什么方法可以强制从 valgrind 时不时地转储
我一直在尝试使用 valgrind 查找一些可疑的内存错误。 在被分析的程序甚至到达我希望分析的点之前,它会因为对 mmap 的调用开始失败而退出。当它不在 valgrind 下时,这些调用会成功。
由于 OpenSSL 使用未初始化的内存,因此对使用 openldap2 的 libldap 的程序进行 Valgrind 是一件苦差事。存在一个 --ignore-fn选项,但仅适用于 Valgri
我是一名优秀的程序员,十分优秀!