任意長配列宣言の謎

int size; scanf("%d", &size); int hoge[size]; とか普通にできちゃうのか。。

http://twitter.com/#!/siritori/status/132506438760284160
ほう。
どんな実装なんだろうか。
pythonに飽きていたから、gccで-Sして読んでみた。
raxとか出てきやがった。
x64ェ…
そこで安定のARM.

.cpu arm7tdmi-s
.fpu softvfp
:
:
main:
stmfd sp!, {fp, lr} @まあここらへんはスタックの操作です。
add fp, sp, #4 @スタックポインタに4足してフレームポインタにしてます。
sub sp, sp, #8 @親スタックの保護です。
ldr r0, .L6 @scanf("%d"の%dの文字列
sub r1, fp, #8 @sp-4のアドレスをr1へ。sanfの&size
bl scanf
ldr r3, [fp, #-8] @さっきのr1の位置に返り値がきてるっぽい…からロード
mov r2, r3, asl #2 @左2シフトしてその値をr2へ。intなので順番とアドレスに4倍の差がある。
add r2, r2, #14
bic r2, r2, #7 @下3bitをクリア 何のために…? …☆
sub sp, sp, r2 @新しく☆で作った謎の範囲までをスタック範囲とする。
あとは、僕のかいたテストプログラムによるもの。hoge[size]全部を0でうめますん。
mov r2, sp
mov r1, r3
cmp r3, #0
beq .L4
mov r3, #0
mov r0, r3
.L3: @このループでスタック領域のアレをいじります。
str r0, [r2, #4]! @r0は今0な。
add r3, r3, #1
cmp r1, r3 @さっきのをしたからやっていって、おしまい…?
bne .L3
.L4:
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
.L7:
.align 2
.L6:
.word .LC0
.size main, .-main
.section .rodata.str1.4,"aMS",%progbits,1
.align 2
.LC0:
.ascii "%d\000"
.ident "GCC: (Sourcery G++ Lite 2010.09-51) 4.5.1"