gcc and clang assignment compiler bug?

From: flint pyrite <flintnpyrite_at_gmail.com>
Date: Wed, 20 Oct 2021 01:04:31 UTC
Weird. I can't figure it out so I am putting it out there. I have sample
code and debug output that shows the issue. I am not sure why the
difference between the two since the buffer variable is a pointer to data
on the heap? Is this a compiler bug? One generates movabs and the other a mov
instruction.

/*
  $ cc -g t.c
  $ ./a.out
  Segmentation fault (core dumped)
  $ gdb a.out a.out.core
    (gdb) bt
    #0  0x00000000002018e6 in test2 () at t.c:50
    #1  0x000000000020193e in main () at t.c:60
    (gdb) list
    46      void test2()
    47      {
    48              char *buffer= "Example string\r\n";
    49
    50              *buffer= 0;
    51              buffer[0]= 'E';
    52      }
    (gdb) disassemble
    Dump of assembler code for function test2:
    0x00000000002018d0 <+0>:     push   %rbp
    0x00000000002018d1 <+1>:     mov    %rsp,%rbp
    0x00000000002018d4 <+4>:     movabs $0x200500,%rax
    0x00000000002018de <+14>:    mov    %rax,-0x8(%rbp)
    0x00000000002018e2 <+18>:    mov    -0x8(%rbp),%rax
=>  0x00000000002018e6 <+22>:    movb   $0x0,(%rax)
    0x00000000002018e9 <+25>:    mov    -0x8(%rbp),%rax
    0x00000000002018ed <+29>:    movb   $0x45,(%rax)
    0x00000000002018f0 <+32>:    pop    %rbp
    0x00000000002018f1 <+33>:    ret
    (gdb) disassemble test1
    Dump of assembler code for function test1:
    0x0000000000201900 <+0>:     push   %rbp
    0x0000000000201901 <+1>:     mov    %rsp,%rbp
    0x0000000000201904 <+4>:     mov    0x200520,%rax
    0x000000000020190c <+12>:    mov    %rax,-0x20(%rbp)
    0x0000000000201910 <+16>:    mov    0x200528,%rax
    0x0000000000201918 <+24>:    mov    %rax,-0x18(%rbp)
    0x000000000020191c <+28>:    mov    0x200530,%cl
    0x0000000000201923 <+35>:    mov    %cl,-0x10(%rbp)
    0x0000000000201926 <+38>:    movb   $0x0,-0x20(%rbp)
    0x000000000020192a <+42>:    movb   $0x45,-0x20(%rbp)
    0x000000000020192e <+46>:    pop    %rbp
    0x000000000020192f <+47>:    ret
    0x000000000020192f <+47>:    ret
*/

/* bad */
void test2()
{
        char *buffer= "Example string\r\n";

        *buffer= 0;
        buffer[0]= 'E';
}

/* good */
void test1()
{
        char buffer[]= {"Example string\r\n"};

        *buffer= 0;
        buffer[0]= 'E';
}

int main()
{
  test1();
  test2();
}

$ clang -v
FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git
llvmorg-11.0.1-0-g43ff75f2c3fe)
Target: x86_64-unknown-freebsd13.0
Thread model: posix
InstalledDir: /usr/bin

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc10/gcc/x86_64-portbld-freebsd13.0/10.3.0/lto-wrapper
Target: x86_64-portbld-freebsd13.0
Configured with: /wrkdirs/usr/ports/lang/gcc10/work/gcc-10.3.0/configure
--enable-multilib --with-build-config=bootstrap-debug --disable-nls
--enable-gnu-indirect-function --enable-plugin
--libdir=/usr/local/lib/gcc10 --libexecdir=/usr/local/libexec/gcc10
--program-suffix=10 --with-as=/usr/local/bin/as --with-gmp=/usr/local
--with-gxx-include-dir=/usr/local/lib/gcc10/include/c++/
--with-ld=/usr/local/bin/ld --with-pkgversion='FreeBSD Ports Collection'
--with-system-zlib --without-zstd --enable-languages=c,c++,objc,fortran
--prefix=/usr/local --localstatedir=/var --mandir=/usr/local/man
--infodir=/usr/local/share/info/gcc10 --build=x86_64-portbld-freebsd13.0
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.3.0 (FreeBSD Ports Collection)

$ uname -a
FreeBSD tabitha.markjolesen.com 13.0-RELEASE-p3 FreeBSD 13.0-RELEASE-p3 #0:
Tue Jun 29 19:46:20 UTC 2021
root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC
 amd64