cppcheckによるコード解析

実施日 2009/05/16

  1. $ cppcheck --version
  2. Cppcheck 1.32
  3. $ svn version trunk/
  4. 2825
  5. $ cppcheck --all trunk/ 1 > /dev/null
  6. [trunk/src/dbtree/articlebase.cpp:90]: (error) Using 'memset' on struct that contains a 'std::string'
  7. [trunk/src/dbtree/articlebase.cpp:91]: (error) Using 'memset' on struct that contains a 'std::string'
  8. [trunk/src/dbtree/articlebase.cpp:92]: (error) Using 'memset' on struct that contains a 'std::string'
  9. [trunk/src/dbtree/articlebase.cpp:855]: (error) Using 'memset' on struct that contains a 'std::string'
  10. [trunk/src/dbtree/articlebase.cpp:1441]: (error) Using 'memset' on struct that contains a 'std::string'
  11. [trunk/src/dbtree/articlebase.cpp:1442]: (error) Using 'memset' on struct that contains a 'std::string'
  12. [trunk/src/dbtree/articlebase.cpp:1446]: (error) Using 'memset' on struct that contains a 'std::string'
  13. [trunk/src/dbtree/article2chcompati.h:18]: (error) Class Article2chCompati which is inherited by class ArticleLocal does not have a virtual destructor
  14. [trunk/src/dbtree/boardbase.cpp:67]: (error) Using 'memset' on struct that contains a 'std::string'

なぜか"memset( &tv, 0, sizeof( struct timeval ) )"がCheckMemsetに引っかかる。それを除いて修正。

  1. $ svn version trunk/
  2. 2826
  3. $ cppcheck --all trunk/ 1 > /dev/null
  4. [trunk_/src/dbtree/articlebase.cpp:90]: (error) Using 'memset' on struct that contains a 'std::string'
  5. [trunk_/src/dbtree/articlebase.cpp:91]: (error) Using 'memset' on struct that contains a 'std::string'
  6. [trunk_/src/dbtree/articlebase.cpp:92]: (error) Using 'memset' on struct that contains a 'std::string'
  7. [trunk_/src/dbtree/articlebase.cpp:855]: (error) Using 'memset' on struct that contains a 'std::string'
  8. [trunk_/src/dbtree/articlebase.cpp:1441]: (error) Using 'memset' on struct that contains a 'std::string'
  9. [trunk_/src/dbtree/articlebase.cpp:1442]: (error) Using 'memset' on struct that contains a 'std::string'
  10. [trunk_/src/dbtree/articlebase.cpp:1446]: (error) Using 'memset' on struct that contains a 'std::string'
  11. [trunk_/src/dbtree/boardbase.cpp:67]: (error) Using 'memset' on struct that contains a 'std::string'

gmonによるパフォーマンス解析

gprofによるプロファイリングを行う場合は ./configure --enable-gprof とする
コンパイルオプションに -pg が付き、JDを実行すると gmon.out が出来るので gprof ./jd gmon.out で解析できる。
ただしCPUの最適化は効かなくなるので注意する。
実施日 2010/9/17
実行時間 約70分

model name	: Intel(R) Core(TM)2 CPU         T5500  @ 1.66GHz
MemTotal:       905024 kB

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 11.48      0.38     0.38    15008     0.03     0.03  ARTICLE::DrawAreaBase::set_caret(ARTICLE::CARET_POSITION&, int, int)
  5.74      0.57     0.19   793869     0.00     0.00  ARTICLE::DrawAreaBase::layout_one_text_node(ARTICLE::LAYOUT*, int&, int&, int&, int)
  5.44      0.75     0.18  6538079     0.00     0.00  ARTICLE::get_width_of_char(char const*, int&, char, int&, int&, int)
  5.14      0.92     0.17    29413     0.01     0.01  DBTREE::Root::get_board(std::string const&, int)
  4.83      1.08     0.16  1808866     0.00     0.00  DBTREE::BoardBase::equal(std::string const&)
  3.93      1.21     0.13  6538158     0.00     0.00  ARTICLE::DrawAreaBase::get_width_of_one_char(char const*, int&, char&, bool&, int)
  3.63      1.33     0.12  6541396     0.00     0.00  MISC::utf8toucs2(char const*, int&)
  3.02      1.43     0.10    64402     0.00     0.00  ARTICLE::DrawAreaBase::draw_string(ARTICLE::LAYOUT*, int, int, int, int, int, int)
  2.42      1.51     0.08    45552     0.00     0.00  DBTREE::NodeTreeBase::parse_html(char const*, int, int, bool, bool, bool, bool)
  2.11      1.58     0.07 10880238     0.00     0.00  CONFIG::get_confitem()
  2.11      1.65     0.07    18623     0.00     0.00  DBTREE::NodeTreeBase::check_id_name(int)
  1.81      1.71     0.06      866     0.07     0.07  DBTREE::Root::is_moved(std::string const&, std::string const&, std::string const&, DBTREE::BoardBase**)
  1.51      1.76     0.05  3928077     0.00     0.00  DBTREE::NodeTreeBase::check_anchor(int, char const*, int&, char*, char*, int, DBTREE::ANCINFO*)
  1.51      1.81     0.05   967785     0.00     0.00  BOARD::BoardViewBase::compare_col(int, int, Gtk::TreeRow&, Gtk::TreeRow&)
  1.51      1.86     0.05    10462     0.00     0.00  CORE::Core::set_command(COMMAND_ARGS const&)
  1.51      1.91     0.05                             sigc::internal::slot_call2<sigc::bound_mem_functor2<void, BOARD::BoardViewBase, Gtk::CellRenderer*, Gtk::TreeIter const&>, void, Gtk::CellRenderer*, Gtk::TreeIter const&>::call_it(sigc::internal::slot_rep*, Gtk::CellRenderer* const&, Gtk::TreeIter const&)
  1.21      1.95     0.04   932274     0.00     0.00  SKELETON::View::clock_in_always()
  1.21      1.99     0.04   443213     0.00     0.00  SKELETON::DragTreeView::slot_cell_data(Gtk::CellRenderer*, Gtk::TreeIter const&)
  1.21      2.03     0.04   274674     0.00     0.00  DBTREE::ArticleBase::empty()
  1.21      2.07     0.04    78459     0.00     0.01  ARTICLE::DrawAreaBase::draw_one_node(ARTICLE::LAYOUT*, int, int, int, int)
  1.21      2.11     0.04     2068     0.02     0.41  ARTICLE::DrawAreaBase::exec_draw_screen(int, int)
  1.21      2.15     0.04                             BOARD::BoardViewBase::slot_cell_data(Gtk::CellRenderer*, Gtk::TreeIter const&)
  0.91      2.18     0.03 10442597     0.00     0.00  CONFIG::get_strict_char_width()
  0.91      2.21     0.03  1553532     0.00     0.00  JDLIB::HEAP::heap_alloc(long)
  0.91      2.24     0.03   873815     0.00     0.00  DBTREE::ArticleHash::it_get()
  0.91      2.27     0.03   301239     0.00     0.00  DBTREE::ArticleHash::it_inc()
  0.91      2.30     0.03   102836     0.00     0.00  std::vector<std::string, std::allocator<std::string> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::string const&)
  0.91      2.33     0.03    50461     0.00     0.00  COMMAND_ARGS::~COMMAND_ARGS()
  0.91      2.36     0.03    20624     0.00     0.01  DBTREE::NodeTreeBase::add_one_dat_line(char const*)
  0.91      2.39     0.03     1149     0.03     0.03  DBTREE::Board2chCompati::parse_subject(char const*)
  0.91      2.42     0.03      400     0.07     1.88  ARTICLE::DrawAreaBase::exec_layout_impl(bool, int)
  0.91      2.45     0.03       80     0.38    11.18  DBTREE::BoardBase::receive_finish()
  0.91      2.48     0.03                             BOARD::BoardViewBase::slot_compare_row(Gtk::TreeIter const&, Gtk::TreeIter const&)
  0.60      2.50     0.02  1439514     0.00     0.00  bool Gtk::TreeRow::get_value<bool>(Gtk::TreeModelColumn<bool> const&) const
  0.60      2.52     0.02   520899     0.00     0.00  SKELETON::Admin::get_current_view()
  0.60      2.54     0.02   183551     0.00     0.00  DBTREE::ArticleBase::equal(std::string const&, std::string const&)
  0.60      2.56     0.02    98691     0.00     0.00  ICON::ICON_Manager::get_icon(int)
  0.60      2.58     0.02    94552     0.00     0.00  BOARD::BoardViewBase::update_row_common(Gtk::TreeRow const&)
  0.60      2.60     0.02    94433     0.00     0.00  BOARD::BoardViewBase::prepend_row(DBTREE::ArticleBase*, int)
  0.60      2.62     0.02    36664     0.00     0.00  std::list<sigc::slot_base, std::allocator<sigc::slot_base> >::insert(std::_List_iterator<sigc::slot_base>, sigc::slot_base const&)
  0.60      2.64     0.02    13521     0.00     0.00  DBTREE::decode_char(char const*, int&, char*, int&, bool)
  0.60      2.66     0.02     1947     0.01     0.01  JDLIB::ConfLoader::get_option_str(std::string const&, std::string const&, unsigned int)
  0.30      2.67     0.01  3912861     0.00     0.00  MISC::is_url_scheme(char const*, int*)
  0.30      2.68     0.01  3911367     0.00     0.00  DBTREE::NodeTreeBase::check_link(char const*, int, int&, char*, int)
  0.30      2.69     0.01  1112724     0.00     0.00  int Gtk::TreeRow::get_value<int>(Gtk::TreeModelColumn<int> const&) const
  0.30      2.70     0.01   521995     0.00     0.00  SKELETON::DragableNoteBook::get_current_page()
  0.30      2.71     0.01   477201     0.00     0.00  void Gtk::TreeRow::set_value<Glib::ustring>(Gtk::TreeModelColumn<Glib::ustring> const&, Glib::ustring const&) const
  0.30      2.72     0.01   466585     0.00     0.00  Glib::PropertyProxy<bool>::set_value(bool const&)
  0.30      2.73     0.01   371391     0.00     0.00  SKELETON::PaneControl::clock_in()
  0.30      2.74     0.01   303024     0.00     0.00  DBTREE::ArticleHashIterator::operator!=(unsigned int)
  0.30      2.75     0.01   294920     0.00     0.00  ARTICLE::DrawAreaBase::is_pointer_on_rect(ARTICLE::RECTANGLE const*, char const*, int, int, int, int, int&, int&, int&, int&)
  0.30      2.76     0.01   244916     0.00     0.00  ARTICLE::ArticleViewBase::is_popup_shown() const
  0.30      2.77     0.01   140727     0.00     0.00  ARTICLE::DrawAreaBase::clock_in_smooth_scroll()
  0.30      2.78     0.01   138807     0.00     0.00  CORE::Css_Manager::set_size(CORE::CSS_PROPERTY*, double)
  0.30      2.79     0.01   102759     0.00     0.00  SKELETON::JDTreeViewBase::get_row(Gtk::TreePath const&)
  0.30      2.80     0.01    97717     0.00     0.00  ARTICLE::DrawAreaBase::clock_in()
  0.30      2.81     0.01    95791     0.00     0.00  MISC::is_url_char(char const*, bool)
  0.30      2.82     0.01    94552     0.00     0.00  void Gtk::TreeRow::set_value<long>(Gtk::TreeModelColumn<long> const&, long const&) const
  0.30      2.83     0.01    94246     0.00     0.00  DBTREE::ArticleBase::get_since_date()
  0.30      2.84     0.01    92850     0.00     0.00  CORE::Core::slot_timeout(int)
  0.30      2.85     0.01    92850     0.00     0.00  BBSLIST::BBSListViewBase::clock_in()
  0.30      2.86     0.01    92849     0.00     0.00  SKELETON::EditTreeView::clock_in()
  0.30      2.87     0.01    92846     0.00     0.00  CONFIG::get_save_session()
  0.30      2.88     0.01    92845     0.00     0.00  BOARD::BoardViewBase::clock_in()
  0.30      2.89     0.01    91156     0.00     0.00  DBTREE::ArticleBase::get_hour()
  0.30      2.90     0.01    66602     0.00     0.00  Glib::ustring Gtk::TreeRow::get_value<Glib::ustring>(Gtk::TreeModelColumn<Glib::ustring> const&) const
  0.30      2.91     0.01    66480     0.00     0.00  ARTICLE::DrawAreaBase::get_colorid_back()
  0.30      2.92     0.01    64451     0.00     0.00  std::_List_base<Pango::Item, std::allocator<Pango::Item> >::_M_clear()
  0.30      2.93     0.01    49554     0.00     0.00  DBTREE::BoardBase::is_abone_thread(DBTREE::ArticleBase*)
  0.30      2.94     0.01    48668     0.00     0.00  DBTREE::NodeTreeBase::create_node_link(char const*, int, char const*, int, int, bool)
  0.30      2.95     0.01    47351     0.00     0.00  ARTICLE::DrawAreaBase::set_num_id(ARTICLE::LAYOUT*)
  0.30      2.96     0.01    36663     0.00     0.00  std::list<sigc::slot_base, std::allocator<sigc::slot_base> >::erase(std::_List_iterator<sigc::slot_base>)
  0.30      2.97     0.01    32827     0.00     0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
  0.30      2.98     0.01    19020     0.00     0.00  ARTICLE::DrawAreaBase::get_vscr_val()
  0.30      2.99     0.01    17456     0.00     0.00  DBTREE::NodeTreeBase::check_abone_chain(int)
  0.30      3.00     0.01    16701     0.00     0.00  DBTREE::NodeTreeBase::parse_date_id(DBTREE::NODE*, char const*, int)
  0.30      3.01     0.01    15852     0.00     0.02  DBTREE::url_dat(std::string const&)
  0.30      3.02     0.01    15360     0.00     0.00  ARTICLE::DrawAreaBase::change_cursor(Gdk::CursorType)
  0.30      3.03     0.01    14219     0.00     0.00  sigc::internal::slot_call1<sigc::bound_mem_functor1<bool const, BOARD::BoardViewBase, _GdkEventMotion*>, bool, _GdkEventMotion*>::call_it(sigc::internal::slot_rep*, _GdkEventMotion* const&)
  0.30      3.04     0.01    13026     0.00     0.00  SESSION::is_booting()
  0.30      3.05     0.01    12740     0.00     0.00  void sigc::visit_each<sigc::internal::limit_derived_target<sigc::trackable*, sigc::internal::slot_do_bind>, void, ARTICLE::ArticleViewBase>(sigc::internal::limit_derived_target<sigc::trackable*, sigc::internal::slot_do_bind> const&, sigc::bound_mem_functor0<void, ARTICLE::ArticleViewBase> const&)
  0.30      3.06     0.01    11831     0.00     0.00  std::vector<DBTREE::ArticleBase*, std::allocator<DBTREE::ArticleBase*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<DBTREE::ArticleBase**, std::vector<DBTREE::ArticleBase*, std::allocator<DBTREE::ArticleBase*> > >, DBTREE::ArticleBase* const&)
  0.30      3.07     0.01     8169     0.00     0.00  DBTREE::BoardMachi::equal(std::string const&)
  0.30      3.08     0.01     6070     0.00     0.00  DBTREE::NodeTreeBase::get_id_name(int)
  0.30      3.09     0.01     5060     0.00     0.00  DBTREE::NodeTreeBase::is_refer_posted(int)
  0.30      3.10     0.01     4092     0.00     0.00  ARTICLE::LayoutTree::create_layout_hspace(int)
  0.30      3.11     0.01     3805     0.00     0.00  SKELETON::DragableNoteBook::get_alloc_notebook()
  0.30      3.12     0.01     2637     0.00     0.00  CONTROL::MouseKeyConf::get_motion(int, unsigned int&, bool&, bool&, bool&, bool&, bool&)
  0.30      3.13     0.01     2457     0.00     0.00  convert_mouse_motions(std::string)
  0.30      3.14     0.01     2027     0.00     0.16  DBTREE::NodeTreeBase::add_raw_lines(char*, unsigned int)
  0.30      3.15     0.01     1981     0.01     0.01  CONTROL::MouseKeyConf::get_id(int, unsigned int, bool, bool, bool, bool, bool)
  0.30      3.16     0.01     1299     0.01     0.01  XML::Dom::create_attribute(std::string const&)
  0.30      3.17     0.01      899     0.01     0.01  SKELETON::TabNotebook::draw_tab(_GtkNotebook const*, _GtkNotebookPage const*, _GdkRectangle*, Gdk::Rectangle const&, Glib::RefPtr<Gdk::Window> const&)
  0.30      3.18     0.01      529     0.02     0.02  JDLIB::ConfLoader::update(std::string const&, std::string const&)
  0.30      3.19     0.01      412     0.02     0.02  CONTROL::Control::clear_mode()
  0.30      3.20     0.01      399     0.03     0.05  SKELETON::TabNotebook::paint(_GdkEventExpose*)
  0.30      3.21     0.01      369     0.03     0.03  MISC::has_widechar(char const*)
  0.30      3.22     0.01      319     0.03     0.03  ARTICLE::ArticleViewBase::get_icon(std::string const&)
  0.30      3.23     0.01      208     0.05     0.05  SKELETON::Loadable::get_loader_location()
  0.30      3.24     0.01      188     0.05     0.23  JDLIB::Loader::run_main()
  0.30      3.25     0.01      177     0.06     0.07  ARTICLE::DrawAreaBase::append_res(int, int)
  0.30      3.26     0.01       67     0.15     0.15  DBTREE::Root::is_board_moved(std::string const&, std::string&, std::string&, std::string&, std::string&, int)
  0.30      3.27     0.01       23     0.43     0.78  DBTREE::NodeTreeBase::get_num_id_name(std::string const&)
  0.30      3.28     0.01        7     1.43     1.44  ARTICLE::LayoutTree::append_dat(std::string const&, int)
  0.30      3.29     0.01                             sigc::internal::slot_call0<sigc::bind_functor<-1, sigc::bound_mem_functor1<bool, CORE::Core, int>, int, sigc:nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, bool>::call_it(sigc::internal::slot_rep*)
