
This file contains a detailed log of bugs fixed in the stable (1.0.X)
branch, so you can see the changes from version to version.  Also see
the end of this file, which has a list of the bugs known in, but not
fixed in, the current release.


Release 1.0.4 (14 Oct 02)
~~~~~~~~~~~~~~~~~~~~~~~~~
1.0.4 adds support for Red Hat 8, and improves support for code
compiled with gcc-3.1 and above.  Really this is the first valgrind
which works reasonably well for systems built with gcc-3.1 and above.

- Support for Red Hat 8.  Mostly this means changes to the thread
  support to make thread-local locales work.

- Fix a serious bug in the DWARF2 debug information reader.  DWARF2 is
  the debug info format used by gcc-3.1 and above.  The bug caused
  approximately one third of all addresses to not get mapped to any
  source location, so this fix should make a big difference.

- Better handling of inlined strlen() et al with gcc-3.1 and above.
  Versions of valgrind prior to 1.0.4 tended to falsely report 
  uninitialised value errors in some inlined strlen() functions
  created with recent gcc's.  1.0.4 includes a fix for this.  The
  --avoid-strlen-errors= flag controls the fix; it is enabled by
  default.

- Valgrind now makes use of information from ELF dynamic symbol
  tables.  This means it can often find function names even in ELF
  .so's which have been stripped.

- The longstanding link-errors caused by missing
  __pthread_clock_settime / __pthread_clock_gettime have been fixed, I
  hope.  These problems particularly afflicted Red Hat 7.3 users for
  some reason.

- Fixed a nasty bug in which valgrind's calloc() was ignoring
  alignment requests made with the --alignment= flag.

- Added an FAQ.txt to the source distribution, to help people work
  around commonly encountered problems.

- Added the flag --weird-hacks=lax-ioctls.  This selects more relaxed
  checking of ioctl() arguments, which is useful if you're dealing
  with ioctls which valgrind knows nothing about and are getting a lot
  of errors as a result.

- Catch uses of __select() and __poll() and treat them as select() and
  poll().

- Implement (sort-of) pthread_attr_{set,get}guardsize.

- Implement sem_timedwait().

- Implement primary opcode 0x1A (SBB Eb,Gb).

- Add a small army of new syscalls:
     setxattr lsetxattr fsetxattr getxattr fgetxattr listxattr 
     llistxattr flistxattr removexattr lremovexattr fremovexattr 
  and ioctls:
     SNDCTL_DSP_POST SNDCTL_DSP_RESET SNDCTL_DSP_SYNC
     SNDCTL_DSP_SETSYNCRO SNDCTL_DSP_SETDUPLEX

- Minor documentation updates.



Release 1.0.3 (18 Sept 02)
~~~~~~~~~~~~~~~~~~~~~~~~~~
Fairly minor things -- stability fixes and a few new syscalls.
Note that new functionality will appear in development snapshots,
not this stable branch.

- Fix some segfaults apparently caused by the duplicate-error-merging
  machinery.  This is a potentially important stability fix.

- Signal handling fix: pthread_kill would incorrectly deliver a signal
  to a thread even if the thread currently had the signal blocked.
  Fixed.  It _may_ also fix some assertion failures in scheduler_sanity()
  in vg_scheduler.c.

- Signal handling fix: fix stupid bug causing this:
    vg_signals.c:1065 (vgPlain_signal_returns): 
       Assertion `sigNo >= 1 && sigNo <= 64' failed.
  This bug could also have caused arbitrary other weird failures
  in signal handling.

- Add suppressions for SuSE 8.1.  It seems to work OK on 8.1, but
  given that 8.1 is based on gcc-3.2, use of Valgrind on this
  platform is not recommended -- you still get a lot of spurious
  uninit-value warnings.  This may get fixed in later versions.

- improvements to valgrind.spec.in, of interest to RPM builders

- cachesim: fix cache auto-detection on Pentium 4s

- valgrind: fix longstanding bug in handling of 108 byte
  FPU loads/stores (FSAVE/FRSTOR)

- Reduce polling delays in poll(), select(), pause() and in the
  scheduler idle loop.  This reduces some strange non-CPU-bound delays
  under certain circumstances.

- Give correct return code ("success!") if client tries to close
  the file descriptor Valgrind is using for error logging
  (we tell it "success", which is a lie, and ignore the close request)

- Implement primary opcode 0x15 (ADC Iv, eAX)

- Merge invalid-addressing errors more aggressively.

- Implement syscalls: __NR_setresgid, __NR_ptrace, __NR_mount, __NR_umount.
  You can now use valgrind to debug GDB!  Bwaha!

- Increase number of reader/writer locks supported from 50 to 500.



Release 1.0.2 (6 Sept 02)
~~~~~~~~~~~~~~~~~~~~~~~~~
The main emphasis of 1.0.2 is to fix stability problems in the cache
profiler (cachegrind).  We now believe to be as stable as valgrind
itself, so that if a program runs on valgrind it should also run on
cachegrind.  Hopefully this will mean that 1.0.2 is a more stable base
for Josef Weidendorfer's kcachegrind visualisation tool and call-graph
patch.  Specific fixes are:

- Fix this: valgrind: vg_cachesim.c:389 (get_BBCC): 
  Assertion `((Bool)0) == remove' failed.
  which happened when cachegrind discards translations.

