Page Summary
vitus_wagner - (no subject)
http://users.livejournal.com/_slw/ - (no subject)
maksa.livejournal.com - (no subject)
shaman007.livejournal.com - (no subject)
caml-programmer.livejournal.com - (no subject)
norian.livejournal.com - (no subject)
tarkhil.livejournal.com - (no subject)
dibr.livejournal.com - (no subject)
yurvor.livejournal.com - (no subject)
votez.livejournal.com - (no subject)
dz.livejournal.com - (no subject)
dinozavr.livejournal.com - 42 и 43
Style Credit
- Style: Neutral Good for Practicality by
Expand Cut Tags
No cut tags
no subject
Date: 2012-08-30 02:51 pm (UTC)no subject
Date: 2012-08-30 02:52 pm (UTC)no subject
Date: 2012-08-30 03:02 pm (UTC)gcc: не заданы входные файлы
[root@localhost ~]# vi 1.c
[root@localhost ~]# gcc 1.c
1.c: In function ‘main’:
1.c:15: предупреждение: return type of ‘main’ is not ‘int’
[root@localhost ~]# ./a.out
42
[root@localhost ~]# gcc -O3 ./1.c
./1.c: In function ‘main’:
./1.c:15: предупреждение: return type of ‘main’ is not ‘int’
[root@localhost ~]# ./a.out
-1081113660
[root@localhost ~]#
no subject
Date: 2012-08-30 05:16 pm (UTC)no subject
Date: 2012-08-30 08:28 pm (UTC)no subject
Date: 2012-08-30 05:12 pm (UTC)no subject
Date: 2012-08-30 02:52 pm (UTC)но может [не]повезти и напечатает 42
no subject
Date: 2012-08-30 02:54 pm (UTC)no subject
Date: 2012-08-31 02:49 am (UTC)http://tobotras.livejournal.com/580866.html?thread=8457730#t8457730 :)
no subject
Date: 2012-08-30 03:01 pm (UTC)Точнее, в случае с gcc без оптимизации это будет 42, так как он выделил память ровно под 1 переменную, так как в каждый момент времени исполнения у нас есть только 1 инт, а что он каждый раз по-разному обозван, так это проблемы тех, но не инициализирует и не очищает память.
Кстати, такие уязвимости были в SSH, кажется.
Нотариально заверенный скриншот:
[root@localhost ~]# vi 1/c
[root@localhost ~]# vi 1.c
[root@localhost ~]# gcc 1.c
1.c: In function ‘main’:
1.c:15: предупреждение: return type of ‘main’ is not ‘int’
[root@localhost ~]# ./a.out
42
[root@localhost ~]# gcc -O3 ./1.c
./1.c: In function ‘main’:
./1.c:15: предупреждение: return type of ‘main’ is not ‘int’
[root@localhost ~]# ./a.out
-1081113660
[root@localhost ~]#
no subject
Date: 2012-08-30 03:05 pm (UTC)gcc -O1 - 0
gcc -O2 - 0
no subject
Date: 2012-08-30 03:08 pm (UTC)void foo( void )
{
int a = 42;
int b = 43;
}
?
no subject
Date: 2012-08-31 02:43 am (UTC)no subject
Date: 2012-09-04 11:38 pm (UTC)no subject
Date: 2012-08-30 03:13 pm (UTC)no subject
Date: 2012-08-31 12:33 am (UTC)no subject
Date: 2012-08-31 03:59 am (UTC)no subject
Date: 2012-08-31 05:34 am (UTC)no subject
Date: 2012-08-31 04:04 am (UTC)no subject
Date: 2012-08-31 05:39 am (UTC)no subject
Date: 2012-08-31 07:26 am (UTC)no subject
Date: 2012-08-30 03:16 pm (UTC)С максимумами распределения на "42" (автоматические переменные без явного указания не инициализируются, выделяются в одном и том же месте, например в стеке, и это "место" совпало для a и b), и нуле (если автоматические переменные по умолчанию зануляются, или a и b оказались в разных местах, при этом b попало на заранее очищенную область).
no subject
Date: 2012-08-31 02:48 am (UTC)no subject
Date: 2012-08-31 03:58 am (UTC)только всё это - дрочилово на устаревшие технологии.
если пишешь на си - не допускай чужого бинарного кода, вообще.
no subject
Date: 2012-08-31 09:49 am (UTC)no subject
Date: 2012-08-30 04:21 pm (UTC)no subject
Date: 2012-08-31 02:48 am (UTC)no subject
Date: 2012-09-01 07:06 pm (UTC)no subject
Date: 2012-08-30 08:14 pm (UTC)no subject
Date: 2012-08-31 03:52 am (UTC)- присваивание может быть выкинуто оптимайзером вообще.
- любая функция может быть заинлайнена, и тогда, возможно, компайлер выделит разные регистры.
- для временных переменных и для возврата могут быть запланированы разные регистры.
И т.п.
На x86 вполне может и 42 принтануть, если компайлер выделит eax для переменной в foo.
42 и 43
Date: 2012-09-04 07:30 am (UTC)http://dinozavr.dreamwidth.org/2377677.html?view=6728653&posted=1#cmt6728653
Они размещают локальные переменные в стеке в разном порядке. Так что этот пример гораздо занимательнее, чем оригинальный, надо его туда запостить :)
gcc 4.6.3 32bit:
foo:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $42, -8(%ebp)
movl $43, -4(%ebp)
leave
ret
gcc 4.4.5 64bit:
foo:
pushq %rbp
movq %rsp, %rbp
movl $42, -8(%rbp)
movl $43, -4(%rbp)
leave
ret
gcc 4.4.3 32bit:
foo:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $42, -4(%ebp)
movl $43, -8(%ebp)
leave
ret
Век живи - век учись!