String有以下c_ptr()接口:
class String { char *Ptr; uint32 str_length,Alloced_length; bool alloced; public: inline char *c_ptr() { if (!Ptr || Ptr[str_length]) /* Should be safe */ (void) realloc(str_length); //可能给Ptr分配内存 return Ptr; } };
如果某个String对象的Ptr是通过引用方式使用的,则可能会导致内存泄漏。
class Parameter_group_concat { public: String *separator; bool operator == (const Parameter_group_concat &source) { if( source.separator != separator ){ // … … if(memcmp(separator->c_ptr(), source.separator->c_ptr(), separator->length() ) != 0 ) return false; } } }; // 以上c_ptr()调用为separator的Ptr分配了内存,但是separator是由上层的yacc传递下来的,,yacc有自己的内存管理池,不会去删除separator的Ptr空间。导致此处c_ptr()申请的内存无人释放。
以下代码存在越界读问题。
String str;str.append("1234567"); str.append('8'); std::string exprString = str.c_ptr(); //越界读
bool append(char chr)有个问题:每追加一个字符,str_length自增1,因此可能会等于Alloced_length,那么接下来调用String::c_ptr()会越界读一个字节。
两种修订方法: