a1.cpp
static int a = 20;
a2.cpp
#include <iostream>
extern int a;
int main() {
std::cout<<a<<std::endl; // link error
}
如果你不能修改a1.cpp,是否可以更改a2.cpp以便它可以访问a1.cpp中的a
?也许使用汇编?
-------编辑---------
万一有人感兴趣,我终于找到了办法:
a1.cpp
static int a = 20;
a2.cpp
int b = 100;
int main() {
int* p = &b;
p--;
*p = 42; // now a in a1.cpp is changed from 20 to 42, tested by clang++ 3.8.1
return 0;
}
我知道这不是static
的原因,只是好奇我们是否可以使用地址和偏移来破解它。
答案 0 :(得分:1)
如果static
中的变量为a1.cpp
,则只有a1.cpp
可以直接访问 ,extern
的其他单位无法访问该变量一点都不。
程序集可以访问它,但如果你在运行时知道变量的内存地址,那么只能 。
通常,a1.cpp
必须将指向变量的指针传递给a2.cpp
(在这种情况下不需要汇编)。但是如果你不能改变a1.cpp
来做那件事,那么你几乎没有运气,除非变量碰巧有一个你可以扫描内存的唯一值。但这并非不太可能。