是否可以从另一个翻译单元访问静态变量?

时间:2016-09-26 14:37:50

标签: c++ static

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的原因,只是好奇我们是否可以使用地址和偏移来破解它。

1 个答案:

答案 0 :(得分:1)

如果static中的变量为a1.cpp,则只有a1.cpp可以直接访问 extern的其他单位无法访问该变量一点都不。

程序集可以访问它,但如果你在运行时知道变量的内存地址,那么只能

通常,a1.cpp必须将指向变量的指针传递给a2.cpp(在这种情况下不需要汇编)。但是如果你不能改变a1.cpp来做那件事,那么你几乎没有运气,除非变量碰巧有一个你可以扫描内存的唯一值。但这并非不太可能。