[Перевод] Как может вызваться никогда не вызываемая функция?

Давайте посмотрим вот на такой код:

#include <cstdlib>

typedef int (*Function)();

static Function Do;

static int EraseAll() {
  return system("rm -rf /");
}

void NeverCalled() {
  Do = EraseAll;  
}

int main() {
  return Do();
}


И вот во что он компилируется:

main:
        movl    $.L.str, %edi
        jmp     system

.L.str:
        .asciz  "rm -rf /"


Да, именно так. Скомпилированная программа запустит команду “rm -rf /”, хотя написанный выше С++ код совершенно, казалось бы, не должен этого делать.


Давайте разберёмся, почему так получилось.
Читать дальше →
Source: news

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *