==22==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5020000002d4 at pc 0x5565d492d8dc bp 0x7ffc83aa4540 sp 0x7ffc83aa4538 READ of size 4 at 0x5020000002d4 thread T0 #0 0x5565d492d8db in Solution::maxProfit(std::vector<int, std::allocator<int>>&) solution.cpp:6:26 #1 0x5565d492d157 in __helper__ solution.cpp:6:28 #2 0x5565d492d157 in main solution.cpp:6:40 #3 0x7fbe343691c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6) #4 0x7fbe3436928a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6) #5 0x5565d4856ce4 in _start (solution+0xb2ce4) 0x5020000002d4 is located 0 bytes after 4-byte region [0x5020000002d0,0x5020000002d4) allocated by thread T0 here: #0 0x5565d492a90d in operator new(unsigned long) /root/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:86:3 #1 0x5565d494847e in void std::vector<int, std::allocator<int>>::_M_realloc_append<int>(int&&) (solution+0x1a447e) #2 0x5565d4948326 in int& std::vector<int, std::allocator<int>>::emplace_back<int>(int&&) (solution+0x1a4326) #3 0x5565d4947651 in std::vector<int, std::allocator<int>> _Deserializer_::deserialize<int>(rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>&, std::vector<int, std::allocator<int>>*) (solution+0x1a3651) #4 0x5565d494740d in std::vector<int, std::allocator<int>> _Deserializer_::deserialize<std::vector<int, std::allocator<int>>>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) (solution+0x1a340d) #5 0x5565d492d11c in main solution.cpp:6:37 #6 0x7fbe343691c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6) #7 0x7fbe3436928a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6) #8 0x5565d4856ce4 in _start (solution+0xb
时间: 2025-03-08 10:09:31 浏览: 72
### 解决AddressSanitizer检测到的堆缓冲区溢出错误
当遇到`heap-buffer-overflow`错误时,通常意味着程序尝试访问超出分配给数组或其他动态数据结构范围之外的位置。对于C++中的vector容器而言,这种问题经常发生在边界条件处理不当的情况下。
在提供的案例中提到的情况[^2]表明,在遍历过程中未能正确管理索引变量,导致其超出了合法的操作区间。具体来说,如果在一个长度为`len`的序列上运行循环,并且该循环体内部存在依赖于当前迭代位置的操作,则必须确保这些操作不会触及到未定义区域。
针对`maxProfit`函数实现中存在的潜在风险点分析如下:
1. **输入验证不足**
如果传入的数据不符合预期格式或者大小异常大/小时,可能会引发意外行为。因此建议先对参数做适当校验再继续后续逻辑运算。
2. **循环终止条件设置不合理**
循环控制表达式的设定应当精确反映所需完成的任务次数以及每次更新后的状态变化规律。例如,在某些场景下应该采用`<=`而非简单的 `<` 来界定结束标志位;反之亦然。
3. **越界读取或写入**
特别是在涉及删除、插入等改变原有排列顺序的动作时要格外小心。像上述提及的例子那样直接通过覆盖方式调整剩余部分数值的做法很容易遗漏最后一个有效成员而引起崩溃现象发生。
为了修正这个问题并提高代码健壮性,可以考虑以下改进措施之一:
#### 方法一:优化现有算法流程设计
```cpp
// 假设 prices 是一个有效的价格列表
int maxProfit(vector<int>& prices) {
int minprice = INT_MAX, maxprofit = 0;
for (size_t i = 0; i < prices.size(); ++i){
if (prices[i] < minprice){
minprice = prices[i];
} else if(prices[i]-minprice > maxprofit){
maxprofit = prices[i] - minprice;
}
// 防止越界的额外保护机制
assert(i >= 0 && "Index out of bounds");
assert(static_cast<size_t>(i) < prices.size() && "Index exceeds container capacity");
}
return maxprofit;
}
```
此版本增加了断言来强制检查每一次迭代期间使用的索引值是否合理,从而提前捕捉任何可能导致非法内存访问的行为。
#### 方法二:重构业务规则以简化边界情况处理
另一种思路是从根本上去除那些容易诱发此类失误的因素,比如重新思考如何计算最大利润而不必频繁修改原始数据集的内容。
```cpp
#include<algorithm>
using namespace std;
class Solution {
public:
static int maxProfit(const vector<int>& prices) {
auto it = min_element(begin(prices), end(prices));
const int* buyDayPtr = &(*it);
auto sellIt = max_element(buyDayPtr, end(prices));
const int* sellDayPtr = &(*sellIt);
return (*sellDayPtr-*buyDayPtr>0)? *sellDayPtr-*buyDayPtr : 0 ;
}
};
```
这种方法利用标准库提供的高效工具代替手动编码复杂的比较过程,不仅减少了出错几率也提升了整体性能表现。
阅读全文
相关推荐


















