Доброго времени суток!
Не подскажет ли кто причину появления следующего вида
ругательств:
----------------------
$ valgrind --tool=memcheck ./chk-compr <TestInput >TestOutput
==1734== Memcheck, a memory error detector for x86-linux.
==1734== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==1734== Using valgrind-2.2.0, a program supervision framework for x86-linux.
==1734== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==1734== For more details, rerun with: -v
==1734==
==1734== Use of uninitialised value of size 4
==1734== at 0x80489B2: get_match (compr.c:21)
==1734== by 0x804876B: easy_compress (compr.c:86)
==1734== by 0x8048B0E: main (compr.c:124)
==1734==
==1734== Use of uninitialised value of size 4
==1734== at 0x80489C7: get_match (compr.c:22)
==1734== by 0x804876B: easy_compress (compr.c:86)
==1734== by 0x8048B0E: main (compr.c:124)
==1734==
...
----------------------
при применении valgrind'а к приведённой в конце программе?
Вероятно, у меня в голове короткое замыкание, однако сколько
я код ни смотрел, никаких признаков использования
неинициализированных значений обнаружить не сумел.
Заранее спасибо.
Код программы:
#include <stdio.h>
#include <assert.h>
#define FLAG_COPY 0x80
#define FLAG_COMPRESS 0x40
typedef unsigned char byte_t;
static inline byte_t
get_match(const byte_t *source, unsigned short ptr,
unsigned short source_size,
short hash[], unsigned short *size, short *pos)
{
unsigned short hash_value = (unsigned short)
(4095U & (40543L * (unsigned long)
((((source [ptr] << 4) ^ source [ptr + 1]) << 4) ^
source [ptr + 2]) >> 4));
*pos = hash [hash_value];
hash [hash_value] = ptr;
if ( (*pos != -1) && ((unsigned short)(ptr - *pos) < 4096U) ) {
for (*size = 0;; (*size)++)
if ((*size >= 18)
|| ((unsigned short) (ptr + *size) >= source_size)
|| (source [ptr + *size] != source [*pos + *size]))
break;
return (byte_t) (*size >= 3);
}
return 0;
}
static unsigned short easy_compress(void* srcA, unsigned short len, void* dstA)
{
short Hash [4096];
short SymbolAddress;
unsigned short Key;
unsigned short Size;
byte_t Bit = 0;
unsigned short Command = 0;
unsigned short src_index = 0;
unsigned short dst_size = 3;
unsigned short HeaderIndex = 1;
byte_t* src = (byte_t*)srcA;
byte_t* dst = (byte_t*)dstA;
assert ( src!=NULL && dst!=NULL );
dst [0] = FLAG_COMPRESS;
for (Key = 0; Key < 4096; Key++)
Hash [Key] = -1;
while ((src_index < len) && (dst_size <= len)) {
if (Bit > 15) {
dst [HeaderIndex] = (byte_t) ((Command >> 8) & 0x00ff);
dst [HeaderIndex + 1] = (byte_t) ( Command & 0x00ff);
HeaderIndex = dst_size;
dst_size += 2;
Bit = 0;
}
for (Size = 1;; Size++) {
if ((unsigned short) (src_index + Size) >= len
|| (src [src_index] != src [src_index + Size])
|| (Size >= 0x0fff))
break;
}
if (Size >= 16) {
dst [dst_size++] = 0;
dst [dst_size++] = (byte_t) (((unsigned short) (Size - 16) >> 8) & 0x00ff);
dst [dst_size++] = (byte_t) ((Size - 16) & 0x00ff);
dst [dst_size++] = src [src_index];
src_index += Size;
Command = (Command << 1) + 1;
} else {
if (get_match (src, src_index, len,
Hash, &Size, &SymbolAddress) != 0) {
Key = ((src_index - SymbolAddress) << 4) + (Size - 3);
dst [dst_size++] = (byte_t) ((Key >> 8) & 0x00ff);
dst [dst_size++] = (byte_t) (Key & 0x00ff);
src_index += Size;
Command = (Command << 1) + 1;
} else {
dst [dst_size++] = src [src_index++];
Command = (Command << 1);
}
}
Bit++;
}
Command <<= (16 - Bit);
dst [HeaderIndex] = (byte_t) ((Command >> 8) & 0x00ff);
dst [HeaderIndex + 1] = (byte_t) ( Command & 0x00ff);
if (dst_size > len) {
for (dst_size = 0; dst_size < len; dst_size++)
dst [dst_size + 1] = src [dst_size];
dst [0] = FLAG_COPY;
return (len + 1);
}
return dst_size;
}
int main()
{
char inBuf[32768], outBuf[36864];
while ( !feof(stdin) && !ferror(stdin) ) {
size_t rb = fread(inBuf, 1, sizeof(inBuf), stdin);
if ( rb > 0 ) {
unsigned short clen = easy_compress(inBuf, rb, outBuf);
char clen_bytes[2] = { clen & 0xFF, clen >> 8 };
fwrite(clen_bytes, 2, 1, stdout);
fwrite(outBuf, clen, 1, stdout);
}
}
return 0;
}