[Bug c/36494] New: Char arrays gets corrupted in avr programs.

martin at kfib dot org gcc-bugzilla@gcc.gnu.org
Tue Jun 10 21:23:00 GMT 2008


I've seen this bug in 4.1.2, 4.2.0, 4.2.1, 4.2.2, 4.3.0 and 4.3.1 (and at least
with the version 4.1.2 and 4.3.0 of the avr-gcc-c++-compiler). What happens is
that when a char array gets a value assigned through a quoted string, the data
gets corrupted (or lost) in the compilation, but if it's initialized with an
array of numbers it gets the correct value. I've created a small example:

#include <avr/io.h>

int main ()
{
  char a[] = ":";
  char b[] = { 0x3a, 0 };
  int result = 0;

  if (a[0] == 0x3a) result |= 1;
  if (b[0] == 0x3a) result |= 2;

  DDRC = 0x0f;
  PORTC = result;

  return 0;
}

The expected result is of course 3 (which I get if I compile a slightly
modified program for i386) but what I get is 2. In my world that's not quite
accepted, I hope you all concur. The include file and the macros for DDRC and
PORTC doesn't matter, I've verified with dummy values that they're ok.

[martin@chip ~]$ avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../gcc-4.3.1/configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --target=avr --enable-languages=c,c++ --disable-nls
--disable-libssp --with-system-zlib --enable-version-specific-runtime-libs
Thread model: single
gcc version 4.3.1 (GCC) 
[martin@chip ~]$ uname -a
Linux chip.chaos 2.6.24.7-92.fc8 #1 SMP Wed May 7 16:50:09 EDT 2008 i686 athlon
i386 GNU/Linux

Flags used while compiling are -mmcu=atmega48 -Wall. Optimization doesn't seem
to make any difference. The .i-file looks like this:

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 1 3
# 87 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/sfr_defs.h" 1 3
# 126 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/sfr_defs.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/inttypes.h" 1 3
# 37 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/inttypes.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 1 3
# 121 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int int8_t __attribute__((__mode__(__QI__)));
typedef unsigned int uint8_t __attribute__((__mode__(__QI__)));
typedef int int16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__)));
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__)));

typedef int int64_t __attribute__((__mode__(__DI__)));
typedef unsigned int uint64_t __attribute__((__mode__(__DI__)));
# 142 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int16_t intptr_t;




typedef uint16_t uintptr_t;
# 159 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int8_t int_least8_t;




typedef uint8_t uint_least8_t;




typedef int16_t int_least16_t;




typedef uint16_t uint_least16_t;




typedef int32_t int_least32_t;




typedef uint32_t uint_least32_t;







typedef int64_t int_least64_t;






typedef uint64_t uint_least64_t;
# 213 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int8_t int_fast8_t;




typedef uint8_t uint_fast8_t;




typedef int16_t int_fast16_t;




typedef uint16_t uint_fast16_t;




typedef uint64_t uint_least64_t;
# 213 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int8_t int_fast8_t;




typedef uint8_t uint_fast8_t;




typedef int16_t int_fast16_t;




typedef uint16_t uint_fast16_t;




typedef int32_t int_fast32_t;




typedef uint32_t uint_fast32_t;







typedef int64_t int_fast64_t;






typedef uint64_t uint_fast64_t;
# 273 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/stdint.h" 3
typedef int64_t intmax_t;




typedef uint64_t uintmax_t;
# 38 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/inttypes.h" 2 3
# 77 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/inttypes.h" 3
typedef int32_t int_farptr_t;



typedef uint32_t uint_farptr_t;
# 127 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/sfr_defs.h" 2 3
# 88 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 2 3
# 290 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/iom48.h" 1 3
# 36 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/iom48.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/iomx8.h" 1 3
# 37 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/iom48.h" 2 3
# 291 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 2 3
# 360 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/portpins.h" 1 3
# 361 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 2 3
# 370 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 3
# 1 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/version.h" 1 3
# 371 "/usr/lib/gcc/avr/4.3.1/../../../../avr/include/avr/io.h" 2 3
# 2 "test.c" 2

int main ()
{
  char a[] = ":";
  char b[] = { 0x3a, 0 };
  int result = 0;

  if (a[0] == 0x3a) result |= 1;
  if (b[0] == 0x3a) result |= 2;

  (*(volatile uint8_t *)((0x07) + 0x20)) = 0x0f;
  (*(volatile uint8_t *)((0x08) + 0x20)) = result;

  return 0;
}

I'll of course try to answer any questions as prompt and detailed as possible.

Regards

/Martin


-- 
           Summary: Char arrays gets corrupted in avr programs.
           Product: gcc
           Version: 4.3.1
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: martin at kfib dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36494



More information about the Gcc-bugs mailing list