diff options
author | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-11-14 00:07:15 +0000 |
---|---|---|
committer | Yuchen Wu <yuchenericwu@hotmail.com> | 2013-11-14 00:07:15 +0000 |
commit | dbb51ff01fd08df39e5040c1cd9edacdc3e4308a (patch) | |
tree | f7efe453cbf087a07bae0933b017dec688e5f24e /include | |
parent | 006806267a4f85a5abf32573348c81098f2696d2 (diff) | |
download | external_llvm-dbb51ff01fd08df39e5040c1cd9edacdc3e4308a.zip external_llvm-dbb51ff01fd08df39e5040c1cd9edacdc3e4308a.tar.gz external_llvm-dbb51ff01fd08df39e5040c1cd9edacdc3e4308a.tar.bz2 |
llvm-cov: Replaced asserts with proper error handling.
Unified the interface for read functions. They all return a boolean
indicating if the read from file succeeded. Functions that previously
returned the read value now store it into a variable that is passed in
by reference instead. Callers will need to check the return value to
detect if an error occurred.
Also added a new test which ensures that no assertions occur when file
contains invalid data. llvm-cov should return with error code 1 upon
failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194635 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Support/GCOV.h | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/include/llvm/Support/GCOV.h b/include/llvm/Support/GCOV.h index ccc7c6e..d79c0f9 100644 --- a/include/llvm/Support/GCOV.h +++ b/include/llvm/Support/GCOV.h @@ -152,27 +152,35 @@ public: return true; } - uint32_t readInt() { - uint32_t Result; + bool readInt(uint32_t &Val) { StringRef Str = Buffer->getBuffer().slice(Cursor, Cursor+4); - assert (Str.empty() == false && "Unexpected memory buffer end!"); + if (Str.empty()) { + errs() << "Unexpected end of memory buffer: " << Cursor+4 << ".\n"; + return false; + } Cursor += 4; - Result = *(const uint32_t *)(Str.data()); - return Result; + Val = *(const uint32_t *)(Str.data()); + return true; } - uint64_t readInt64() { - uint64_t Lo = readInt(); - uint64_t Hi = readInt(); - uint64_t Result = Lo | (Hi << 32); - return Result; + bool readInt64(uint64_t &Val) { + uint32_t Lo, Hi; + if (!readInt(Lo) || !readInt(Hi)) return false; + Val = ((uint64_t)Hi << 32) | Lo; + return true; } - StringRef readString() { - uint32_t Len = readInt() * 4; - StringRef Str = Buffer->getBuffer().slice(Cursor, Cursor+Len); + bool readString(StringRef &Str) { + uint32_t Len; + if (!readInt(Len)) return false; + Len *= 4; + if (Buffer->getBuffer().size() < Cursor+Len) { + errs() << "Unexpected end of memory buffer: " << Cursor+Len << ".\n"; + return false; + } + Str = Buffer->getBuffer().slice(Cursor, Cursor+Len).split('\0').first; Cursor += Len; - return Str.split('\0').first; + return true; } uint64_t getCursor() const { return Cursor; } |