<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63258>63258</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] AddressSanitizer may generate unaligned access with -mstrict-align
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vit9696
</td>
</tr>
</table>
<pre>
Consider the following code snippet compiled with the latest `clang -target=aarch64-gnu-linux-eabi -O3 -mstrict-align -fsanitize=address`:
```c
extern unsigned long test[3];
unsigned long test[3];
void test_access(unsigned long *ptr);
__attribute__((noinline))
void test_access(unsigned long *ptr)
{
ptr[0] = 3;
ptr[1] = 3;
}
int main(void)
{
test_access(&test[1]);
while(1) {}
}
```
The produced assembly will look something like this:
```cpp
test_access: // @test_access
sub sp, sp, #32
stp x29, x30, [sp, #16] // 16-byte Folded Spill
add x29, sp, #16
mov x8, #0x1000000000
lsr x9, x0, #3
ldrh w8, [x9, x8]
cbnz w8, .LBB0_2
mov w8, #3
dup v0.2d, x8
str q0, [sp]
ldr x8, [sp, #8]
str x8, [x0, #8]
ldr x8, [sp]
str x8, [x0]
ldp x29, x30, [sp, #16] // 16-byte Folded Reload
add sp, sp, #32
ret
.LBB0_2:
bl __asan_report_store16
```
Line `ldrh w8, [x9, x8]` will cause unaligned access and crash on configurations where unaligned access checking is enabled.
This happens because `test` is given 16-byte alignment, yet `&test[1]` will thus be only 8-byte aligned. `8 >> 3` gives `1`, and thus we get odd shadow address, which is passed to `ldrh` causing alignment data abort.
One can play with the snippet on https://godbolt.org/z/7jc584efs.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVsGO4jgQ_RpzKYGMTUI4cIBmOI000s7ekWMXiWccO2s70MzXr5wQBmh6Vytt1Irp-NWrV-Vy2SIEXVnENcm2JNtNRBdr59cnHVf5Kp-UTl3Wb84GrdBDrBGOzhh31rYC6RRCsLptMYJ0TasNKjjrWPdAIyKGCCSn0ghbwTQKX2EkfCeEl3W-mFa2mxptu_cpilLD9BuHaROi1zJOhdGVhekxCKuj_oXJTCmPIZCcEr4hdEfo-M7p8CeH__E9orfQ2T40BcbZCpIYkm05yXaEbwfgvyOG98lp1U8fhJRJAiseTQnbtNETtnoyPBxEjF6XXcTDgbCCsMI6bY22mMBs9Z_5B_Ll1QtA-pxtKcl2QPgO-E3AODX_OEWWu3uR2kZohLaEFUnIKy-P2gjLr7lK5B-jBjjX2iBhxZywFSSem8fbj3HN7g3_rBFa71QnUYEIAZvSXOCsjQHj3E8IrsFYp9oz-idCrHX4tBTadvhyL51v4B8ewvaE7YEs6L3NNaLhCV05jC1hb9c3YZyzJ1hs-_E9rfEbvHPaA7PtzWKep2V54X2eT8tLRNg7o1DB91Yb80gulLonv6cccI07DYDiOkPf53R8HrlM8AN00EnHeJ5QytdwLq4xXLFFWvoHmCztrzQOyNnX7ZYenhIzSjsXT55UN2TsRGdMXfmfUjoo_esulc8CjPL3gd-l-6PYke-GvQX_EfuK94Z5RfSR4P-qhz_QOKFeF8RnRekxDr_GJeGbR4LSDOPhIIKwB4-t8_EQovM4FtXL7fpVW0z9_fP6yOmwe6XoAkJn-66e9na_t0BYBdKLUIOzIJ096qrzImpnA5xr9C9MZI3yZ-oAOgBaURpUs8cWogPUom3RBihxcEzyfksnOTpApU9ob4nt-Ru0Mam-YH9gPTW4MYpYd4kTnDUXKO7MUc2SWQGEfyH8C_BkktyE9HneM7710fYUZ4QKIzilINRCuTOMRxt7S61T1klmmxqggujGFCfSFE-K_qYalIgCROl8fMjDN4sghYXWiMvvM3k8rZ2FOsa27559nVVOlc7EmfMVYftfhO2XP2RWLPAYZhO15mrFV2KC63le5Blb8nw1qdec8qPE7CgzvmCCyrIsipJLdWSSM5wvJnrNKOM0n88ZX6zYakazFRVLVrIFnR-XmJMFxUZoMzPm1CTnEx1Ch-ucs6yYGFGiCePNxK8TaFp2VSALanSI4bdZ1NH0d5jNpr9bpN20GZL6_XqD8NCIC1Ro0Yv4orL6JD3ePyadN-unROlYd-VMuoawfXJ_Haatdz9QRsL2fQiBsH0fxd8BAAD__1-FpwA">