Как автоматизировать проверку соответствия библиотеки функций C повторному входу?

Имея библиотеку функций C, есть ли способ автоматизировать проверку, если экспортируемые функции реентерабельны?

Либо во время выполнения (после инструментария, если необходимо), либо после анализа кода. Исходный код доступен.

Примечание: это не библиотека std-C и не хорошо документированная библиотека GNU с контрактом безопасности потоков.


person Slawomir    schedule 18.02.2014    source источник
comment
Мне лично не известны какие-либо инструменты для этого, хотя это не значит, что их не существует. Поскольку у вас есть исходный код, вы можете искать любые локальные переменные, которые были объявлены static, проверять доступ к глобальным переменным и т. Д.   -  person John Bode    schedule 19.02.2014
comment
Учитывая, что вы отметили этот вопрос многопоточностью, я ожидаю, что у вас есть мьютекс или критические сегменты кода, где глобальный статус изменен - ​​тестирование для этого практически невозможно, и только тщательное кодирование и просмотр кода выявят проблемы. Я предлагаю вам переписать вопрос о том, как вы намереваетесь решить проблему, и четко указать, ожидает ли код изменения глобального состояния при блокировке мьютекса, или если ожидается, что он будет чисто реентерабельным без блокировок мьютекса - последнее Вероятно, можно было бы протестировать, сопоставив все внешние символы с постоянной памятью, но нижняя строка будет более конкретной.   -  person Soren    schedule 24.02.2014


Ответы (1)


Функция не считается «потокобезопасной», если она НЕ МОЖЕТ быть прервана в середине ее выполнения, а затем безопасно вызвана снова («повторно введена») до того, как ее предыдущие вызовы завершат выполнение.

В стандартной библиотеке C некоторые функции попадают в эту категорию. Вам не нужен такой инструмент, как Valgrind, для проверки безопасности потоков, вместо этого вы должны прочитать документацию (или страницу руководства) для конкретной функции, которая вас беспокоит.

Обычно, но не всегда, C предлагает потокобезопасный аналог, если функция не является потокобезопасной.

Например, функция токенизатора строк strtok имеет реентерабельную версию strtok_r

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);

с той разницей, что ваш код (поток) поддерживает указатель на последнюю токенизированную строку (незавершенную работу) вместо функции, поддерживающей ее. Это позволяет нескольким потокам вызывать strtok_r параллельно.

Кроме того, вот еще одна ссылка на SO, где обсуждается поведение Threadsafe по сравнению с повторным входом.

--

ИЗМЕНИТЬ: более непосредственно связано с исходным вопросом. Я не верю, что существует такой инструмент, который может сказать вам, является ли функция реентерабельной. В этом могут помочь такие инструменты, как ltrace . Мои комментарии выше иллюстрируют, что документация для библиотеки должна существовать, и в качестве примера я использовал стандартную библиотеку C.

Что касается Valgrind, для него есть инструмент под названием Helgrind, который может проверять ошибки синхронизации (см .: http://valgrind.org/docs/manual/hg-manual.html, раздел 7.1)

person ffhaddad    schedule 18.02.2014
comment
1. Я не просил определение повторного входа. 2. Меня не волнует std C lib. Это сторонняя библиотека, которая плохо документирована. - person Slawomir; 19.02.2014