undefined behavior in do_fill_uninitialized_memory()
还没有人认领这个 Issue。
评估
调研方向
从 boost/circular_buffer/debug.h 的 do_fill_uninitialized_memory() 开始,检查空 circular_buffer 的复制构造路径。使用 GCC 9.1、-fsanitize=undefined 和 -DBOOST_CB_ENABLE_DEBUG=1 重现该示例;当空复制场景不再报告空指针错误,同时非零填充仍会接受检查时,即表示完成。
由索引模型根据 Issue 内容生成。
描述
Using gcc 9.1 with -fsanitize=undefined and -DBOOST_CB_ENABLE_DEBUG=1, the following code results in a ubsan error: "boost/circular_buffer/debug.hpp:37:16: runtime error: null pointer passed as argument 1, which is declared to never be null".
using Q = boost::circular_buffer<int>;
Q q;
const Q q2(q);
The ubsan error is a result of the following code in circular_buffer/debug.h:
template <class T>
inline void do_fill_uninitialized_memory(T* data, std::size_t size_in_bytes) BOOST_NOEXCEPT {
std::memset(static_cast<void*>(data), UNINITIALIZED, size_in_bytes);
}
During copy construction, the function gets called with data == nullptr and size_in_bytes == 0. I believe that passing a null pointer to memset is technically undefined behavior even if the size is 0.
Changing the above function as follows avoids the ubsan error:
template <class T>
inline void do_fill_uninitialized_memory(T* data, std::size_t size_in_bytes) BOOST_NOEXCEPT {
if (size_in_bytes != 0u) {
std::memset(static_cast<void*>(data), UNINITIALIZED, size_in_bytes);
}
}
I had originally written it to check for data != nullptr, but since this is debug code I thought it seemed desirable to know if the function is ever called with data == null and size_in_bytes != 0. In any case, either way will prevent the ubsan error.
- 主要语言
- C++
- 星标
- 65
- 派生
- 64
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
boostorg/circular_buffer 的其他 Issue
-
难度 3/5 1-2 天 新手友好度 25/100
boostorg/circular_buffer#53 ·
-
难度 3/5 1-2 天 新手友好度 48/100
boostorg/circular_buffer#51 ·
-
难度 2/5 1-3 小时 新手友好度 45/100
boostorg/circular_buffer#48 ·
-
难度 4/5 3-5 天 新手友好度 25/100
boostorg/circular_buffer#47 ·
-
enhancement
难度 2/5 1-3 小时 新手友好度 35/100
boostorg/circular_buffer#46 · 4 条评论 ·
查看 boostorg/circular_buffer 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
google/libultrahdr#485 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
godotengine/godot#123776 ·
-
bug
难度 1/5 1 小时以内 新手友好度 60/100
-
good first issue
难度 1/5 1 小时以内 新手友好度 90/100
-
good first issue
难度 2/5 1-3 小时 新手友好度 75/100
ros2/common_interfaces#344 ·