From RISKS: secret scrubbing code removed by optimizers
Darren Tucker
dtucker at zip.com.au
Fri Nov 8 15:59:23 EST 2002
Dan Kaminsky wrote:
> Has somebody actually verified this optimizing behavior in any build
> of GCC? Does voliatile actually stop it?
Yes (gcc-3.2 on a SPARC). Yes.
-Daz.
Test function:
void myfunc1()
{
char p[100];
scanf("%s\n", &p);
memset(p, 0, 100);
}
gcc -s testfunc.c gives:
myfunc1:
!#PROLOGUE# 0
save %sp, -216, %sp
!#PROLOGUE# 1
add %fp, -120, %o1
sethi %hi(.LLC0), %o0
or %o0, %lo(.LLC0), %o0
call scanf, 0
nop
add %fp, -120, %o0
mov 0, %o1
mov 100, %o2
call memset, 0
nop
nop
ret
restore
gcc -s -O3 testfunc.c
myfunc1:
!#PROLOGUE# 0
save %sp, -216, %sp
!#PROLOGUE# 1
sethi %hi(.LLC0), %g1
or %g1, %lo(.LLC0), %o0
call scanf, 0
add %fp, -120, %o1
nop
ret
restore
Add "volatile" and inlines and unrolls memset:
myfunc1:
!#PROLOGUE# 0
save %sp, -216, %sp
!#PROLOGUE# 1
sethi %hi(.LLC0), %g1
or %g1, %lo(.LLC0), %o0
call scanf, 0
add %fp, -120, %o1
mov 0, %o2
mov 0, %o3
std %o2, [%fp-120]
std %o2, [%fp-112]
std %o2, [%fp-104]
std %o2, [%fp-96]
std %o2, [%fp-88]
std %o2, [%fp-80]
std %o2, [%fp-72]
std %o2, [%fp-64]
std %o2, [%fp-56]
std %o2, [%fp-48]
std %o2, [%fp-40]
std %o2, [%fp-32]
st %g0, [%fp-24]
nop
ret
restore
--
Darren Tucker (dtucker at zip.com.au)
GPG Fingerprint D9A3 86E9 7EEE AF4B B2D4 37C9 C982 80C7 8FF4 FA69
Good judgement comes with experience. Unfortunately, the experience
usually comes from bad judgement.
More information about the openssh-unix-dev
mailing list