The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"valgrind'ово загадочное ругательство"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"valgrind'ово загадочное ругательство" 
Сообщение от Dead Mustdie emailИскать по авторуВ закладки on 18-Янв-05, 10:24  (MSK)
Доброго времени суток!

Не подскажет ли кто причину появления следующего вида
ругательств:

----------------------
$ 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;
}

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "valgrind'ово загадочное ругательство" 
Сообщение от Dead Mustdie emailИскать по авторуВ закладки on 20-Янв-05, 13:36  (MSK)
Молчание было ему ответом. Спасибо.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "valgrind'ово загадочное ругательство" 
Сообщение от Arifolth emailИскать по авторуВ закладки(ok) on 28-Янв-05, 13:48  (MSK)
>Вероятно, у меня в голове короткое замыкание, однако сколько
>я код ни смотрел, никаких признаков использования
>неинициализированных значений обнаружить не сумел.
>
>Заранее спасибо.
>
>
>Код программы:
>

а вообще ведь даже строки указанны

в easy_compress есть одна явно злостно неинициализированная (стр 86)
стр 124 - clen
стр 22 ну хz чё не так


>#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;

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) {

использование ссылки на неинициализированную переменную SymbolAddress

>        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++;
>
>  }

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "valgrind'ово загадочное ругательство" 
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 28-Янв-05, 20:07  (MSK)
>а вообще ведь даже строки указанны

Строки-то указаны, да только при попытке понять, чего там такое
не  инициализированное используется только и остаётся заявить - xz :(

>в easy_compress есть одна явно злостно неинициализированная (стр 86)
>стр 124 - clen
>стр 22 ну хz чё не так

Насчёт clen не понял. Она вообще-то в main() используется, и
инициализируется аж при объявлении. Насчёт стр.22 - согласен ;)

>
>>  short Hash [4096];
>>  short SymbolAddress;
>
>SymbolAddress - не инициализирована
>

В данной точке - нет, значение ей присваивается при вызове функции
get_match(), и в случае успешного поиска по хеш-таблице оно
после оного вызова используется используется.

>>
>>      if (get_match (src, src_index, len,
>>            
>>         Hash, &Size,
>>&SymbolAddress) != 0) {
>
>использование ссылки на неинициализированную переменную SymbolAddress
>

Хм, само по себе взятие адреса неинициализированной переменной и передача
его куда-то не есть криминал, и valgrind в данном отношении со мной
согласен. Поскольку первоначальное значение SymbolAddress в get_match()
не используется, сие не есть источник проблеммы :)

>ещё

В этот  момент значение в SymbolAddress уже заведомо есть - см. код
функции get_match(), агрумент pos.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру