12/21/2011

Code @ C++: Find sum of elements in the array

Code @ C++: Find sum of elements in the array: Наткнулся на задачу, которую предлагают в Yandex на собеседовании: Ниже приведены три варианта суммирования чисел с плавающей точкой (предп...

12/13/2011

Emacs column marker

Очень часто стилем кодированием лимитирована максимальная длина строки кода и хорошо когда про это знает IDE.

В Emacs добавил себе column-marker

(add-to-list 'load-path (expand-file-name "~/emacs/column-marker"))

(require 'column-marker)

(add-hook 'ada-mode-hook (lambda () (interactive) (column-marker-3 79))) 

Теперь, если в в Адском коде длина строки превышает 79 символом,  Emacs подсвечивает часть строки красненьким.

P.S. Заодно проверю, есть ли реклама в Фиде. Вроде с горем пополам я ее отключил.

12/01/2011

Error: Value too large for defined data type

При компиляции сорсов программы в Ubuntu Linux, в директории которподмонтирован по samba, gcc вывалил вот такую ошибку:

Error: Value too large for defined data type

Сначала показалось что ошибка в gcc, однако проблема оказалась в монтировании дирректории по CIFS.


При монтировании нужно добавить несколько опций:

nounix,noserverino
 
В чем причина сего явления не очень понятно.

Решение проблемы подсмотрено тут. 

11/03/2011

Утечки памяти и ошибки доступа.

Ранее я уже писал о том, что можно искать утечки памяти в программе с помощью средств, которые предоставляет glibc. Описанный подход плох тем, что не позволяет искать ошибки доступа к памяти, такие как обращение по нулевому указателю, или обращение к уже освобожденной памяти.

В данном посте речь пойдет о mudflap.
mudflap - это технология проверки указателей, основанная не на бинарной инструментации, как valgrind или dr. Memory, а на инструментации времени компиляции. Если в кратце, во время компиляции программы в исходный код делаются вставки, которые обспечивают различные проверки указателей,к которым осуществляется доступ.

Теперь разберем работу mudflap на конкретном примере.

Для того, чтобы можно было использовать mudflap, нужа поддержка этой технологии в компиляторе и собственно сама библиотека, выполняющая проверки: gcc должен  быть скомпилирован с опцией --enable-libmudflap, и в системе должна присутствовать библиотека libmudflap.so.

В качестве примера рассмотрим программу, котороя пытается записать в уже освобожденную память:
#include <malloc.h>

int main (void)
{
  const int chunk_size = 18;
  const int count  = 10000;
  int j = 0;
  void * ptrs [count];

  /* выделяем 10 000 кусочков памяти по 18 байт.*/
  for (j = 0; j < count; j++) {
    ptrs [j] = malloc (chunk_size);
  }

  /* освобождаем все, кроме первого и последнего */

  for (j = 1; j < count - 2; j++)
    if (ptrs [j])
      free (ptrs [j]);

  /* записываем в освобожденную память*/
  *(char*)ptrs [10] = 10;

  /* просим glibc сделать "дефрагментацию" выделенной памяти */
  malloc_trim (1);

  return 0;
}


Результатом работы программы будет Segmentation Fault.
Это происходит потому что при попытке записи в освобожденную память (на самом деле она не освобождается, а помечается как неиспользуемая) программа портит служебную информацию glibc, а именно связный список, который используется в glibc для управления памятью.

Чтобы отловить ошибку в программе нужно пересобрать программы с mudflap инструментацией:

gcc -fmudflapth -lmudflap -Wall -Wextra -g -ggdb3 buggy.c
Запускаем:

./a.out


В результате работы программа выдает следующее:

*******

mudflap violation 1 (check/write): time=1320343428.778161 ptr=0xe85c10 size=1

pc=0x7fcc8d0dc4f8 location=`buggy.c:22:21 (main)'

      /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libmudflap.so.0(__mf_check+0x38) [0x7fcc8d0dc4f8]

      ./a.out(main+0x301) [0x400da5]

      /lib64/libc.so.6(__libc_start_main+0xec) [0x7fcc8cd63e8c]

number of nearby objects: 0


Ясно видно где в исходном коде возникает проблема.

Для проверки, запустим программу под valgrind-ом, который выдает следующую информацию:
==26575== 

==26575== Invalid write of size 1

==26575==    at 0x4006E0: main (buggy.c:22)

==26575==  Address 0x51bc400 is 0 bytes inside a block of size 18 free'd

==26575==    at 0x4C27F6C: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)

==26575==    by 0x4006C8: main (buggy.c:19)


valgrind как и mudflap, точно показал место ошибки в программе:
buggy.c: 22

Резюмирая можно обозначить плюсы и минусы mudflap:
"+" :
1. Более низкий overhead по сравнению с valgrind.
2. Лучшая переносимость: доступен для платформ ARM и MIPS.
3. Из-за того, что инструментация происходи во время выполнения, может находить более сложные ошибки и более точно показывать их в коде.

"-":
1. Поддержка кода, написанного только на C/C++.
2. Привязка к компилятору GCC.
3. Необходимость перекомпиляции.

Таким образом, mudflap вполне удобный тул, который позволяет искать утечки в памяти не используя valgrind, что особенно полезно для встраиваемых систем (ARM и MIPS), где на исполнение кода существенно влияют накладные расходы на инструментацию.

Больше информации о mudflap можно посмотреть тут : http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

10/17/2011

Экранирование в bash, кто знает?

Есть такой скриптик в bash:

#!/bin/bash
set -x
a () 
   echo $1 
}

b () 
   a "--some-flag='param1 param2,param3'" 
}
b


в функции a () echo вызывается как:
echo '--some-flag='\''param1' 'param2,param3'\'''

как сделать чтобы параметры которые передаются в a () не экранировались?

т.е. чтобы echo вызывался вот так:
echo --some-flag='param1 param2,param3'

т.е. чтобы параметры передавались как есть ?

10/15/2011

Установил себе grub2 в Gentoo

Надоело мне пользоваться LILO, захотелось чего то нового.
Решил поставить себе GRUB2.

1. Размаскируем пакет:
echo ">=sys-boot/grub-1.99-r2" >> /etc/portage/package.unmask

2. Собираем
emerge grub

3.Настраиваем
 grub2-mkconfig -o /boot/grub2/grub.cfg

4. Проверяем, что конфигурация работает.
grub2-install --grub-setup=/bin/true /dev/sda

5. Устанавливаем
grub2-install /dev/sda

6. Перезагружаемся
reboot.

10/05/2011

kernel.org вернулся

kernel.org снова в строю.
Ждем результатов расследования взлома.

P.S. на lwn.net дали ссылку на https://www.kernel.org,
причем если с https://www.kernel.org все в порядке,
то https://kernel.org ругается на неправильный сертификат.

10/01/2011

Berlios.de - всё

Кризис наступает и в IT индустрии.

Сегодня получил письмо о том, что хостинг открытых проектов www.berlios.de который верой и правдой служил разработчикам 10 лет - будет закрыт 01.01.2012.

Причиной закрытия является нехватка средств у немецкого исследовательского института Fraunhofer FOKU, в связи с урезанием финансирования непрофильных проектов.

Ссылка на официальную новость:  BerliOS will be closed on 31.12.2011

6/28/2011

запуск приложения, читающего стандартный ввод в GDB

Предположим у нас есть приложение, которое что-то читает со стандартного ввода 
и одновременно принимает ключи в командной строке. 

Q : Как запустить это приложение под GDB?
 
A
   gdb application
   gdb> run parameters ... < input_file

6/18/2011

Gentoo, Firefox и NS plugin wrapper.

Не забудьте после очередного обновления nspluginwrapper в Gentoo до версии 1.4.2 выполнить команду:

nspluginwrapper -i /opt/Adobe/flash-player32/plugin/libflashplayer.so

Иначе, у вас перестанет работать flash плагин.

6/14/2011

Вышел GNAT GPL 2011 с новыми вкусностями.

We are pleased to announce the release of GNAT GPL 2011, the integrated
Ada, C, and C++ toolset for Academic users and FLOSS developers.
This new edition provides many new features and enhancements in all
areas of the technology. The most notable ones are:

 - improved support for Ada 2012 
 - enhanced versions of tools 
    - GPS 5.0 enhanced IDE (improved support for C/C++, more powerful
      source editing, better usability, ….),
    - GtkAda (new widgets, interface to the Cairo graphics library)
 - more flexible and more efficient project manager tool
 - support for unloading Ada plug-ins
 - improved support for Ada constructs on the .NET platform
 - more detailed exception messages (-gnateE switch)
 - complete support for Lego MINDSTORMS hardware, including audio and
   I2C sensors

GNAT GPL 2011 comes with version 5.0.1 of the GNAT Programming Studio
IDE and GNATbench 2.5.1, the GNAT plug-in for Eclipse.

GNAT GPL 2011 can be downloaded from the "Download" section on
https://libre.adacore.com.

4/01/2011

Valgrind и glibc в Gentoo.

Для корректной работы валгринда требуется, чтобы glibc была собрана с отладочной информацией, дабы он смог из нее вытащить нужные функции.
В Gentoo glibc умолчанию собирается без нее.
Чтобы эту проблему исправить, необходимо чтобы для glibc генерировалась отладочная информация.
Для этого, добавляем в файл /etc/portage/env/sys-libs/glibc
строчку: FEATURES="splitdebug"
И пересобираем libc.

После этого, в каталоге /usr/lib/ появится каталог debug, в котором будет лежать файлы типа lib*.debug, содержащиеся требуемую информацию.

3/16/2011

Купить pandaboard в России

Подскажите, как заполучить pandaboard в России?
Официально в Россию это борда не доставляется.
Может у кого нибудь есть опыт покупки подобных железяк из России?

3/09/2011

Анонс AXMPP 0.0.1

Всем привет.
Хочу анонсировать первый релиз библиотеки AXMPP.

AXMPP - это реализация протокола XMPP для языка программирования Ада.
Это первый релиз библиотеки, которые включает в себя следующие возможности:
1. Поддержка безопасного соединения с помощью agnutsl (ada-binding для gnutls).
2. Реализация базовой части протокола XMPP:
    * Управление списком контактов (ростер).
    * Прием/отправка сообщений.
    * Поддержка конференций.
    * Поддержка информации о присутствии
    * Возможности управления ресурсами.
    * Возможность обработки/генерации IQ в сыром виде.
3. Поддержка расширения для получения информации о клиенте.

Ознакомиться с библиотекой, а также скачать исходники можно на сайте:

http://adaforge.qtada.com/cgi-bin/tracker.fcgi/axmpp

AXMPP распространяется под BSD подобной лицезией.

2/21/2011

KDE4 и кривой ~/.Xmodmap

После очередного обновления KDE 4 в Gentoo Linux, у меня на клавиатуре перестали работать клавиши 'Arrow Down' и 'End'.
Я долго пытался понять в чем проблема, но у меня так и не получилось, и  в качестве временного решения я добавил в стартовый скрипт, который запускался вместе с KDE команду для настройки xkb, который решал эту проблему:
 setxkbmap -layout "us,ru(winkeys)" -option "grp:switch,grp:toggle,grp_led:scroll"

Но на деле все оказалось совсем просто.
Оказывается, когда то давно, еще со времен третьих кед, я создал файлик .Xmodmap в домашней дирректории. Он был нужен, для того, чтобы в emacs работали хитрые комбинации клавиш. И видимо с из-за того, что с тех пор  многое изменилось и в X сервере и в KDE, этот файл начал негативно влиять на работу клавиатуры в KDE4. Его удаление решило проблему.