Я хотел бы протестировать функции C ++ в фрагменте кода, меняя их одну за другой на те, которые, как известно, работают в рабочем контексте, где замена выполняется с помощью компоновщика.(Я использую C ++ с GCC под Linux.) К сожалению, я не знаю достаточно о том, как управлять компоновщиком, чтобы знать, как это сделать, или даже если это возможно.
Для меня главная причина заключается в тестированиикод ученика против модельного решения учителя, хотя я могу представить множество других случаев, когда такие методы могут представлять интерес.Обратите внимание, что исходный код студентов доступен и может быть скомпилирован любым способом, который мне нравится, но этот источник нельзя редактировать.Однако код учителя может быть изменен по мере необходимости.
Ниже приведен простой пример, демонстрирующий идею.
Вот код учителя, в котором функции могут вызывать друг друга различными способами.похоже на то, что показано.Предполагается, что все функции в точности соответствуют их спецификациям.
#include <iostream>
using namespace std;
// model teacher program : main calls g which calls f
int f(int x) {
cout << "in teacher-f(" << x << ")" << endl;
return 46;
}
int g(int x) {
cout << "in teacher-g(" << x << ")" << endl;
int y = f(x);
cout << "f(" << x << ") returned " << y << endl;
return 91;
}
int main() {
cout << "in teacher-main()" << endl;
int x = 2;
int y = g(x);
cout << "g(" << x << ") returned " << y << endl;
}
Типичный код студента, пытающийся соответствовать тем же спецификациям, который необходимо протестировать.В моем случае это "main", несколько #includes и "using namespace std;"можно было бы ожидать.
#include <iostream>
using namespace std;
// model student program : main calls g which calls f
int f(int x) {
cout << "in student-f(" << x << ")" << endl;
return 27;
}
int g(int x) {
cout << "in student-g(" << x << ")" << endl;
int y = f(x);
cout << "f(" << x << ") returned " << y << endl;
return 82;
}
int main() {
cout << "in student-main()" << endl;
int x = 4;
int y = g(x);
cout << "g(" << x << ") returned " << y << endl;
return 0;
}
Я хочу поменять каждую из функций учителя одну за другой, чтобы протестировать каждую функцию учащегося по отдельности.
Вот одна попытка, в данном случае тестирование успеваемости ученика.()
g++ -c student.cpp
# (this makes student.o)
# strip f() and main() from student.o:
strip -N main -N _Z1fi student.o
# similarly for teacher, but stripping g
g++ -c teacher.cpp
strip -N _Z1gi teacher.o
g++ -o final teacher.o student.o
./final
и ожидаемый результат будет
in teacher-main()
in student-g(2)
in teacher-f(2)
f(2) returned 46
g(4) returned 82
, к сожалению, я получаю:
strip: not stripping symbol `_Z1fi' because it is named in a relocation
Я пытался сделать что-то подобное с .soбиблиотеки вместо.Сообщение об ошибке «раздеться» исчезает, но, к сожалению, на этот раз учитель звонит учителю, которого я пытался удалить.
g++ -shared -fPIC -o student.so student.cpp
g++ -shared -fPIC -o teacher.so teacher.cpp
strip -N main -N _Z1fi student.so
strip -N _Z1gi teacher.so
g++ -o final teacher.so student.so
./final
, давая
in teacher-main()
in teacher-g(2)
in teacher-f(2)
f(2) returned 46
g(2) returned 91
Есть предложения?Это вообще возможно?Если нет, есть ли способ сделать то же самое?Как я уже сказал, я не могу редактировать student.cpp, но я могу #include его из другого исходного кода.
Спасибо Ричард