From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by sourceware.org (Postfix) with ESMTPS id 653E4385828E for ; Sat, 2 Jul 2022 21:34:38 +0000 (GMT) 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 Received: by mail-wr1-x435.google.com with SMTP id d16so1669868wrv.10 for ; Sat, 02 Jul 2022 14:34:38 -0700 (PDT) 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) Received: from lucy.dinwoodie.org (b.8.0.0.8.9.b.0.2.f.0.9.2.a.d.b.d.a.0.2.5.1.e.d.0.b.8.0.1.0.0.2.ip6.arpa. [2001:8b0:de15:20ad:bda2:90f2:b98:8b]) by smtp.gmail.com with ESMTPSA id o15-20020a05600c510f00b003971fc23185sm11093573wms.20.2022.07.02.14.34.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 Jul 2022 14:34:36 -0700 (PDT) Received: from adam by lucy.dinwoodie.org with local (Exim 4.94.2) (envelope-from ) id 1o7kl9-002hdS-22 for cygwin@cygwin.com; Sat, 02 Jul 2022 22:34:35 +0100 Date: Sat, 2 Jul 2022 22:34:35 +0100 From: Adam Dinwoodie To: cygwin@cygwin.com Subject: Re: Unexpected zero return code from `throw std::runtime_error` Message-ID: <20220702213435.hkdcsjm7jzbc7im4@lucy.dinwoodie.org> Reply-To: cygwin@cygwin.com References: <20220702132158.g6u7wo2lnokgezoc@lucy.dinwoodie.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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@cygwin.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: , X-List-Received-Date: Sat, 02 Jul 2022 21:34:40 -0000 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.