X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Message-ID: Date: Tue, 13 Jan 2009 00:49:29 -0500 From: "Dan Tsafrir" Reply-To: dan DOT tsafrir AT gmail DOT com To: cygwin AT cygwin DOT com Subject: bug in cygwin's gcc/g++ getopt_long(): erroneous "ambiguous option" MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Hi, When given certain long options, Cygwin's getopt_long() function erroneously fails on "ambiguous option". The short program below illustrates the problem: getopt_long() wrongfully reports the "--xy" option as ambiguous. Strangely, if flipping the order of the 2nd and 3rd entries in the options-array (by compiling the program with -DNO_BUG) the bug goes away, clearly demonstrating inconsistent Cygwin/getopt_long behavior. The bug is triggered when compiling the program with Cygwin's default gcc/g++ (3.4.4) or with gcc-4/g++-4 (4.3.2). The bug does not occur when compiling the program with gcc/g++ (ver 3 or 4) on other OSes (e.g., Linux). A fix would be appreciated. Best, --Dan // start program: #include #include const struct option lopts[] = { #ifdef NO_BUG {"xy1" , required_argument, NULL, 'a' }, {"xy" , required_argument, NULL, 'b' }, {"xy2" , required_argument, NULL, 'c' }, {NULL , 0 , NULL, 0 }, #else /* swapping order of 2nd and 3rd entries generates the bug */ {"xy1" , required_argument, NULL, 'a' }, {"xy2" , required_argument, NULL, 'c' }, {"xy" , required_argument, NULL, 'b' }, {NULL , 0 , NULL, 0 }, #endif }; int main() { const char* argv[] = {"./a", "--xy=1", NULL}; int argc = 2; int index, c; // if NO_BUG defined, will print: "got opt=b" [OK] // otherwise: "a: ambiguous option -- xy" [BUG] if( (c = getopt_long(argc, (char**)argv, "A:B:C", lopts, &index)) != EOF ) printf("got opt=%c\n", c); return 0; } // end program -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/