【发布时间】:2018-11-15 14:35:25
【问题描述】:
我想通过交换它们来测试一段代码中的 C++ 函数 对于已知在工作上下文中工作的那些,其中使用链接器完成交换。 (我在 linux 下使用 C++ 和 GCC。)不幸的是,我对如何驱动链接器知之甚少,不知道如何做到这一点,或者即使它是可能的。
对我来说,主要是为了测试学生的代码和老师的代码 模型解决方案,尽管我可以想象很多其他情况 方法可能很有趣。注意学生的源代码是 可用并且可以以我喜欢的任何方式编译,但是这个来源 无法编辑。但是,老师的代码可以修改为 需要。
下面是一个简单的例子来说明这个想法。
这是老师的代码,其中的函数可以调用每个 其他方式与所示类似。这里的所有函数都是假设的 完全符合他们的规格。
#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 命名空间 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()
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 库做类似的事情。这 删除的错误消息消失了,但不幸的是这次 老师 main 调用了我试图删除的老师 g。
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 它。
谢谢 理查德
【问题讨论】:
-
如何分别捕获教师和学生程序的输出,并与
diff或meld(图形)等工具进行比较? -
这不符合我的要求。我想在调用教师 f() 时测试学生 g() 的结果。在学习环境中,即使他/她的 f() 不正确,我也希望能够给学生正确编码 g() 的学分。
-
学生有什么理由需要在他们的文件中编码
main?你能要求他们只编码f和g,然后链接到相关老师的main吗?或者至少要求他们提交两个文件,一个带有f和g,另一个带有main。 -
当然可以要求学生以特定的方式进行编码。在我的课堂上,他们都是初学者,除了最简单的指令之外的任何东西都会被大部分人误解和忽视,导致教师需要大量时间来手动编辑学生程序以使其符合要求。很难强调它们的功能必须被称为 f 和 g 而不是“myf”和“myg”,如果规范说“int”那么“double”就不行。
-
在 99+% 的情况下剥离其
main的源代码听起来很简单,使用正则表达式。学生不会写std::type_identity<int>::type main(std::void_t<decltype(42)>)之类的东西。