2010-04-13 2 views
1

어떤 이유에서인지 아래 코드 블록을 다루는 데 어려움을 겪고 있습니다. 이 코드는 UNIX uniq 명령에서 발췌 한 것입니다. 나는 모든 블록을 커버하는 테스트 케이스를 작성하는 것을 시도하고 있지만,이 블록에 도달 할 수없는 것 :직관적이지 않은 코드 블록을 어떻게 처리합니까?

if (nfiles == 2) 
{ 
    // Generic error routine 
} 

맥락에서 :

int main (int argc, char **argv) 
{ 
    int optc = 0; 
    bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL); 
    int nfiles = 0; 
    char const *file[2]; 

    file[0] = file[1] = "-"; 
    program_name = argv[0]; 

    skip_chars = 0; 
    skip_fields = 0; 
    check_chars = SIZE_MAX; 

    for (;;) 
    { 
     /* Parse an operand with leading "+" as a file after "--" was 
     seen; or if pedantic and a file was seen; or if not 
     obsolete. */ 

     if (optc == -1 || (posixly_correct && nfiles != 0) || ((optc = getopt_long (argc, argv, "-Dcdf:is:uw:", longopts, NULL)) == -1)) 
     { 
      if (optind == argc) 
       break; 
      if (nfiles == 2) 
      { 
       // Handle errors 
      } 
      file[nfiles++] = argv[optind++]; 
     } 
     else switch (optc) 
     { 
      case 1: 
      { 
       unsigned long int size; 
       if (optarg[0] == '+' && posix2_version() < 200112 && xstrtoul (optarg, NULL, 10, &size, "") == LONGINT_OK && size <= SIZE_MAX) 
        skip_chars = size; 
       else if (nfiles == 2) 
       { 
        // Handle error 
       } 
       else 
        file[nfiles++] = optarg; 
      } 
      break; 
     } 
    } 
} 

어떤 도움을 크게 감상 할 수있다. 감사.

답변

0

명령 줄에 두 개 이상의 파일이 제공되면이 문제가 발생할 수 있습니다. 이 경우 nfiles은 두 번째 파일 이름이 file[1]에 저장된 후 값 2에 도달합니다. 코드 nfiles == 2에 도달하면 세 번째 시간이 지나면이 값은 이미 2가되어 오류 처리가 실행됩니다.

질문에 두 개의 if 문이 있습니다. 스위치 케이스에서 "1"은 longopts의 옵션을 사용하여 val == 1으로 만 도달 할 수 있습니다.

+0

두 번째 if 문을 테스트하기 위해 테스트를 생성 할 수 있지만 if 문은 다음과 같은 것으로 보입니다. if (optind == argc) break; 첫 번째 경우에 모든 것을 포착합니다. – naivedeveloper

+0

"uniq a b c"또는 이와 비슷한 것을 시도해 보셨습니까? –

+0

나는이 사건을 일으키기 위해'uniq a b c d'를 할 필요가 있다고 생각한다. – caf

0

방금 ​​언급 한대로 커버리지 기준을 충족시키는 테스트 사례의 자동 생성이 연구 주제에서 유용한 애플리케이션으로 전환되고 있음을 언급했습니다. 내가 아는 한 프로토 타입은 PathCrawler입니다.

이 도구 나 유사한 도구가 예상대로 작동하지 않을 수있는 소스 코드의 어려움은 일반적인 문제인 앨리어싱과 동적 메모리 할당입니다.

+0

안녕하세요, 근원에 대해 감사드립니다. 나는 그것을 조사 할 것이다. – naivedeveloper

+0

하, 당신은 매우 친절합니다. 당신은 저에게 한가지 예를 제공함에 대해 죄책감을 느낍니다. 따라서 다른 예가 있습니다 : http://www.cis.upenn.edu/~alur/CIS670/cute.pdf –

관련 문제