- Do not abort execution if cache simulating entire trees of processes
  causes conflicts over the logfile cachegrind.out.  This will be
  fixed properly in future stable branches; this fix is a bit of a
  kludge -- creation of cachegrind.out is skipped if opening it 
  for writing results in an error.

- cachesim: handle FPU insns with 28 and 108 byte data sizes
  (fsave, frestore, fstenv, fldenv).  Pretends they are 16 byte
  transactions -- a bit of a hack but these should be rare.

- Improve accuracy of cache simulation for REP-prefix instructions.
  They are now modelled as a single I-cache transaction for the whole
  thing, regardless of the number of repeats.  This seems a plausible
  model for what most contemporary CPUs do.

- Implement primary opcode 0x10 (ADC Gb,Eb).

- Fix bug causing incorrect warning:
  valgrind's libpthread.so: libc_internal_tsd_get: dubious key 2

- valgrind's strcmp() implementation (to clients) treated char as
  signed whereas the libc implementation it replaces treats char as
  unsigned.  Fixed!  God knows how anything much ever worked before
  now.

- Implement ioctl TIOCLINUX.

- Include %defattr(-,root,root) in valgrind.spec.in so that the
  ownership of the files is correct even if a non-root user builds the
  RPM package.


Release 1.0.1 (27 August 02)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Thank you to the hundreds of people who sent feedback, patches and/or
bug reports for version 1.0.0.  I have fixed the following bugs
(somewhat over half the total reported):

- A bug in handling resolver (DNS-lookup) state in threaded programs,
  which caused name-to-IP-addr lookups to fail in some circumstances.

- Add support for C++ ABI for gccs > 3.1.

- Implement pthread_attr_getdetachstate.

- Fix bug causing exit status of programs to be incorrect when
  running under valgrind.  Following this fix,
     <prog> ; echo $?     and
     valgrind <prog> ; echo $?
  should give identical results.

- Handle 0xD2 primary opcode (shift-Grp2 Eb, CL).  This fixes
  some aborts when running GNU Ada programs:
    disInstr: unhandled opcode 0xD2 then 0xE0

- Handle primary opcode 0x15 (ADC Iv, eAX).  This fixes:
    disInstr: unhandled opcode 0x15 then 0x0

- Handle missing FPU operations:
    FSTSW  m32
    FSAVE  m32
    FRSTOR m32

- Handle syscall __NR_iopl (change I/O privilege level).  I suspect
  this is pretty useless unless the x86 IN/OUT insns are also
  implemented, but hey.

- Handle syscall __NR_vhangup.

- Cache simulator: add workaround for identifying cache params of
  Duron stepping A0 which has a bug that causes CPUID to misreport L2
  cache size.

- Non-user-visible: Fix a bunch of bogus boundary checks of the form
   if (n < lower_limit && n > upper_limit) {
      /* error case */
   }

- Possibly-user-visible: fix buggy internal implementation of strncpy().
  This may or may not fix some strange behaviour in the C++3 demangler.

- Handle startup stacks starting at 0xE0000000.

- Fix various documentation bugs.

- For threaded programs: Give a binding for vfork() -- just behave
  like fork().  I hope this is OK.

- Fix the following:
    vg_libpthread.c:1050 (__my_pthread_testcancel): 
    Assertion `res == 0' failed.
  which happened when running a threaded program linked with -pg.

- Print a more helpful set of messages when we've run out of memory.

- Change the license for valgrind.h ONLY to a BSD-style license.
  The entire rest of the system stays GPL'd.

- Add this file!


Bugs known but not fixed in 1.0.4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The following bugs were reported and are NOT FIXED in 1.0.4,
due to one or more of the following: lack of time, technical
difficulty, or the report is really a feature request, in which case
it will not make it into the 1.0.X branch.  Anyway, for the record:

- Unimplemented _libc_current_sigrt_min for threaded programs.
  (ought to be fixed in the 1.0.X series; any volunteers?)

- Leak reports cannot be suppressed -- will definitely defer 
  beyond 1.0.X.

- modify_ldt syscall and supporting stuff for segment override 
  prefixes.  This is now available in the 1.1.X development series
  but will not appear in the 1.0.X stable line.

- Primary opcodes 0xEC .. 0xEF.  These are the x86 IN/OUT insns.
  Deferred beyond 1.0.X.

- Primary opcode 0xF5 (Complement carry flag insn).

- Request for machine-parseable output (error format).  

- sigcontexts are not passed to signal handlers; the signal
  context structure pointer is always NULL.

- dlclose() / munmap() discards symbols and so leak reports sometimes
  lack location information.  I know how to fix this, but will push
  beyond 1.0.X.

- pthread_{set,get}_concurrency.  Someone send me a patch for
  this, please!

- A few inexplicable segfaults.

- Probably a few more; those are the main ones.

- I'm getting reports of this assertion failure
    valgrind: vg_scheduler.c:2270 (do_pthread_mutex_lock): 
    Assertion `vgPlain_is_valid_tid((ThreadId)mutex->__m_owner)' failed.

  One person reported that ...
    The "bad" thing I did was to use fprintf(stderr) in a child process, 
    right after fork().  The file descriptors stdout and stderr were 
    still open.

  Further info on this would be much appreciated.
