LINUX.ORG.RU

История изменений

Исправление 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!"

https://godbolt.org/z/K7srcabs4

Исходная версия 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!

https://godbolt.org/z/K7srcabs4