strcpyの未定義動作例

コード

#include <iostream>
#include <string.h>

int main()
{
    char buffer[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWX";
    strcpy(buffer, buffer+8);
    std::cout << buffer << std::endl;
    return 0;
}

実行結果

処理系 結果
Wandbox
clang 9.0.0
89ABCDEFGHIJKLMNOPQRSTUVWX
macOS 10.15.1
Apple clang version 11.0.0
89ABCDEFGHIRSTUVOPQRSTUVWX

原理

https://opensource.apple.com/source/Libc/Libc-1244.50.9/x86_64/string/strcpy.s.auto.html

つまり

処理 buffer[35]
初期状態 0123456789ABCDEFGHIJKLMNOPQRSTUVWX\0
buffer+8から16バイトコピーする 89ABCDEFGHIJKLMNGHIJKLMNOPQRSTUVWX\0
16バイト境界に沿って16バイトコピーする 89ABCDEFGHIJKLMNOPQRSTUVOPQRSTUVWX\0
末尾16バイトをコピーする 89ABCDEFGHIRSTUVOPQRSTUVWX\0RSTUVWX\0