(参考) ArticleHash 導入前

実施日 2008/12/26
実行時間 約2時間

model name	: Intel(R) Core(TM)2 CPU         T5500  @ 1.66GHz
MemTotal:       905024 kB

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 56.25      7.29     7.29    62331     0.12     0.12  DBTREE::BoardBase::get_article(std::string const&)
  4.71      7.90     0.61    32366     0.02     0.02  ARTICLE::DrawAreaBase::set_caret(ARTICLE::CARET_POSITION&, int, int)
  3.09      8.30     0.40 18856094     0.00     0.00  ARTICLE::DrawAreaBase::get_width_of_one_char(char const*, int&, char&, bool&, int)
  3.09      8.70     0.40  2315730     0.00     0.00  ARTICLE::DrawAreaBase::layout_one_text_node(ARTICLE::LAYOUT*, int&, int&, int&, int)
  3.01      9.09     0.39 18856064     0.00     0.00  ARTICLE::get_width_of_char(char const*, int&, char, int&, int&, int)
  2.78      9.45     0.36    54839     0.01     0.01  DBTREE::NodeTreeBase::check_id_name(int)
  1.39      9.63     0.18     6418     0.03     0.04  ARTICLE::DrawAreaBase::draw_backscreen(bool)

valgrindによるメモリリーク解析

