我有 3 个文件在啊我有一个包装 std::string str 的#define ENABLE_STR,我仅在定义类 A 时启用此宏,但当我使用 A 时,它被遗漏了。
这是一种a.cpp认为有str成员但main.cpp不知道的情况。并且当程序运行时int i被string str. AddressSanitizer 和 Valgind 似乎都没有将其检测为无效的内存访问。
// a.h
#pragma once
#include <string>
class A
{
public:
A();
std::string& get();
#ifdef ENABLE_STR
std::string str;
#endif
int i;
};
// a.cpp
#define ENABLE_STR
#include <iostream>
#include "a.h"
A::A():i(0){ }
std::string& A::get()
{
std::cin >> str;
return str;
}
//main.cpp
#include <iostream>
#include "a.h"
int main()
{
A a;
std::cout << a.get() << "\n\n i:" << a.i << std::endl;
}
- 理想情况下,我会假设编译器/链接器会将其标记为错误,但事实并非如此。
- 为什么 address sanitizer/valgrind 无法检测到这一点,因为这似乎是在写入不属于它的内存。
- 除了不在标题中使用这样的宏之外,如何检测到这一点?