`Parser::slice` and `Parser::slice_from` can trigger UB in safe Rust via unchecked slicing
還沒有人認領這個 Issue。
評估
研究方向
檢查 src/tokenizer.rs,尤其是 Parser::slice 和 Parser::slice_from,並追蹤 issue 中描述的不安全範圍建構。先後執行儲存庫現有的測試,然後驗證反向、越界、重設和跨 parser 的範圍不會再進入未經檢查的切片操作。
由索引模型根據 Issue 內容生成。
描述
Parser::slice (and Parser::slice_from) in src/tokenizer.rs calls self.input.get_unchecked(range.start.0..range.end.0) without verifying range.start.0 <= range.end.0 or range.end.0 <= self.input.len():
#[inline]
pub fn slice(&self, range: Range<SourcePosition>) -> &'a str {
debug_assert!(self.input.is_char_boundary(range.start.0));
debug_assert!(self.input.is_char_boundary(range.end.0));
unsafe { self.input.get_unchecked(range.start.0..range.end.0) }
}
Safe callers can trigger undefined behavior without unsafe:
- Passing an inverted range
p1..p0wherep1 > p0(bothis_char_boundaryassertions still pass in debug builds, andend - startunderflows inget_unchecked). - Calling
parser.reset(&saved_state)to rewind the parser position and then callingparser.slice_from(later_pos). - Passing a
SourcePositionobtained from anotherParserwith a longer input string in release builds wheredebug_assert!is disabled.
Replacing unsafe { self.input.get_unchecked(range.start.0..range.end.0) } with &self.input[range.start.0..range.end.0] avoids the soundness issue.
- 主要語言
- Rust
- 星號
- 874
- 分支
- 150
- 平均合併
- 9 分鐘
- 30 天內合併 PR
- 1
環境準備
這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
servo/rust-cssparser 的其他 Issue
-
cssparser-color: debug assertion in hsl_to_rgb for a hue that overflows f32可能已有人在做 @BartWaardenburg 於 3 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 64/100
servo/rust-cssparser#460 ·
-
難度 2/5 1-3 小時 新手友好度 88/100
servo/rust-cssparser#440 ·
-
難度 2/5 1-3 小時 新手友好度 85/100
servo/rust-cssparser#439 · 1 則留言 ·
-
難度 2/5 1-3 小時 新手友好度 84/100
servo/rust-cssparser#434 ·
-
難度 4/5 3-5 天 新手友好度 45/100
servo/rust-cssparser#438 · 3 則留言 · 1 個 reaction ·
查看 servo/rust-cssparser 的全部 Issue
相似的 Issue
-
難度 1/5 1 小時以內 新手友好度 75/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 82/100
manuscript-lang/manuscript#1364 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 65/100
equinor/septic-config-generator#504 ·
維護者通常 1 天內回覆
-
難度 1/5 1 小時以內 新手友好度 72/100
GiganticMinecraft/seichi-portal-backend#1633 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 76/100
fable-compiler/Fable#5157 ·
維護者通常 1 天內回覆