This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

src/gdb ChangeLog top.c


CVSROOT:	/cvs/src
Module name:	src
Changes by:	palves@sourceware.org	2013-03-27 12:14:09

Modified files:
	gdb            : ChangeLog top.c 

Log message:
	Forbid "set history size (INT_MAX..UINT_MAX)"
	
	The whole readline interface is signed, and works with the 0..INT_MAX
	range.
	
	We don't allow setting the size to UINT_MAX directly.  The documented
	user visible interface is "use 0 for unlimited".  The UINT_MAX
	representation is an implementation detail we could change, e.g., by
	keeping a separate flag for "unlimited", which is actually what the
	readline interface does (stifled vs non stifled).  Generically
	speaking, exposing this detail to clients of the interface may make
	our lives complicated when we find the need to extend the range of
	some command in the future, and it's better if users
	(frontends/scripts) aren't relying on anything but what we tell them
	to use for "unlimited".  Making values other than 0 error out is the
	way to prevent users from using those ranges inappropriately.  Quite
	related, note:
	
	(gdb) set history size 0xffffffff
	integer 4294967295 out of range
	
	But,
	
	(gdb) set history size 0xfffffffe
	(gdb) show history size
	The size of the command history is unlimited.
	
	(gdb) set history size 0x100000000
	integer 4294967296 out of range
	
	If values over INT_MAX are accepted as unlimited, then there's no good
	argument for only accepting [INT_MAX..UINT_MAX) as valid "unlimited"
	magic numbers, while not accepting [UINT_MAX..inf).
	
	Making the setting's control variable of different type (unsigned int)
	of the rest of the related code (int) adds the need to recall that one
	variable among all these is unsigned, and that one need to think about
	whether these comparisons are signed or unsigned, along with the
	promotion/conversion rules.  Since this is an easy to forget detail,
	this patch renames the variable to at least make it more obvious that
	this variable is not one of GNU history's public int variables, which
	are all signed.  We don't actually need the only code that presently
	is affected by this, though, the code that is computing the current
	history's length.  We can just use GNU history's history_length
	instead:
	
	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	Variable: int history_length
	The number of entries currently stored in the history list.
	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	/* Return the history entry which is logically at OFFSET in the history array.
	OFFSET is relative to history_base. */
	HIST_ENTRY *
	history_get (offset)
	int offset;
	{
	int local_index;
	
	local_index = offset - history_base;
	return (local_index >= history_length || local_index < 0 || the_history == 0)
	? (HIST_ENTRY *)NULL
	: the_history[local_index];
	}
	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	At the time this code was added (gdb 4.13 ~1994), 'history_length' was
	extern, but not documented in readline's GNU history documents, so I
	guess it wasn't considered public then and the loop was the
	workaround.
	
	One of the warts of GDB choosing 0 to mean unlimited is that "set
	history size 0" behaves differently from 'HISTSIZE=0 gdb'.  The latter
	leaves GDB with no history, while the former means "unlimited"...
	
	$ HISTSIZE=0 ./gdb
	...
	(gdb) show history size
	The size of the command history is 0.
	
	We shouldn't really change what HISTSIZE=0 means, as bash, etc. also
	handle 0 as real zero, and zero it's what really makes sense.
	
	gdb/
	2013-03-27  Pedro Alves  <palves@redhat.com>
	
	* top.c (history_size): Rename to ...
	(history_size_setshow_var): ... this.  Add comment.
	(show_commands): Use readline's 'history_length' instead of
	computing the history length by calling history_get in a loop.
	(set_history_size_command): Error out for sizes over INT_MAX.
	Restore previous history size on invalid size.
	(init_history): If HISTSIZE is negative, leave the history size as
	zero.  Add comments.
	(init_main): Adjust.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.15325&r2=1.15326
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/top.c.diff?cvsroot=src&r1=1.230&r2=1.231


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]