This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Segmentation faults using setw() manipulator
- To: gcc-bugs at gcc dot gnu dot org
- Subject: Segmentation faults using setw() manipulator
- From: Simon Pamment <simon528 at home dot com>
- Date: Tue, 23 Jan 2001 15:59:14 -0600
- Mailer: Emacs [20.7]
- Reply-to: simon528 at home dot com
I am using a snapshot taken today (23/1/2001) on an i686 linux
platform and am having a problem with setw() whereby for some
widths outputting a character string will result in a segmentation
fault.
The following sample program illustrates this for the case where
the output string is "ABC" and the format width is 27.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#include <iostream>
#include <iomanip>
int
main(int, char*[])
{
std::cout << "Result = [" << std::setw(27) << "ABC" << "]\n";
return 0;
}
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Trying different combinations of strings and widths suggests that
there may be somewhat of a pattern. For a given string the above
program will correctly format it up to a certain width (call it W).
For widths greater than W the program exhibits one of two modes of
behaviour depending on whether the length of the string being
output is even or odd.
* If the length is even, the program will seg fault for all lengths
greater than W.
* If the length is odd, the program will output a corrupt string
(of the correct length) for width W+1 and will seg fault for all
widths greater than W+1.
The following table summarises the situation for successively
larger strings.
output | maximum | width for | minimum
string | width for | corrupt | width for
| success | output | seg fault
===========+============+============+============
"" | 24 | | 25
"A" | 24 | 25 | 26
"AB" | 25 | | 26
"ABC" | 25 | 26 | 27
"ABCD" | 26 | | 27
"ABCDE" | 26 | 27 | 28
"ABCDEF" | 27 | | 28
"ABCDEFG" | 27 | 28 | 29
I would be interested to know if anybody else can duplicate this
problem (at least on an Intel 686 platform).
In case it is useful the following is the output when compiling the
program with the verbose flag.
g++ -v -o sw sw.cc
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Reading specs from /work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/specs
Configured with: /work/exp/local/src/gcc.src/gcc/configure --enable-shared --with-gnu-as --with-gnu-ld --prefix=/work/exp/local
gcc version 2.97 20010123 (experimental)
/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/cc1plus -v -D__GNUC__=2 -D__GNUC_MINOR__=97 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__STDC_HOSTED__=1 -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ sw.cc -D__GNUG__=2 -D_GNU_SOURCE -D__GXX_ABI_VERSION=100 -quiet -dumpbase sw.cc -version -o /tmp/ccyiv5Pa.s
GNU CPP version 2.97 20010123 (experimental) (cpplib) (i386 Linux/ELF)
GNU CPP version 2.97 20010123 (experimental) (cpplib) (i386 Linux/ELF)
GNU C++ version 2.97 20010123 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 2.97 20010123 (experimental).
ignoring nonexistent directory "/usr/local/include"
#include "..." search starts here:
#include <...> search starts here:
/work/exp/local/include/g++-v3
/work/exp/local/i686-pc-linux-gnu/include/g++-v3
/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/include
/work/exp/local/i686-pc-linux-gnu/include
/usr/include
End of search list.
/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/../../../../i686-pc-linux-gnu/bin/as -V -Qy -o /tmp/ccg03AO9.o /tmp/ccyiv5Pa.s
GNU assembler version 2.10.1 (i686-pc-linux-gnu) using BFD version 2.10.1
/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o sw /usr/lib/crt1.o /usr/lib/crti.o /work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/crtbegin.o -L/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97 -L/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/../../../../i686-pc-linux-gnu/lib -L/work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/../../.. /tmp/ccg03AO9.o -lstdc++ -lm -lgcc -lc -lgcc /work/exp/local/lib/gcc-lib/i686-pc-linux-gnu/2.97/crtend.o /usr/lib/crtn.o
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=