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 |