https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108345

            Bug ID: 108345
           Summary: Mismatch __attribute__((aligned(x))) between
                    declaration and definition does not raise
                    error/warning
           Product: gcc
           Version: 10.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dumoulin.thibaut at gmail dot com
  Target Milestone: ---

If `__attribute__((aligned(x)))` is present in function declaration but NOT
present in function implementation, GCC does not fire any warning/error.

Example:

```
#include <stdint.h>

typedef uint32_t _type_unaligned __attribute__((aligned(1)));

/* Prototype with attribute aligned */
void function_a(_type_unaligned* a);

int main(void) {
  struct test_t {
    uint8_t a;
    uint32_t b;
    uint32_t c;
  } __attribute__((__packed__)) test = {.a = 0, .b = 1, .c = 2};

  function_a(&(test.b));

  return 0;
}

/* Declaration WITHOUT attribute aligned */
void function_a(uint32_t* a) {
  uint32_t _a = *(a + 0);
  uint32_t _b = *(a + 1);
  *(a + 3) = _a + _b;
}
```

`arm-none-eabi-gcc --specs=nosys.specs -mcpu=cortex-m4 -Wall -Wextra -O3
-mthumb -mlittle-endian`

```
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (15:10.3-2021.07-4) 10.3.1 20210621 (release)
```

Assembly generated for function_a:
```
0000811c <function_a>:
    811c:       e9d0 3200       ldrd    r3, r2, [r0]     --> illegal ARM V7
instruction if unaligned!
    8120:       4413            add     r3, r2
    8122:       60c3            str     r3, [r0, #12]
    8124:       4770            bx      lr
    8126:       bf00            nop
```

Header and implementation of the function mismatch about `__attribute__` and
this is misleading. Here, GCC does NOT generate code to align the pointer in
`function_a` implementation.
Correct code would be:
```
/* Declaration with attribute aligned */
void function_a(_type_unaligned* a) {
  uint32_t _a = *(a + 0);
  uint32_t _b = *(a + 1);
  *(a + 3) = _a + _b;
}
```

Usually, when function declaration and definition mismatch, GCC fires a
warning/error.
I think this is a bug here, GCC should not allow to compile this code or at
least should raise a warning.

Reply via email to