2014-02-18 1 views
4

C 함수의 라이브러리가있는 경우 내 보낸 함수가 재진입 성있는 경우 유효성 검사를 자동화하는 방법이 있습니까?C 함수 라이브러리가 재진입 성을 충족시키는 지 확인하는 방법은 무엇입니까?

런타임시 (필요한 경우 계측 후) 또는 코드 분석에서. 소스 코드를 사용할 수 있습니다.

참고 : 이것은 std-C 라이브러리 또는 스레드 안전 계약이있는 잘 문서화 된 GNU lib가 아닙니다.

+2

Valgrind에 대해서는

는이 동기화 오류를 테스트 할 수 있습니다 Helgrind라고위한 도구가 존재하지 않습니다. 소스 코드를 가지고 있기 때문에'static '이라고 선언 된 지역 변수를 찾을 수 있고, 전역 변수에 대한 접근을 확인할 수 있습니다. –

+0

이 질문에 멀티 쓰레딩을 붙였다면, 뮤텍스 나 글로벌 상태가 변경되는 중요한 코드 세그먼트 - 테스트가 거의 불가능하며 신중한 코딩과 코드 판독만으로 문제가 드러납니다. 문제를 어떻게 해결할 것인지에 대한 질문을 다시 쓰고 코드가 뮤텍스 잠금 상태에서 전역 상태를 수정할 것으로 예상하는지 또는 뮤텍스 잠금이없는 순수한 재진입이 예상되는 경우 - 모든 외부 심볼을 ​​읽기 전용 메모리에 매핑하여 테스트 할 수 있습니다. 그러나 가장 구체적인 것은 더 구체적입니다. – Soren

답변

4

함수는 실행 도중에 중단 될 수 없으며 이전 호출이 완료되기 전에 안전하게 다시 호출 ("재 입력") 될 경우 "스레드 안전"으로 간주되지 않습니다.

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을 호출 할 수 있습니다.

또한 여기에 또 다른 링크가있어서 Threadsafe vs re-entrant 동작에 대해 논의하고 있습니다.

-

편집은 : 더 직접적으로 원래의 질문과 관련. 나는 기능이 재진입 성 (re-entrant)인지 여부를 알려줄 수있는 도구가 있다고 믿지 않는다. ltrace과 같은 도구를 사용하면이 도움이 될 수 있습니다. 위의 내 의견은 라이브러리에 대한 설명서가 있어야한다는 것을 보여 주었고 C 표준 라이브러리를 예로 사용했습니다. 그와 같은 말은하지 않지만, 나는 개인적으로 이것에 대한 어떤 도구를 인식하지 오전 : (http://valgrind.org/docs/manual/hg-manual.html를, 7.1 절 참조)

+0

1. 나는 재진입의 정의를 요구하지 않았다. 2. 나는 표준 C lib에 대해 걱정하지 않는다. 이것은 제 3 자 라이브러리이며 문서화가 잘되어 있지 않습니다. – Debriter