This hits the next batch of classes and adds better error handling and recovery to them. After this, the only remaining case is the line table stuff, at which point we should be able to get all logging out of the low level DWARF parsing entirely.
I think it's reasonable to treat this as an internal consistency check, where the pre-condition of this function is "offset must be a valid offset". Similar to indexing an array out of bounds, your operator implementation would assert that the index you passed is within range.
Yes, but I was trying to keep the change set minimal, and doing so would propagate that change many levels up the callstack until we reach SymbolFileDwarf, at which point we would change all calls to pass *this instead of this. That's a reasonable change, but should probably be done separately to keep logically separate changes separate.
Note that, long term, we just won't even pass a SymbolFileDWARF to this function at all, because if the point is to decouple the high and low level interfaces, then the low-level interface can't know about the high level interface.