From owner-freebsd-questions@FreeBSD.ORG Mon May 18 11:55:10 2015 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 6A2991F2 for ; Mon, 18 May 2015 11:55:10 +0000 (UTC) Received: from mx01.qsc.de (mx01.qsc.de [213.148.129.14]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2C5041C20 for ; Mon, 18 May 2015 11:55:09 +0000 (UTC) Received: from r56.edvax.de (port-92-195-33-186.dynamic.qsc.de [92.195.33.186]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx01.qsc.de (Postfix) with ESMTPS id 3C4703CD1F; Mon, 18 May 2015 13:55:07 +0200 (CEST) Received: from r56.edvax.de (localhost [127.0.0.1]) by r56.edvax.de (8.14.5/8.14.5) with SMTP id t4IBt7so002069; Mon, 18 May 2015 13:55:07 +0200 (CEST) (envelope-from freebsd@edvax.de) Date: Mon, 18 May 2015 13:55:07 +0200 From: Polytropon To: gyliamos@gmail.com Cc: freebsd-questions@freebsd.org Subject: Re: Strange return codes from old but good C program Message-Id: <20150518135507.ada90d25.freebsd@edvax.de> In-Reply-To: References: <20150517204503.V69409@sola.nimnet.asn.au> <20150517124223.GA82704@ozzmosis.com> <5558A2D0.8080207@hiwaay.net> <20150517171713.09b01ec4.freebsd@edvax.de> Reply-To: Polytropon Organization: EDVAX X-Mailer: Sylpheed 3.1.1 (GTK+ 2.24.5; i386-portbld-freebsd8.2) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 May 2015 11:55:10 -0000 On Sun, 17 May 2015 19:45:09 +0000 (UTC), Will Parsons wrote: > I don't have the actual C standard, but Harbison & Steele's "C - A > Reference Manual" (which I think can be relied on) states "If the end > of the body of *main* is reached without returning, it is treated as > if *return 0;* were executed". In that case, no random return codes should appear. It also doesn't meet the little test I've wrote (which again matches with the initially described problem). I have written (haha) the following "test case": % cat returntest.c main() { int i, j; for(i = 0, j = 0; i < 100; i++) j += i; } There are two "error" in it: main() doesn't have a return type assigned, so per standard (int) will be assumed. And there is no return statement. Compiler is system's gcc (older system, obviously): % cc -Wall -o returntest returntest.c returntest.c:1: warning: return type defaults to 'int' returntest.c: In function 'main': returntest.c:5: warning: control reaches end of non-void function This is what we expect. But the program can be run, and we see: % ./returntest ; echo $? 99 The return code is somehow assigned to the 'i' variable. Why? Probably because it's stored in a register, and this register is being used by the exit() and _exit() chain to represent the return code. Funnily, when the program is modified: main() { int i, j; for(i = 0, j = 0; i > -100; i--) j += i; } The compiler warnings are the same. This is the result now: % ./returntest ; echo $? 157 None of them looks like an implicit "return 0;". I am not judging Harbison & Steele, I'm just observing things. :-) -- Polytropon Magdeburg, Germany Happy FreeBSD user since 4.0 Andra moi ennepe, Mousa, ...