diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-05-18 17:30:52 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-05-18 17:30:52 +0000 |
commit | 4106d696d7d0725fcd442fdda28a07049d47c573 (patch) | |
tree | 5f197051c4c23973d794d807cd484e5259df6e5f /lib/Basic/SourceManager.cpp | |
parent | 1393d5e2df57667cef07caeba8b7daf6c74cd561 (diff) | |
download | clang-4106d696d7d0725fcd442fdda28a07049d47c573.tar.gz |
Avoid potential out-of-bounds access in SourceManager::getLineNumber.
- Chris, please see added FIXMEs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72019 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic/SourceManager.cpp')
-rw-r--r-- | lib/Basic/SourceManager.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 9ca00f5823..7d2d0ae172 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -729,11 +729,22 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos) const { unsigned QueriedFilePos = FilePos+1; + // FIXME: I would like to be convinced that this code is worth being as + // complicated as it is, binary search isn't that slow. + // + // If it is worth being optimized, then in my opinion it could be more + // performant, simpler, and more obviously correct by just "galloping" outward + // from the queried file position. In fact, this could be incorporated into a + // generic algorithm such as lower_bound_with_hint. + // + // If someone gives me a test case where this matters, and I will do it! - DWD + // If the previous query was to the same file, we know both the file pos from // that query and the line number returned. This allows us to narrow the // search space from the entire file to something near the match. if (LastLineNoFileIDQuery == FID) { if (QueriedFilePos >= LastLineNoFilePos) { + // FIXME: Potential overflow? SourceLineCache = SourceLineCache+LastLineNoResult-1; // The query is likely to be nearby the previous one. Here we check to @@ -753,7 +764,8 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos) const { } } } else { - SourceLineCacheEnd = SourceLineCache+LastLineNoResult+1; + if (LastLineNoResult < Content->NumLines) + SourceLineCacheEnd = SourceLineCache+LastLineNoResult+1; } } |