Package: gcc-4.2 Version: 4.2.3-2 --- Please enter the report below this line. ---
I have manually reduced the previous testcase (it is 4K now, vs 32K). The same testcase can be used for both x86_64 and x86(-32). When I compile with -O3, or -O2 -finline-functions incorrect code is generated. $ gcc-4.2 -O2 -finline-functions gcc42_O3_bug.i $ ./a.out Aborted $ gcc-4.2 -O2 gcc42_O3_bug.i $ ./a.out $ valgrind ./a.out .... ==11486== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 1) ..... $ sh -x ./test.sh gcc42_O3_bug.i + gcc-4.3 -fstack-protector-all -O1 -Wfatal-errors -Werror -Wno-unused gcc42_O3_bug.i -o works3 + test 0 == 0 + ulimit -t 1 + ./works3 + test 0 == 0 + gcc-4.2 -Wall -Wfatal-errors -Werror -Wno-unused -O3 gcc42_O3_bug.i -o fails + test 0 == 0 + ulimit -t 1 + ./fails ./test.sh: line 24: 11426 Aborted ./fails 2>/dev/null + test 134 == 134 + exit 0 If you need more info, please ask. --- System information. --- Architecture: amd64 Kernel: Linux 2.6.25-rc4-00134-g84c6f60 Debian Release: lenny/sid 500 unstable www.debian-multimedia.org 500 unstable ftp.iasi.roedu.net 500 testing ftp.iasi.roedu.net 500 gutsy wine.budgetdedicated.com 1 experimental ftp.iasi.roedu.net --- Package information. --- Depends (Version) | Installed =====================================-+-===================== binutils (>= 2.17cvs20070426) | 2.18.1~cvs20080103-1 cpp-4.2 (= 4.2.3-2) | 4.2.3-2 gcc-4.2-base (= 4.2.3-2) | 4.2.3-2 libc6 (>= 2.7-1) | 2.7-9 libgcc1 (>= 1:4.2.3-2) | 1:4.3.0-1
typedef unsigned long int uint64_t; void cli_dbgmsg_internal(const char *str,...) { } typedef long unsigned int size_t; extern int memcmp (__const void *__s1, __const void *__s2, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern void abort (void) __attribute__ ((__nothrow__)) __attribute__ ((__noreturn__)); unsigned char data[] = { 0x50, 0x4d, 0x47, 0x4c, 0x38, 0x01, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x2f, 0x00, 0x00, 0x00, 0x06, 0x2f, 0x23, 0x42, 0x53, 0x53, 0x43, 0x01, 0x88, 0x90, 0x79, 0x09, 0x08, 0x2f, 0x23, 0x49, 0x44, 0x58, 0x48, 0x44, 0x52, 0x01, 0xc0, }; typedef long int __off_t; typedef __off_t off_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; uint8_t cli_debug_flag=0, cli_leavetemps_flag; typedef struct chm_itsf_header_tag { uint32_t block_len __attribute__ ((packed)); } chm_itsp_header_t; typedef struct chm_metadata_tag { char *m_area; chm_itsp_header_t itsp_hdr; off_t chunk_offset; char *chunk_data; char *chunk_current; char *chunk_end; uint16_t chunk_entries; } chm_metadata_t; int cli_chm_open( chm_metadata_t *metadata); int cli_chm_prepare_file(int fd, chm_metadata_t *metadata); static uint64_t read_enc_int(char **start, char *end) { uint64_t retval=0; char *current; current = *start; do { retval = (retval << 7) | (*current & 0x7f); } while (*current++ & 0x80); *start = current; return retval; } static int prepare_file(int fd, chm_metadata_t *metadata) { uint64_t name_len, section; while (metadata->chunk_entries != 0) { if (metadata->chunk_current >= metadata->chunk_end) { } name_len = read_enc_int(&metadata->chunk_current, metadata->chunk_end); if (((metadata->chunk_current + name_len) >= metadata->chunk_end) || ((metadata->chunk_current + name_len) < metadata->chunk_data)) { (!__builtin_expect(!!(cli_debug_flag), 0)) ? (void)0 : cli_dbgmsg_internal("Bad CHM name_len detected\n"); } metadata->chunk_current += name_len; section = read_enc_int(&metadata->chunk_current, metadata->chunk_end); if(section == 47) { abort(); } if (section == 1) { return 0; } } return 0; } static int read_chunk(chm_metadata_t *metadata, int fd) { if (metadata->m_area != ((void *)0)) { metadata->chunk_data = metadata->m_area + metadata->chunk_offset; } metadata->chunk_current = metadata->chunk_data + (0x14); if (memcmp(metadata->chunk_data, "PMGL", 4) == 0) { metadata->chunk_entries = (uint16_t)((((uint8_t const *)(metadata->chunk_data))[metadata->itsp_hdr.block_len-2] << 0) | (((uint8_t const *)(metadata->chunk_data))[metadata->itsp_hdr.block_len-1] << 8)); } return 0; } int main() { int ret; chm_metadata_t metadata; ret = cli_chm_open(&metadata); ret = cli_chm_prepare_file(-1, &metadata); return 0; } int cli_chm_prepare_file(int fd, chm_metadata_t *metadata) { int retval; metadata->chunk_entries=0; do { if (metadata->chunk_entries == 0) { if ((retval = read_chunk(metadata, fd)) != 0) { } } retval = prepare_file(fd, metadata); } while (retval == 2); return 0; } int cli_chm_open(chm_metadata_t *metadata) { metadata->m_area = (char*)data; metadata->itsp_hdr.block_len = 0x0a; metadata->chunk_offset = 0; return 0; }