[Dune] [#491] PoolAllocator not 64 bit clean

Dune dune at dune-project.org
Mon Feb 2 13:20:34 CET 2009


THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.

A new Flyspray task has been opened.  Details are below. 

User who did this - Markus Blatt (mblatt) 

Attached to Project - Dune
Summary - PoolAllocator not 64 bit clean
Task Type - Bug Report
Category - Common
Status - New
Assigned To - Markus Blatt
Operating System - Linux 64bit
Severity - Medium
Priority - Normal
Reported Version - SVN
Due in Version - Undecided
Due Date - Undecided
Details - If the SLList ist used with the poolallocator in sllistest it fails:

When using std::allocator the test works fine.

Quoting from Elias mail:

ich bin mittlerweile auf (64bit-) Gentoo Linux mit gcc 4.3.3 unterwegs
und in dune-common auf einen Test Fehler gestossen. Weil es sich um
sllisttest handelt, und offenbar nie jemand ausser dir daran Hand
angelegt hat, wende ich mich direkt an dich.

Der Fehler lautet

test insert
sllisttest: ../../dune/common/sllist.hh:690: void Dune::SLList<T,
A>::insertAfter(Dune::SLList<T, A>::Element*, const T&) [with T = int, A
= Dune::PoolAllocator<int, 8176ul>]: Assertion `!tail_->next_' failed.
Aborted

Ich hab versucht, das Problem zu finden, bislang aber ohne Erfolg. Der
Fehler liegt offenbar in den Zeilen

  iter=alist.beginModify();
  iter.insert(5);

also sllisttest.cc:274. Mein Hauptproblem ist (ich hab zuvor nur C-,
nicht aber C++-Code mit GDB durchforstet), dass es (wegen inlining?)
mir nicht moeglich ist, lokale Variablen in Methoden auszugeben (im
Gegensatz zu Membervariablen -- ohne die waer ich nichteinmal bis hier
gekommen). CXXFLAGS='-O0 -g3 -fno-inline' hat nicht geholfen.

Zu diesem Zweck hab ich mir ein GDB Macro geschrieben

define dune-print-sllist
 set $size = $arg0.size_
 set $i = $size
 set $head_ptr = &$arg0.beforeHead_
 # look out for at most 5 trailing elements, avoids infinite loops
 # but lets us look further than the specified size
 while $head_ptr != 0 && $i > -5
  if $i == -1
    printf "warning, trailing elementsn"
  end
  print $head_ptr->item_
  set $head_ptr = $head_ptr->next_
  set $i--
 end
end

document dune-print-sllist
  print the given Dune::SLList element-wise
end

das ich mittels

define hook-stop
  dune-print-sllist alist
end

nach jedem "next" laufen lasse. Das laesst die Aussage zu, dass

  alist.push_back(3)

und

  iter.insert(7)

genau tun, was sie sollen. Danach sieht die Aussage von
dune-print-sllist wie folgt aus:

 $316 = 0
 $317 = 7
 $318 = 3

(dafuer, dass ich beforeHead_.item_ mit ausgebe, gibt es keinen
besonderen Grund).

Etwas schief geht nun in

  inline void SLList<T,A>::insertAfter(Element* current, const T& item)

wo nach den Zeilen

    // Allocate space
    current->next_ = allocator_.allocate(1, 0);

    // Use copy constructor to initialize memory
    ::new(static_cast<void*>(&(current->next_->item_))) T(item);

die 7 verschwunden ist:

  $319 = 0
  $320 = 3

dann wieder auftaucht

  (gdb) next
  $321 = 0
  $322 = 3
  $323 = 7
  warning, trailing elements
  $324 = 3
  $325 = 7
  $326 = 3
  $327 = 7

und die 3 schliesslich durch die 5 *ersetzt* wird:

  (gdb)
  $342 = 0
  $343 = 5
  $344 = 7
  warning, trailing elements
  $345 = 5
  $346 = 7
  $347 = 5
  $348 = 7        

Wenige Zeilen weiter unten fliegt dann

  assert(!tail_->next_);

wegen

  (gdb) print alist.tail_.item_
  $476 = 5
  (gdb) print alist.tail_.next_->item_
  $477 = 7



More information can be found at the following URL:
http://www.dune-project.org/flyspray/index.php?do=details&task_id=491

You are receiving this message because you have requested it from the Flyspray bugtracking system.  If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.




More information about the Dune mailing list