2011-07-18 3 views
13

getopt_long_only를 사용하여 명령 줄을 구문 분석하려고합니다. 내 응용 프로그램은 몇 가지 명령 행 옵션을 읽습니다.getopt_long_only 세분화 오류

예. "app --alpha = 1 - 베타 = 2 --cecil = 3"

유효한 명령 줄 매개 변수가 전달되는 한 getopt_long_only는 정상적으로 작동합니다. 그러나 잘못된 "단일 점선 "옵션을 사용하면 부적절한 장소에서 seg fault crash가 발생합니다. 무슨 일 이니? getopt_long_only가 잘못된 인수에 대해 복원력이없는 것처럼 보입니다. 아니면 함수를 잘못 호출 했습니까?

예 : 아래

> ./app --beta=1 -? 
starting 
index = 1 ret=0 optarg=1 
Segmentation fault 

코드 (C++ : app.cc)

#include <stdio.h> 
#include <getopt.h> 

void ProcessCommandLineArgs(int argc, char** argv) 
{ 

    option longopts[] = { 
     {"alpha", optional_argument, 0, 0}, 
     {"beta", optional_argument, 0, 0}, 
     {"cecil", optional_argument, 0, 0} 
    }; 

    int index; 
    int ret; 
    bool fParseError = false; 

    while (true) 
    { 
     ret = ::getopt_long_only(argc, argv, "", longopts, &index); 

     if (ret < 0) 
     { 
      break; 
     } 

     if ((ret == '?') || (ret == ':')) 
     { 
      fParseError = true; 
      break; 
     } 

     printf("index = %d ret=%d optarg=%s\n", index, ret, optarg?optarg:"<null>"); 
    } 
} 

int main(int argc, char** argv) 
{ 
    printf("starting\n"); 
    ProcessCommandLineArgs(argc, argv); 
    printf("exiting\n"); 
    return 0; 
} 
+1

'int index;'를'int index = 0';로 변경하면 여전히 충돌이 발생합니까? – OneOfOne

+0

감사합니다 1of1. 내가 그것을했을 때 실제로 멈추지 않았다. 어떤 의미가 없어 .... 그래서 나는 man 페이지에서 더 깊은 잠수를했다. 그 결과, 배열의 마지막 행을 올바르게 null로 끝내는 것을 잊고 있다는 것을 알게되었습니다. – selbie

답변

17

나는 문제를 발견했다.

옵션 배열 선언 끝에 "제로 행"이 있다는 것을 잊었습니다.

option longopts[] = { 
    {"alpha", optional_argument, 0, 0}, 
    {"beta", optional_argument, 0, 0}, 
    {"cecil", optional_argument, 0, 0}, 
    {NULL, 0, 0, 0} 
};