From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30286 invoked by alias); 11 Dec 2019 09:01:05 -0000 Mailing-List: contact gdb-testers-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-testers-owner@sourceware.org Received: (qmail 30265 invoked by uid 89); 11 Dec 2019 09:01:05 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-15.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=UD:info X-HELO: kwanyin.sergiodj.net Received: from kwanyin.sergiodj.net (HELO kwanyin.sergiodj.net) (158.69.185.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 11 Dec 2019 09:01:04 +0000 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [binutils-gdb] ubsan: csky: left shift cannot be represented in type 'int' From: gdb-buildbot@sergiodj.net To: gdb-testers@sourceware.org Message-Id: Date: Wed, 11 Dec 2019 09:06:00 -0000 X-SW-Source: 2019-q4/txt/msg04356.txt.bz2 *** TEST RESULTS FOR COMMIT d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a *** commit d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a Author: Alan Modra AuthorDate: Tue Dec 10 23:37:03 2019 +1030 Commit: Alan Modra CommitDate: Wed Dec 11 11:38:45 2019 +1030 ubsan: csky: left shift cannot be represented in type 'int' In the following buf is an unsigned char array, so elements are promoted to int before arithmetic operations. if (dis_info.info->endian == BFD_ENDIAN_BIG) while (n--) val |= buf[n] << (n*8); else for (i = 0; i < n; i++) val |= buf[i] << (i*8); * csky-dis.c (csky_chars_to_number): Rewrite. Avoid signed overflow when collecting bytes of a number. diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 6b76f158c9..5cd7361512 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2019-12-11 Alan Modra + + * csky-dis.c (csky_chars_to_number): Rewrite. Avoid signed + overflow when collecting bytes of a number. + 2019-12-11 Alan Modra * cris-dis.c (print_with_operands): Avoid signed integer diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c index ffdb596495..af830f3651 100644 --- a/opcodes/csky-dis.c +++ b/opcodes/csky-dis.c @@ -140,11 +140,11 @@ csky_chars_to_number (unsigned char * buf, int n) unsigned int val = 0; if (dis_info.info->endian == BFD_ENDIAN_BIG) - while (n--) - val |= buf[n] << (n*8); - else for (i = 0; i < n; i++) - val |= buf[i] << (i*8); + val = val << 8 | (buf[i] & 0xff); + else + for (i = n - 1; i >= 0; i--) + val = val << 8 | (buf[i] & 0xff); return val; }