如果我不想让某人知道或更改硬编码值,宏是否比静态常量更安全?
Is macro more secure than static const if I don't want someone to know or change the hardcode value?
我搜索了一些关于
的话题#define PASSWORD "abcde"
和
static const char* PASSWORD="abcde";
似乎#define
没有将值存储在内存中(我不确定它是否正确)。我听说它可能有一些工具可以检测和访问在应用执行期间使用的内存地址(例如:更改游戏的某些值)。我担心,如果我使用static const char* PASSWORD
,有人可能会通过检测PASSWORD的地址知道PASSWORD的值,并通过获取地址中的内容得到PASSWORD的值。
如果我想要硬码值更安全,使用#define
更好吗?
在这种情况下不重要。由于两者都使用字符串字面量,因此字符串本身将存储在字符串池中,而不是动态地存在于堆上的某个地方。此外,宏在技术上甚至不存在,因为编译器简单地用#define
定义替换了宏的所有实例。在运行时,程序不会看到差异。
编辑:正如有人提到的,如果您想搞乱安全性,请考虑散列。这将使用内存搜索程序提取密码变得更加困难。
你可能想用你的变量作为常量表达式。
constexp char* = "abc";
它比define要好,并且变量只在编译时存在,因此变量根本没有任何地址。然而,就像定义一样,它将直接将"abc"打印到二进制文件中。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 检查编译时是否存在静态函数
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- C++编译器是否优化了顺序静态变量读取?
- 返回从字符串文本创建的静态string_view是否安全?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 初始值设定项列表是否足够静态以允许实例化模板?
- 程序如何知道静态变量是否需要初始化?
- 是否使用静态 constexpr 变量 odr?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 如果可能,标准::映射分配是否静态