История изменений
Исправление hateyoufeel, (текущая версия) :
Почему в этом коде будет вывод в консоль (или удаление всех файлов) и как это связано с нулевым указателем?
Но ведь не будет вывода. segv будет.
А ЕСЛИ НАЙДУ
$ cat unreachable_call.cc
#include <cstdio>
#include <cstdlib>
typedef int (*Function)();
static Function Do;
static int EraseAll() {
// return system(“rm -rf /”);
return puts("OOOPS!");
}
void NeverCalled() {
Do = EraseAll;
}
int main() {
return Do();
}
$ clang++ unreachable_call.cc -O2
$ ./a.out
OOOPS!
Шланг превращает это в:
NeverCalled():
ret
main:
lea rdi, [rip + .L.str]
jmp puts@PLT
.L.str:
.asciz "OOOPS!"
Исходная версия hateyoufeel, :
Почему в этом коде будет вывод в консоль (или удаление всех файлов) и как это связано с нулевым указателем?
Но ведь не будет вывода. segv будет.
А ЕСЛИ НАЙДУ
$ cat unreachable_call.cc
#include <cstdio>
#include <cstdlib>
typedef int (*Function)();
static Function Do;
static int EraseAll() {
// return system(“rm -rf /”);
return puts("OOOPS!");
}
void NeverCalled() {
Do = EraseAll;
}
int main() {
return Do();
}
$ clang++ unreachable_call.cc -O2
$ ./a.out
OOOPS!