2013-05-06 1 views
1

아래와 같이 vsnprintf를 호출합니다. Vargs가 NULL이면 strlen 함수에서 vsnprintf coredump가 실행되지만 Linux, AIX 등과 같은 다른 OS에서는 괜찮습니다.solaris vsnprintf에서 strlen 함수의 코어 덤프는 이것을 해결할 수있는 방법일까요?

이 문제가 해결 되었습니까? 나는

코드 ... 내가 vsnprintf가 코어 덤프하지 않아야합니다, varags에 NULL을 전달 피할 수

int example(char * buff,size_t count,const char format[],...) 
{ 
va_list vargs = NULL; 
va_start(vargs,format); 
ret = vsnprintf(buff,count,format,vargs); 
va_end(vargs); 
return ret; 
} 

main() 
{ 
char buff[100] = {0}; 
char *FileName = NULL; 
ret = example(buff,100,"File Name is %s",FileName); 
} 
+4

'% s'에 해당하는 인자는 널 포인터가 아니어야합니다. 함수의 전제 조건을 위반하고 있습니다. – Angew

+0

안녕하세요,이 코드는 리눅스에서 아무런 문제가 없다고 생각합니다. 솔라리스에서 thr은 strlen 함수를 호출하기 전에 NULL에 대한 검사가 없습니다. 나는 이것이 solaris vsnprintf의 버그라고 생각합니다. 어떤 해결책입니까? – user1340512

+4

솔라리스가 올바른 일을합니다. Linux 및 다른 사람들이 제공하는 안전망은 안전하지 못하고 안전하지 않은 행동을 조장하기 때문에 올바르지 않습니다. – Art

답변

1

여러 솔루션이 있지만 어느 것도 완전히 하찮은 없습니다. 불행히도, 여러분이 발견 한 것은 "% s"처리시 NULL 포인터에 대한 "캐치 (catch)"가 있는데, 이는 현재보고있는 문제를 해결합니다. 이것은 C 표준에서 필요하지 않습니다.

구현의 복잡성 측면에서 가장 단순한 것은 문자열을 example으로 전달하기 전에 간단히 검사하는 것입니다 (예 : example). :

char *FileName = NULL; 
if (!FileName) FileName = "(null)"); 
ret = example(buff,100,"File Name is %s",FileName); 

또는

char *FileName = NULL; 
ret = example(buff,100,"File Name is %s",FileName?FileName:"(null)"); 

그러나

example이 코드에서 gazillion 시간을 호출하는 경우, 그것은 "% s '에 대한 검색 값이 NULL 인 경우 그 지점에서 확인하는 것이 더 간단 할 수있다, 그것을 대체하십시오. 이것은 상당히 지저분 해집니다. 왜냐하면 printf 포맷을위한 전체 "% [flags] [width] [type]"파서를 구현해야하고 인수를 처리해야하기 때문입니다. 그러나 여기에 또 다른 문제가 있습니다 : va_list을 수정할 수 없습니다 (작동 할 수는 있지만 정의되지 않은 동작입니다). 따라서 결국 자신의 vsnprintf 함수를 작성하게 될 것입니다.

그래서 나는 자신의 기능을 구현하는 경로를 따라 가기 전에 소스에서 수정하려고합니다.

+0

우리는 vsnprintf 함수의 리눅스 구현을 어디서 구할 수 있습니까? – user1340512

+0

glibc 저장소에 있습니다. 'git clone git : // sourceware.org/git/glibc.git'. –