X-Recipient: archive-cygwin AT delorie DOT com X-Original-To: cygwin AT cygwin DOT com Delivered-To: cygwin AT cygwin DOT com DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 653E4385828E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=dinwoodie.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dinwoodie.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dinwoodie.org; s=google; h=date:from:to:subject:message-id:reply-to:references:mime-version :content-disposition:in-reply-to; bh=WcVgnZdRyvKNwt3CuPK7dLPrr+iffJfBV+MVCw6pSiE=; b=dQLybd2DFUlVJ3QAIQVKduBouiTVPk+kFzjvV1/evzPvmrym63DZtvTGaRjvVreIrO 5doyPs0KokhJTzgrYhu8aqXEhAXBVZP+D1P3BAzAEhBew0w7SVW/WkUxURq3fYmMCN3y Or2kS4DYvAZ1SLc6Sh17QvX/pm797taAeJ5+U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:subject:message-id:reply-to :references:mime-version:content-disposition:in-reply-to; bh=WcVgnZdRyvKNwt3CuPK7dLPrr+iffJfBV+MVCw6pSiE=; b=H9FKk8kHVsP9tqiC84/P5/5WLtGzmb2D0pGm7h43qFUPTH5R65FqYy8mc32Pr8EGg2 G0l/i7hbghj1FrtXWydU9YoG1h0qXCJglOxd2073Snl1NXYIlJ2nFgklTAkhEO5Ur+Ay GpiM+5y9Rrl6e7KNlT828NSsQ2CzbxvFTm1qa1rCM2NxJEFBFUeIhLxy918M4KLDqQ5K 5CQoQKi5nP9uC6Yg2NrM/pUtak/fpn0cs/k3aBV8dbCHeIa54xhtxt0REaKAq+wBcN7L DTBs1zeQ9L5tyWy7I2xOG7E1RzryJUrqsoAXb0Sn158dJ4xRO6devReohCk6emrYfohp W5qw== X-Gm-Message-State: AJIora8d+KZX6RNCw4EpbYa2I3toyr1vZ6YjeH5MSi5QfLaUhGOBnwo6 eGAnn0jIvi0xVtdA6YZIUUfritzXN0Lm8w== X-Google-Smtp-Source: AGRyM1s5PfGstrPINs1VL9OKDHvNNOeojfF3zUKGg1KpAdJYAQEGDIGLDRe3hvHEDEh3blwcQTAxKQ== X-Received: by 2002:a5d:648c:0:b0:21d:1475:8b68 with SMTP id o12-20020a5d648c000000b0021d14758b68mr19131388wri.588.1656797677000; Sat, 02 Jul 2022 14:34:37 -0700 (PDT) Date: Sat, 2 Jul 2022 22:34:35 +0100 From: Adam Dinwoodie To: cygwin AT cygwin DOT com Subject: Re: Unexpected zero return code from `throw std::runtime_error` Message-ID: <20220702213435.hkdcsjm7jzbc7im4@lucy.dinwoodie.org> References: <20220702132158 DOT g6u7wo2lnokgezoc AT lucy DOT dinwoodie DOT org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: cygwin AT cygwin DOT com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: cygwin AT cygwin DOT com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com Sender: "Cygwin" On Sat, Jul 02, 2022 at 10:19:44PM +0200, Csaba Raduly wrote: > On Sat, 2 Jul 2022 at 15:22, Adam Dinwoodie wrote: > > > > I'm currently experimenting with compiling rdfind for Cygwin, and one of > > the testcases is failing because std::runtime_error is expected to > > result in the compiled program exiting with a non-zero return code, > > but on Cygwin, it just seems to cause the program to terminate with a > > zero return code. > > > > I've attached a simple test case. Compare the output on Cygwin... > > > > $ ./test.sh > > + cat > > + g++ test.cc > > + [[ -x a.exe ]] > > + ./a.exe > > + rc=0 > > + (( rc == 0 )) > > + echo 'Unexpected zero return code from execution' > > Unexpected zero return code from execution > > + exit 1 > > > > ...with the output from one of my Debian boxes... > > > > $ ./test.sh > > + cat > > + g++ test.cc > > + [[ -x a.exe ]] > > + [[ -x a.out ]] > > + ./a.out > > terminate called after throwing an instance of 'std::runtime_error' > > what(): Test error > > ./test.sh: line 21: 566327 Aborted ./a.out > > + rc=134 > > + (( rc == 0 )) > > + echo 'Expected non-zero return code received: 134' > > Expected non-zero return code received: 134 > > + exit 0 > > > > I'm not massively familiar with C++, so I could well be missing > > something obvious, but this seems like an unexpected difference between > > Cygwin and other *nix platforms. Is this a Cygwin bug, or am I doing > > something wrong? > > > Works just fine for me, unless I misunderstood something. > > $ /cygdrive/c/Users/Csaba/Downloads/test.sh > + cat > + g++ test.cc > + [[ -x a.exe ]] > + ./a.exe > terminate called after throwing an instance of 'std::runtime_error' > what(): Test error > /cygdrive/c/Users/Csaba/Downloads/test.sh: line 21: 641 Aborted > (core dumped) ./a.exe > + rc=134 > + (( rc == 0 )) > + echo 'Expected non-zero return code received: 134' > Expected non-zero return code received: 134 > + exit 0 That's definitely closer to the behaviour I'd expect! I don't think it should be dumping a core, though, at least based on the behaviour I see on Debian. I'd like to have a look at what's different about your environment; could you share the output from `cygcheck -srv >cygcheck.out` on your system? > The if goes in the "else" case because rc is not 0, as it should be. > (shoudn't the condition be $rc == 0 ?) > After > > $ diff -u /cygdrive/c/Users/Csaba/Downloads/test.sh test.sh > --- /cygdrive/c/Users/Csaba/Downloads/test.sh 2022-07-02 > 22:09:21.506377100 +0200 > +++ test.sh 2022-07-02 22:15:08.670809700 +0200 > @@ -20,7 +20,8 @@ > exit 2 > fi > > -if (( rc == 0 )); then > +if [[ $rc == 0 ]] > +then > echo 'Unexpected zero return code from execution' > exit 1 > else > > I get > > $ ./test.sh > + cat > + g++ test.cc > + [[ -x a.exe ]] > + ./a.exe > terminate called after throwing an instance of 'std::runtime_error' > what(): Test error > ./test.sh: line 21: 660 Aborted (core dumped) ./a.exe > + rc=134 > + [[ 134 == 0 ]] > + echo 'Expected non-zero return code received: 134' > Expected non-zero return code received: 134 > + exit 0 `(( rc == 0 ))` is comparing the value of `$rc` against the number 0; the `$` isn't necessary in `(( ... ))` tests. `(( rc == 0 ))` is essentially identical to `[[ $rc -eq 0 ]]`. Your change means the comparison is done as a string comparison rather than a numeric comparison. That doesn't make any difference here: '0' is '0' regardless of whether you're testing it as a number or as a string. -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple