2009-09-04 3 views
5

내 응용 프로그램의 휴대용 구현하고 싶습니다. 그러나 특정 컴퓨터의 stdlib에서 printf에 문제가 있다는 것을 들었습니다. 의도 한대로 작동하지 않습니다. 예를 들어 변환 지정자 % f를 사용하면 특정 아키텍처에서 printf 구현 에 출력에 소수점이 포함될 수 있습니다!테스트 printf 구현

stdlib C 구현의 의미 적 정확성을 테스트하는 데 사용할 수있는 테스트 루틴이 있다면 어쩌면 궁금합니다. 특히 printf 루틴입니다. 어쩌면 프로그램을 이식 할 때 몇 가지 문제점을 지적하는 좋은 자료가 있을까요?

많은 감사, 하인즈

+0

? IMO는 이식성보다 l10n과 더 관련이 있습니다. –

+0

테스트 용으로 사용하면 기본적으로 다른 플랫폼에서 다른 출력을 얻습니다. 이것은 값 자체가 같더라도 소수점으로 인해 테스트가 실패 할 수 있음을 의미 할 수 있습니다. –

+3

@Heinz, 테스트 코드에서 로캘을 "C"로 설정할 수 있습니다 (예 : setlocale (LC_NUMERICAL, "C")). 이것은 쉼표 또는 다른 것이 아닌 항상 소수점을 출력해야합니다. – quinmars

답변

1

당신은 당신을 우려 문제를 다루고 자신의 테스트 스위트를 작성해야합니다. 다양한 입력을 사용하여 printf를 100 번 호출하는 것은 매우 간단합니다. 출력은 간단한 텍스트이므로 기대하는 출력을 확인하는 것이 간단합니다.

4

나는 (당신이하는 일에 보수주의를 기울이고, 다른 사람들로부터 받아 들일 수있는 자유 주의적이라고 생각한다.) 여기도 역시 적용된다고 생각한다. printf() 구현이 작동하는 것으로 간주하기 위해 문자 단위로 일치하도록 테스트를 작성하지 마십시오.

대신 높은 수준으로 설정하십시오. printf()에 의한 텍스트 출력을 예상되는 데이터 유형으로 구문 분석하고 해당 유형의 값과 비교하십시오.

즉, "2.25"를 인쇄하는 경우 (strtod() 또는 동급을 사용하여) 텍스트를 구문 분석하고 리터럴 텍스트 문자열 "2.25"가 아니라 실제 숫자 2.25와 비교하십시오.

0

다음과 같은 방법으로 테스트하는 것이 좋습니다. sprintf()를 사용하여 일부 테스트 템플릿을 생성하고 "올바른"템플릿과 비교하십시오.

필자는 fprintf를 사용하여 (우리의 임베디드 시스템에서 캐싱을 피하기 위해) 이렇게했습니다.

결과가 printf와 sprintf에서 다를 것이라고 생각합니다. 서식 지정 알고리즘은 동일합니다.

+0

대부분의 경우 모든 printf 패밀리가 공통 구현을 사용하기 때문에 알고리즘은 동일합니다. 한 가족 구성원을 다른 가족 구성원과 비교하는 것은 같은 대답을 받았음을 확인하는 것일뿐 올바른 대답인지 판단하는 데는 도움이되지 않습니다. – RBerteig