Преднамеренное переопределение класса друга и -fstack-protector

Я пытался проверить, если множественное определение класса друга в разных .cpp файлы будут работать. Для этого я определил основной класс внутри main_class.hpp файл:

class main_class
{
private:
int a;
int b;

int gimme_a()
{
return a;
}

public:
main_class(int a, int b) : a(a), b(b) {}

int gimme_b()
{
return b;
}

friend class main_class_friend;
};

Тогда я определил main_class_friend два раза, сначала в течение main_friend_class1.cpp файл:

class main_class_friend
{
main_class c;
public:

main_class_friend() : c(10, 10) {}

int gimme_a()
{
return c.gimme_a();
}

int gimme_b()
{
return c.gimme_b();
}
};

и соответствующая публичная тестовая функция:

void test1()
{
main_class_friend ff;
std::cout << "Gimme a: " << ff.gimme_a() << " and gimme b: " <<
ff.gimme_b() << std::endl;
}

а потом я определил второй main_class_friend в main_friend_class2.cpp и соответствующая публичная тестовая функция:

class main_class_friend
{
private:
main_class ca;
int c;
public:

main_class_friend() : ca(9 ,9), c(11) {}

int gimme_a()
{
return ca.gimme_a();
}

int gimme_b()
{
return ca.gimme_b();
}

int gimme_c()
{
return c;
}
};void test2()
{
main_class_friend ff;
std::cout << "Gimme a: " << ff.gimme_a() << " and gimme b: " << ff.gimme_b()
<< " and gimme c: " << ff.gimme_c() << std::endl;
}

Наконец я позвонил test1 а также test2 функция внутри основного:

int main()
{
test1();
test2();
return 0;
}

скомпилировал программу (без ошибок g++) и запустить его. Выход был:

Gimme a: 9 and gimme b: 9
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

Что действительно странно для меня, так это a а также b были инициализированы конструктором внутри main_friend_class2.cpp а не тот из main_friend_class1.cpp где test1 функция определена.

Затем я обнаружил, что разбивка стека может быть легко отлажена, когда программа компилируется с -fstack-protector флаг. Поэтому я скомпилировал его еще раз, и результат программы был:

Gimme a: 9 and gimme b: 9
Gimme a: 9 and gimme b: 9 and gimme c: 11

так что больше не будет проблем с разбивкой стека, но оба test1 а также test2 функции используют конструктор из main_friend_class2.cpp файл.

Что здесь происходит? Я не понимаю Почему возникает ошибка разрушения стека, если нет переполнения буфера, потому что буфер не используется?

Мой второй вопрос: есть ли способ определить несколько раз main_class_friendно использовать их в разных файлах, чтобы сделать их «закрытыми» для файла, внутри которого используется класс?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]