У меня есть функция, которая вызывает getline()
, которая читает строки из стандартного текстового файла.Эти строки заканчиваются на \r\n
, так как это то, к чему призывает спецификация, так как это «интернет-стандарт» для файлов VCARD.
В любом случае, я запускаю этого ребенка через Valgrind на OpenSUSE 11.3 с последними версиями GCC и 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 на самом деле представляет собой простой текстовый файл
Любая помощь будет удивительной.