本文整理汇总了C++中SgAsmGenericSection::read_content_local方法的典型用法代码示例。如果您正苦于以下问题:C++ SgAsmGenericSection::read_content_local方法的具体用法?C++ SgAsmGenericSection::read_content_local怎么用?C++ SgAsmGenericSection::read_content_local使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SgAsmGenericSection
的用法示例。
在下文中一共展示了SgAsmGenericSection::read_content_local方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SgAsmStringStorage
/* Creates the storage item for the string at the specified offset. If "shared" is true then attempt to re-use a previous storage
* object, otherwise create a new one. Each storage object is considered to be a separate string, therefore when two strings
* share the same storage object, changing one string changes the other. */
SgAsmStringStorage *
SgAsmCoffStrtab::create_storage(rose_addr_t offset, bool shared)
{
ROSE_ASSERT(offset!=SgAsmGenericString::unallocated);
SgAsmGenericSection *container = get_container();
/* Has the string already been created? */
if (shared) {
for (referenced_t::iterator i=p_storage_list.begin(); i!=p_storage_list.end(); ++i) {
if ((*i)->get_offset()==offset && (*i)!=p_dont_free)
return *i;
}
}
/* Read string length byte */
unsigned char byte;
container->read_content_local(offset, &byte, 1);
unsigned len = byte;
/* Make sure new storage isn't inside some other string. (We don't support nested strings in COFF where the length byte of
* the nested string is one of the characters of the outer string.) */
for (referenced_t::iterator i=p_storage_list.begin(); i!=p_storage_list.end(); ++i) {
ROSE_ASSERT((*i)->get_offset()==SgAsmGenericString::unallocated ||
offset + 1 + len <= (*i)->get_offset() ||
offset >= 1 + (*i)->get_string().size());
}
/* Create storage object */
char *buf = new char[len];
container->read_content_local(offset+1, buf, len);
SgAsmStringStorage *storage = new SgAsmStringStorage(this, std::string(buf, len), offset);
delete[] buf;
/* It's a bad idea to free (e.g., modify) strings before we've identified all the strings in the table. Consider
* the case where two strings have the same value and point to the same offset (i.e., they share storage). If we modify one
* before we know about the other then (at best) we modify the other one also.
*
* The only time we can guarantee this is OK is when the new storage points to the same file location as "dont_free"
* since the latter is guaranteed to never be freed or shared. This exception is used when creating a new, unallocated
* string (see SgAsmStoredString(SgAsmGenericStrtab,const std::string&)). */
if (p_num_freed>0 && (!p_dont_free || offset!=p_dont_free->get_offset())) {
fprintf(stderr,
"SgAsmCoffStrtab::create_storage(%"PRIu64"): %zu other string%s (of %zu created) in [%d] \"%s\""
" %s been modified and/or reallocated!\n",
offset, p_num_freed, 1==p_num_freed?"":"s", p_storage_list.size(),
container->get_id(), container->get_name()->get_string(true).c_str(),
1==p_num_freed?"has":"have");
ROSE_ASSERT(0==p_num_freed);
}
set_isModified(true);
p_storage_list.push_back(storage);
return storage;
}