Valgrind giving errors with getline()
I have a function which calls getline()
, which reads lines from a standard text file. These lines开发者_运维技巧 end in \r\n
, as this is what the spec calls for as it is the "internet standard" for VCARD files.
Anyway, I run this baby through Valgrind on OpenSUSE 11.3 with the latest GCC and Valgrind versions; no errors. However, for reasons of no relevance to this problem, I switched distros to Back Track 4 (Ubuntu based), and now I am getting a metric ton of Valgrind errors:
==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)
I especially don't know what the lines refering to
--21536-- Warning: DWARF2 CFI reader: unhandled DW_OP_ opcode 0x55
mean. These are new since I changed distros.
Anyway, for reference, here is my function in question:
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;
}
...And the dummy function to send test data to it:
int main () {
FILE* fp = fopen ("test.vcf", "r");
char * buff;
getUnfolded (fp, &buff);
}
The test.vcf file is just a simple text file really
Any help would be amazing.
The version of valgrind you are using is outdated and so it is not suppressing the correct output. Those errors are still there on suse they are just suppressed because they are in system code.
You need to manually install the newest version of valgrind
This is the forum post I used
http://ubuntuforums.org/showthread.php?t=1608001
精彩评论