Ошибки Valgrind, связанные с -static - Почему? - PullRequest
9 голосов
/ 22 сентября 2011

У меня есть тестовый драйвер, связанный с библиотекой, которую я написал. Библиотека использует автоинструменты, поэтому создает как архив (.a файл), так и динамическую библиотеку (.so).

Когда я связываю свой драйвер с «g ++ -static», предположительно ссылающимся на .a, valgrind загорается многократно, сообщая: «Условный переход или перемещение зависит от неинициализированных значений (й)». Первый сбой происходит перед main в __pthread_initialize_minimal.

Когда я связываюсь без -static, предположительно со ссылкой на .so, я не получаю никаких жалоб valgrind.

Кто-нибудь знает почему? Valgrind просто не работает с -static?

ОБНОВЛЕНИЕ : я не могу опубликовать даже урезанную версию моего драйвера, потому что он ссылается на очень большую библиотеку, которую я не могу урезать, но я замечаю, что самая простая из всех программ

int main()
{
  return 0;
}

выдает ошибку при связывании с -static и запуске из valgrind:

==15449== Use of uninitialised value of size 8
==15449==    at 0x40B0F3: exit (in /home/jdgordo/src/t)

Мне следовало включить, что я работаю на 64-битном Redhat 5.5.

Ответы [ 2 ]

13 голосов
/ 22 сентября 2011

Valgrind просто не работает с -static?

Да.Проблема не в Valgrind, а в glibc, который не является чистым Valgrind.Разработчики glibc отказались исправлять эти проблемы (поскольку проблемы носят «безразличный» характер, и их исправление стоит (несколько) циклов).

Когда вы связываетесь динамически, эти ошибки происходят из libc.so.6, и может быть легко подавлено, что и делает Valgrind по умолчанию.

Но когда вы статически связываете, эти ошибки происходят из вашего исполняемого файла (который теперь включает код из libc.a), и поэтому по умолчаниюПодавления Valgrind не подавляют их.

Вы можете написать новые подавления (см. Документацию Valgrind --gen-suppressions=yes ).

Или вы можете установить и использовать glibc-audit .

1 голос
/ 22 сентября 2011

Если библиотека вызывает проблемы в valgrind, вы можете игнорировать эти проблемы только путем записи файлов подавления .

Одна из проблем, с которыми я столкнулся, - это размещение чего-то в куче, например:

// library
int * some = new int;

// main links the library
int main()
{
}

Этот пример сообщит об ошибке об утечке.

РЕДАКТИРОВАТЬ: если у вас есть источник библиотеки, вы можете исправить ошибку (использование неинициализированной переменной) и перекомпилировать ее.

...