実施日 2008/5/11

valgrind --leak-check=full --show-reachable=yes --log-file=valgrind.log ./jd
==9705== Conditional jump or move depends on uninitialised value(s)
==9705==    at 0x82E56DB: SKELETON::PaneControl::set_position(int) (panecontrol.cpp:104)
==9705== 
==9705== Conditional jump or move depends on uninitialised value(s)
==9705==    at 0x82A6691: SKELETON::Admin::toggle_icon(std::string const&) (admin.cpp:1488)
==9705==    by 0x82A88DE: SKELETON::Admin::slot_switch_page(_GtkNotebookPage*, unsigned) (admin.cpp:1676)
==9705==    by 0x82C3103: SKELETON::DragableNoteBook::slot_switch_page_tab(_GtkNotebookPage*, unsigned) (signal.h:832)
==9705==    by 0x2635F27: (within /usr/lib/libgtkmm-2.4.so.1.0.30)
==9705==    by 0x21980B8: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x8DAF82: g_closure_invoke (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EB770: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EC996: g_signal_emit_valist (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8ECB58: g_signal_emit (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x21C0968: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x21BCD19: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x21C1DD4: gtk_notebook_insert_page_menu (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705== 
==9705== Conditional jump or move depends on uninitialised value(s)
==9705==    at 0x824499D: ARTICLE::DrawAreaBase::set_caret(ARTICLE::CARET_POSITION&, int, int) (drawareabase.cpp:2858)
==9705==    by 0x8247A49: ARTICLE::DrawAreaBase::exec_scroll(bool) (drawareabase.cpp:2394)
==9705==    by 0x82480CB: ARTICLE::DrawAreaBase::slot_change_adjust() (drawareabase.cpp:3464)
==9705==    by 0x8E8408: g_cclosure_marshal_VOID__VOID (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8DAF82: g_closure_invoke (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EB770: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EC996: g_signal_emit_valist (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8ECB58: g_signal_emit (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x205D836: gtk_adjustment_value_changed (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x205D6E8: gtk_adjustment_set_value (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x25DB7AC: Gtk::Adjustment::set_value(double) (in /usr/lib/libgtkmm-2.4.so.1.0.30)
==9705==    by 0x82479AE: ARTICLE::DrawAreaBase::exec_scroll(bool) (drawareabase.cpp:2380)
==9705== 
==9705== Conditional jump or move depends on uninitialised value(s)
==9705==    at 0x82449AA: ARTICLE::DrawAreaBase::set_caret(ARTICLE::CARET_POSITION&, int, int) (drawareabase.cpp:2858)
==9705==    by 0x8247A49: ARTICLE::DrawAreaBase::exec_scroll(bool) (drawareabase.cpp:2394)
==9705==    by 0x82480CB: ARTICLE::DrawAreaBase::slot_change_adjust() (drawareabase.cpp:3464)
==9705==    by 0x8E8408: g_cclosure_marshal_VOID__VOID (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8DAF82: g_closure_invoke (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EB770: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EC996: g_signal_emit_valist (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8ECB58: g_signal_emit (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x205D836: gtk_adjustment_value_changed (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x205D6E8: gtk_adjustment_set_value (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x25DB7AC: Gtk::Adjustment::set_value(double) (in /usr/lib/libgtkmm-2.4.so.1.0.30)
==9705==    by 0x82479AE: ARTICLE::DrawAreaBase::exec_scroll(bool) (drawareabase.cpp:2380)
==9705== 
==9705== Mismatched free() / delete / delete []
==9705==    at 0x4004E56: operator delete(void*) (vg_replace_malloc.c:244)
==9705==    by 0x8231F08: ARTICLE::init_font() (font.cpp:48)
==9705==  Address 0x6C4FF68 is 0 bytes inside a block of size 524,416 alloc'd
==9705==    at 0x4005525: malloc (vg_replace_malloc.c:149)
==9705==    by 0x8231E65: ARTICLE::get_width_of_char(char const*, int&, char, int&, int&, int) (font.cpp:75)
==9705==    by 0x6BD2C03: ???
==9705== 
==9705== ERROR SUMMARY: 408 errors from 7 contexts (suppressed: 82 from 1)
==9705== malloc/free: in use at exit: 2,696,231 bytes in 30,423 blocks.
==9705== malloc/free: 971,361 allocs, 940,938 frees, 222,638,508 bytes allocated.
==9705== For counts of detected errors, rerun with: -v
==9705== searching for pointers to 30,423 not-freed blocks.
==9705== checked 3,385,164 bytes.

==9705== 84,088 bytes in 914 blocks are still reachable in loss record 231 of 239
==9705==    at 0x4005525: malloc (vg_replace_malloc.c:149)
==9705==    by 0x285052D: (within /usr/lib/libcairo.so.2.11.7)
==9705==    by 0x287BB38: (within /usr/lib/libcairo.so.2.11.7)
==9705==    by 0x285470F: (within /usr/lib/libcairo.so.2.11.7)
==9705==    by 0x2846239: (within /usr/lib/libcairo.so.2.11.7)
==9705==    by 0x283ECC3: cairo_show_glyphs (in /usr/lib/libcairo.so.2.11.7)
==9705==    by 0x683147: (within /usr/lib/libpangocairo-1.0.so.0.1800.4)
==9705==    by 0x212BA9: pango_renderer_draw_glyphs (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x21322F: pango_renderer_draw_layout_line (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x213588: pango_renderer_draw_layout (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x682249: (within /usr/lib/libpangocairo-1.0.so.0.1800.4)
==9705==    by 0x20E90EC: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705== 
==9705== 
==9705== 87,800 bytes in 4,390 blocks are indirectly lost in loss record 232 of 239
==9705==    at 0x4005525: malloc (vg_replace_malloc.c:149)
==9705==    by 0xBBF8B5: (within /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0xBBFF0B: (within /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0xBBC632: FcFontRenderPrepare (in /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0x1C5B58: (within /usr/lib/libpangoft2-1.0.so.0.1800.4)
==9705==    by 0x20553F: pango_font_map_load_fontset (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x2033F6: (within /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x203771: pango_itemize_with_base_dir (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x20C6B3: (within /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x20D856: (within /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x208ACFD: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x208AFE4: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705== 
==9705== 
==9705== 156,088 (47,872 direct, 108,216 indirect) bytes in 187 blocks are definitely lost in loss record 233 of 239
==9705==    at 0x4005622: realloc (vg_replace_malloc.c:306)
==9705==    by 0xBBF043: (within /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0xBBFA13: (within /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0xBBFF0B: (within /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0xBBC632: FcFontRenderPrepare (in /usr/lib/libfontconfig.so.1.2.0)
==9705==    by 0x1C5B58: (within /usr/lib/libpangoft2-1.0.so.0.1800.4)
==9705==    by 0x20553F: pango_font_map_load_fontset (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0x203D13: pango_context_get_metrics (in /usr/lib/libpango-1.0.so.0.1800.4)
==9705==    by 0xDDEDCE: Pango::Context::get_metrics(Pango::FontDescription const&) const (in /usr/lib/libpangomm-1.4.so.1.0.30)
==9705==    by 0x8242C26: ARTICLE::DrawAreaBase::init_font() (drawareabase.cpp:288)
==9705==    by 0x46F90EB: ???
==9705== 
==9705== 
==9705== 189,596 bytes in 2,790 blocks are still reachable in loss record 234 of 239
==9705==    at 0x4004864: calloc (vg_replace_malloc.c:279)
==9705==    by 0x7CB4A5D: g_malloc0 (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CC9205: (within /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CC9B64: g_slice_alloc (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CA0788: g_hash_table_new_full (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CA0807: g_hash_table_new (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7C9A041: g_quark_from_static_string (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x8F397A: g_type_init_with_debug_flags (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8F3B51: g_type_init (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0xC1334D: gdk_pre_parse_libgtk_only (in /usr/lib/libgdk-x11-2.0.so.0.1200.5)
==9705==    by 0x218FBBA: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x218FE60: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705== 
==9705== 
==9705== 192,904 bytes in 2,995 blocks are still reachable in loss record 235 of 239
==9705==    at 0x4005622: realloc (vg_replace_malloc.c:306)
==9705==    by 0x7CB49BA: g_realloc (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x8F31BA: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8F3327: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8FB90C: g_type_register_static (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E2B94: g_param_type_register_static (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E6BCB: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8F3A6E: g_type_init_with_debug_flags (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8F3B51: g_type_init (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0xC1334D: gdk_pre_parse_libgtk_only (in /usr/lib/libgdk-x11-2.0.so.0.1200.5)
==9705==    by 0x218FBBA: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x218FE60: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705== 
==9705== 
==9705== 194,119 bytes in 7,766 blocks are still reachable in loss record 236 of 239
==9705==    at 0x4005525: malloc (vg_replace_malloc.c:149)
==9705==    by 0x7CB4AF5: g_malloc (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CCD348: g_strdup (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CDA23E: g_set_prgname (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CBAF4E: g_option_context_parse (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x2190181: gtk_parse_args (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x21901F9: gtk_init_check (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x2190243: gtk_init (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x262C3F6: Gtk::Main::init(int*, char***, bool) (in /usr/lib/libgtkmm-2.4.so.1.0.30)
==9705==    by 0x262C47B: Gtk::Main::Main(int*, char***, bool) (in /usr/lib/libgtkmm-2.4.so.1.0.30)
==9705==    by 0x8066D58: main (main.cpp:425)
==9705== 
==9705== 
==9705== 228,334 bytes in 150 blocks are still reachable in loss record 237 of 239
==9705==    at 0x4005525: malloc (vg_replace_malloc.c:149)
==9705==    by 0xAFE14C: (within /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB0199A: ft_mem_qalloc (in /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB03F72: ft_mem_alloc (in /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB040C5: ft_mem_qrealloc (in /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB0418E: ft_mem_realloc (in /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB359B4: (within /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB37A37: (within /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB123BC: (within /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB052DD: (within /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB05EE2: FT_Open_Face (in /usr/lib/libfreetype.so.6.3.16)
==9705==    by 0xB06C27: FT_New_Face (in /usr/lib/libfreetype.so.6.3.16)
==9705== 
==9705== 
==9705== 594,104 bytes in 521 blocks are possibly lost in loss record 238 of 239
==9705==    at 0x4004750: memalign (vg_replace_malloc.c:332)
==9705==    by 0x40047AA: posix_memalign (vg_replace_malloc.c:425)
==9705==    by 0x7CC8EC8: (within /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CCA0AB: g_slice_alloc (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CCA224: g_slice_alloc0 (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x8FAD36: g_type_create_instance (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E21A1: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E03EA: g_object_newv (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E1037: g_object_new_valist (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8E113F: g_object_new (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x664743: gdk_pixbuf_new_from_data (in /usr/lib/libgdk_pixbuf-2.0.so.0.1200.5)
==9705==    by 0x662905: gdk_pixbuf_new_subpixbuf (in /usr/lib/libgdk_pixbuf-2.0.so.0.1200.5)
==9705== 
==9705== 
==9705== 825,800 bytes in 2,839 blocks are still reachable in loss record 239 of 239
==9705==    at 0x4004750: memalign (vg_replace_malloc.c:332)
==9705==    by 0x40047AA: posix_memalign (vg_replace_malloc.c:425)
==9705==    by 0x7CC8EC8: (within /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CCA0AB: g_slice_alloc (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x7CCAD71: g_slist_prepend (in /lib/libglib-2.0.so.0.1400.6)
==9705==    by 0x8DFEFE: g_object_notify (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x2321D95: gtk_widget_set_parent (in /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x206795D: (within /usr/lib/libgtk-x11-2.0.so.0.1200.5)
==9705==    by 0x8E7918: g_cclosure_marshal_VOID__OBJECT (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8D9778: (within /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8DAF82: g_closure_invoke (in /lib/libgobject-2.0.so.0.1400.6)
==9705==    by 0x8EB919: (within /lib/libgobject-2.0.so.0.1400.6)
==9705== 
==9705== LEAK SUMMARY:
==9705==    definitely lost: 51,434 bytes in 210 blocks.
==9705==    indirectly lost: 108,396 bytes in 5,345 blocks.
==9705==      possibly lost: 614,288 bytes in 1,131 blocks.
==9705==    still reachable: 1,922,113 bytes in 23,737 blocks.
==9705==         suppressed: 0 bytes in 0 blocks.