Skip to content

Commit 1d01b83

Browse files
committed
errordesc.cc: Correctly append a single character to a std::string
The idiom char c = ...; _userMsg.append( &c ); is not correct C++, because it treats the address of 'c' as a NUL- terminated C string. However, this is not guaranteed. When building and testing on Debian Stretch with AddressSanitizer: ASAN_OPTIONS="detect_leaks=false" CXX="clang++" CC=clang CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" cmake .. -DSC_ENABLE_TESTING=ON -DSC_BUILD_SCHEMAS="ifc2x3;ap214e3;ap209" ASAN_OPTIONS="detect_leaks=false" make ASAN_OPTIONS="detect_leaks=false" ctest . --output-on-failure an error like the following is encountered: ==15739==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffeb2ca7621 at pc 0x00000043c943 bp 0x7ffeb2ca75d0 sp 0x7ffeb2ca6d80 READ of size 33 at 0x7ffeb2ca7621 thread T0 #0 0x43c942 in __interceptor_strlen.part.45 (/home/jepler/src/stepcode/build/bin/lazy_sdai_ap214e3+0x43c942) #1 0x7fb9056e6143 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(char const*) (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x11f143) #2 0x7fb905b677c3 in ErrorDescriptor::AppendToDetailMsg(char) /home/jepler/src/stepcode/src/clutils/errordesc.cc:150:5 Address 0x7ffeb2ca7621 is located in stack of thread T0 at offset 33 in frame #0 0x7fb905b676af in ErrorDescriptor::AppendToDetailMsg(char) /home/jepler/src/stepcode/src/clutils/errordesc.cc:149 This frame has 1 object(s): [32, 33) '' <== Memory access at offset 33 overflows this variable A similar problem with AppendToUserMsg is found by inspection. After this change, all 200 tests pass under the AddressSanitizer configuration
1 parent 0d2e791 commit 1d01b83

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

src/clutils/errordesc.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void ErrorDescriptor::PrependToUserMsg( const char * msg ) {
131131
}
132132

133133
void ErrorDescriptor::AppendToUserMsg( const char c ) {
134-
_userMsg.append( &c );
134+
_userMsg.push_back( c );
135135
}
136136

137137
void ErrorDescriptor::AppendToUserMsg( const char * msg ) {
@@ -147,7 +147,7 @@ void ErrorDescriptor::PrependToDetailMsg( const char * msg ) {
147147
}
148148

149149
void ErrorDescriptor::AppendToDetailMsg( const char c ) {
150-
_detailMsg.append( &c );
150+
_detailMsg.push_back( c );
151151
}
152152

153153
void ErrorDescriptor::AppendToDetailMsg( const char * msg ) {

0 commit comments

Comments
 (0)