unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Dave Abrahams <dave@boostpro.com>
To: emacs-devel@gnu.org
Subject: Re: Should undefined behavior be encouraged in Emacs?
Date: Mon, 03 Oct 2011 10:49:31 -0400	[thread overview]
Message-ID: <m2sjnauo3o.fsf@pluto.luannocracy.com> (raw)
In-Reply-To: 4E89124D.8070405@cs.ucla.edu


on Sun Oct 02 2011, Paul Eggert <eggert-AT-cs.ucla.edu> wrote:

> A recent comment in Bug#9642 advocates another approach: undefined
> behavior.  For example, it proposes that move-overlay should have
> undefined behavior when given arguments like -5 that are out of
> range.  In other words, (move-overlay OVERLAY -5 1) might signal
> an error, or substitute an in-range value, or wrap around, or
> return a data structure that subtly violates some other guarantee
> made by Emacs; or it might do one of these things sometimes and
> another at other times.  In short, undefined behavior means that
> move-overlay might do *anything* when given out-of-range
> arguments.
>
> The argument given for undefined behavior is that it simplifies
> maintenance of Emacs internals.

Such an interesting question!  

Unefined behavior gets a bad rap, but it has at least one important use:
it distinguishes things that are definitely programming bugs from
everything else.  It is perfectly legitimate (and even encouraged style
in some languages) to rely on the defined behavior that certain
out-of-range arguments will cause errors to be signaled, e.g. for loop
termination:

   (condition-case nil
     (let ((n 0))
        (while t 
         (frobnicate (get-item n))
         (setq n (+ n 1))))
     (error "index out of range"))

The problem with this is that when you see a signal come out of get-item
you can't tell whether it indicates a bug or not.  So I actually favor
something stronger than ordinary defined behavior for out-of-range
arguments.

For elisp programs, I don't think completely *undefined* behavior
(reformat your hard disk, launch a missile) is such a hot idea, since it
should in principle be easy to limit the range of responses to things
that are less damaging.  Maybe unspecified behavior, as suggested
elsewhere in this thread, is closer to the mark.

As the author of get-item above, I'd probably want to express the
unspecified behavior by forcing the debugger to come up, with *no
possibility* of it being suppressed by surrounding constructs such as
condition-case (is that possible in elisp?).  But I wouldn't want anyone
trying to rely on that behavior except maybe as a debugging aid.

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com




      parent reply	other threads:[~2011-10-03 14:49 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-03  1:39 Should undefined behavior be encouraged in Emacs? Paul Eggert
2011-10-03  3:11 ` Stefan Monnier
2011-10-03  6:39   ` Andreas Röhler
2011-10-03  7:29     ` Stephen J. Turnbull
2011-10-03  8:58       ` Andreas Röhler
2011-10-06  2:17         ` Stephen J. Turnbull
2011-10-06 17:30           ` Richard Stallman
2011-10-06 19:49             ` Stephen J. Turnbull
2011-10-06 20:08               ` Andreas Röhler
2011-10-06 20:12                 ` Lars Magne Ingebrigtsen
2011-10-06 20:46                   ` Eli Zaretskii
2011-10-07  5:23                   ` Andreas Röhler
2011-10-07  7:44                   ` Stephen J. Turnbull
2011-10-07  7:52                     ` John Wiegley
2011-10-07 17:27                       ` Stephen J. Turnbull
2011-10-07  8:38                   ` Alan Mackenzie
2011-10-07 15:26                   ` Barry Warsaw
2011-10-07 18:06                     ` ken manheimer
2011-10-07 18:21                       ` Barry Warsaw
2011-10-07 18:46                       ` Óscar Fuentes
2011-10-07 19:59                         ` ken manheimer
2011-10-07 18:41                     ` Drew Adams
2011-10-08 13:49                   ` Miles Bader
2011-10-08 14:34                     ` Drew Adams
2011-10-03 13:16       ` Stefan Monnier
2011-10-03  9:20   ` Alan Mackenzie
2011-10-03  9:52     ` Eli Zaretskii
2011-10-03  8:29 ` Andreas Schwab
2011-10-03  9:53   ` Eli Zaretskii
2011-10-03 13:13 ` Richard Stallman
2011-10-03 15:15   ` Dave Abrahams
2011-10-04  1:55     ` Richard Stallman
2011-10-04  2:18       ` Dave Abrahams
2011-10-03 16:14   ` Eli Zaretskii
2011-10-03 16:27     ` Andreas Schwab
2011-10-03 16:41       ` Eli Zaretskii
2011-10-04  1:55     ` Richard Stallman
2011-10-03 20:53   ` Paul Eggert
2011-10-03 14:49 ` Dave Abrahams [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2sjnauo3o.fsf@pluto.luannocracy.com \
    --to=dave@boostpro.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).