2013-12-13 1 views
0
내 소프트웨어 검증 그룹은 다음과 같은 코드의 조각을 테스트

: 위의 코드 조각을 사용하여만족 인수의 수보다 더 많은 반환

unsigned int alarm_id; 
char   alarm_text[16]; 
static const char text_string[] = "105, Water_Boiling"; 
signed int arguments_satisfied = 
    sscanf(text_string, 
      "%3d, %16s", 
      &alarm_id, &alarm_text[0]); 
if (arguments_satisfied < 2) 
{ 
    system_failure(); 
} 

하는을 반환 sscanf을 얻을 수있는 방법이 있나요 형식 지정자를 변경하거나 인수를 sscanf으로 변경하지 않고 2보다 큰 값?

그들은 단위 테스트 도구를 사용하여 if 문을 표현하고 있습니다.

C++의 경우 C++로 컴파일 할 때 위의 단편과 차이가 있습니까?
(동일한 코드를 사용하지만 C++로 컴파일 할 계획입니다.)

참고로 IAR Embedded Workbench가있는 ARM7 프로세서를 사용하고 있습니다.

+0

2보다 큰 값으로 되돌리려 고합니까, 아니면 if 문이 실패를 놓치지 않을 것입니까? 그러나 C++에는 차이가 없습니다. – Carl

+2

'text_string '의 alarm_text 필드의 길이가 16 자 이상인 경우,'% 16s' 형식은'alarm_text' 배열의 끝을 지나서'\ 0'을 쓸 것입니다. 'alarm_text' 배열은 17 개의 원소를 가질 필요가 있거나 포맷 지시자는'% 15s '일 필요가 있습니다. –

+0

'system_failure' 함수에서 월드가 폭발합니까? –

답변

1

sscanf는 변환 된 인수의 수를 반환합니다. 당신이 말한 것보다 더 많은 논쟁을 변환 할 수는 없습니다. 따라서 형식 문자열이 변경되지 않으면 sscanf는 2보다 큰 값을 반환 할 수 없습니다. 가능한 한 예외 - 첫 번째 인수가 변환되기 전에 데이터가 부족한 경우 EOF가 반환 될 수 있지만 그 경우에만 sscanf가 아니라 scanf에 적용됩니다.

+0

그리고 EOF는 음수가 될 것이므로 (-1이 될 수 있다고 보장되지는 않지만), 여전히 2보다 큰 값을 반환하지 않습니다. –

1

많은 툴체인의 경우, IAR이 하나임을 확신합니다. 오브젝트 파일과 라이브러리에 심볼이있는 경우 링커는 오브젝트 파일의 심볼과 라이브러리에있는 심볼보다 링크됩니다 도서관.

테스트 중에 링크를하고 원하는대로 반환하려면 직접 sscanf() 함수를 제공 할 수 있습니다. 링커이 작동하여 sscanf() 구현 및 라이브러리에 하나, 대체 사이에 기호 충돌에 문제가있는 경우

당신 단위 테스트 sscanf() (예 : unittest_sscanf 같은) 다른 이름을 사용하고 빌드 시스템을 사용하는 것입니다 테스트 할 모듈에 /Dsscanf=unittest_sscanf과 같은 것을 사용하여 빌드하는 동안 sscanf()의 이름을 바꿀 매크로를 정의하십시오.

물론 다른 sscanf() 호출이 문제를 일으키지 않는지 확인하는 것은 까다로울 수 있습니다.

+0

+1 단위 테스트를 위해 별도의'sscanf '를 제안했습니다. –

관련 문제