From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7804 invoked by alias); 8 Feb 2004 14:20:41 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 7796 invoked by alias); 8 Feb 2004 14:20:40 -0000 Date: Sun, 08 Feb 2004 14:20:00 -0000 From: "gcc-bugzilla at gcc dot gnu dot org" To: gcc-bugs@gcc.gnu.org Message-ID: <20040208142032.14073.imbaczek@eros.vlo.ids.gda.pl> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug c++/14073] New: const * loses highest order byte. X-Bugzilla-Reason: CC X-SW-Source: 2004-02/txt/msg00950.txt.bz2 List-Id: Breakpoint 1, operator*(Liczba const&, Liczba const&) (a=@0xbffff960, b=@0xbffff8f0) at duze.cc:183 183 for (i = l2->start; i=l1->start; --j) { (gdb) continue Continuing. Program received signal SIGSEGV, Segmentation fault. 0x08048f0e in operator*(Liczba const&, Liczba const&) (a=@0xbffff960, b=@0xbffff8f0) at duze.cc:184 184 for (j = LEN-1; j>=l1->start; --j) { (gdb) Environment: System: Linux imbaczek 2.4.24-1-686 #1 Tue Jan 6 21:29:44 EST 2004 i686 GNU/Linux Architecture: i686 host: i486-pc-linux-gnu build: i486-pc-linux-gnu target: i486-pc-linux-gnu configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux How-To-Repeat: Complete source: // bignums.cc #include #include using namespace std; #define LEN 100 #define BASE 10 class Liczba { signed char liczba[LEN]; int len; int start; inline void from_string(const char *); public: Liczba(const char * s) { this->from_string(s); } Liczba(int i) { char s[LEN]; snprintf(s, LEN, "%d", i); this->from_string(s); } Liczba(const Liczba& l) { int i; for (i = 0; iliczba[i] = l.liczba[i]; this->len = l.len; this->start = l.start; } friend ostream& operator<<(ostream&, const Liczba&); friend istream& operator>>(istream&, Liczba&); friend bool operator<(const Liczba&, const Liczba&); friend bool operator==(const Liczba&, const Liczba&); friend Liczba& operator<<=(Liczba&, int); friend Liczba& operator+=(Liczba&, const Liczba&); friend Liczba& operator-=(Liczba&, const Liczba&); friend Liczba& operator*=(Liczba&, const Liczba&); friend Liczba& operator/=(Liczba&, const Liczba&); friend Liczba operator+(const Liczba&, const Liczba&); friend Liczba operator-(const Liczba&, const Liczba&); friend Liczba operator*(const Liczba&, const Liczba&); }; void Liczba::from_string(const char *s) { int i; len = strlen(s); start = LEN-len; for (i = 0; i>(istream& is, Liczba& l) { char s[LEN+1]; is >> s; l.from_string(s); return is; } // -------------------------------------------------------------------------- // porownania bool operator<(const Liczba& a, const Liczba& b) { int i; if (a.start > b.start) return true; else if (a.start < b.start) return false; i = a.start; while (a.liczba[i] == b.liczba[i]) ++i; if (a.liczba[i] < b.liczba[i]) return true; else return false; } // -------------------------------------------------------------------------- // przesuniecia Liczba& operator<<=(Liczba& a, int s) { int i; memmove(a.liczba+a.start-s, a.liczba+a.start, LEN-a.start); for (i = LEN-s; i < LEN; ++i) a.liczba[i] = 0; a.start -= s; return a; } // -------------------------------------------------------------------------- // dodawanie Liczba& operator+=(Liczba& a, const Liczba& b) { int i, c=0; for (i = LEN-1; i>=b.start; --i) { a.liczba[i] += b.liczba[i]; c = a.liczba[i]/BASE; a.liczba[i] %= BASE; a.liczba[i-1] += c; } if (b.start <= a.start) { a.start = b.start - c; a.len = b.len + c; } return a; } Liczba operator+(const Liczba& a, const Liczba& b) { Liczba r(a); r += b; return r; } // ------------------------------------------------------------------------- // odejmowanie Liczba& operator-=(Liczba& a, const Liczba& b) { int i, c=0; for (i = LEN-1; i>=b.start; --i) { a.liczba[i] -= b.liczba[i]; cout << (int)a.liczba[i] << ' '; c = -(a.liczba[i]<0); a.liczba[i] = (a.liczba[i]+BASE)%BASE; cout << c << ' ' << (int)a.liczba[i] << ' '; a.liczba[i-1] += c; cout << (int)a.liczba[i-1] << endl; } if (a.liczba[a.start] == 0) { ++a.start; --a.len; } return a; } Liczba operator-(const Liczba& a, const Liczba& b) { Liczba r(a); r -= b; return r; } // -------------------------------------------------------------------------- // mnozenie Liczba operator*(const Liczba& a, const Liczba& b) { Liczba tmp(0), r(0); const Liczba *l1=NULL, *l2=NULL; int i, j, tmp1; if (astart; i=l1->start; --j) { tmp1 = tmp.liczba[j-i] + l1->liczba[j] * l2->liczba[LEN-i-1]; tmp.liczba[j-i] = tmp1%10; tmp.liczba[j-i-1] = tmp1/10; } r += tmp; tmp = Liczba(0); } return r; } // -------------------------------------------------------------------------- void test() { char ch; Liczba a(0), b(0); // bug here, left as is while (cin) { cin >> ch >> a >> b; cout << a << ch << b << " = "; switch (ch) { case '+': cout << (a+b); break; case '-': cout << (a-b); break; case '<': cout << (a