Я использую Rapidjson и заметил, что когда я включаю оптимизацию в g ++ (-O1/-O2/-O3), я получаю ошибку сегментации. Я думаю, что я отследил его до функции GenericValue & AddMember() в пределах quickjson.Ошибка Rapidjson seg с оптимизацией g ++
GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {
RAPIDJSON_ASSERT(IsObject());
RAPIDJSON_ASSERT(name.IsString());
Object& o = data_.o;
if (o.size >= o.capacity) {
if (o.capacity == 0) {
o.capacity = kDefaultObjectCapacity;
o.members = reinterpret_cast<Member*>(allocator.Malloc(o.capacity * sizeof(Member)));
}
else {
SizeType oldCapacity = o.capacity;
o.capacity += (oldCapacity + 1)/2; // grow by factor 1.5
o.members = reinterpret_cast<Member*>(allocator.Realloc(o.members, oldCapacity * sizeof(Member), o.capacity * sizeof(Member)));
}
}
o.members[o.size].name.RawAssign(name);
o.members[o.size].value.RawAssign(value);
o.size++;
return *this;
}
При отладке, можно видеть, что kDefaultObjectCapacity (оптимизируется выход (это статический Const SizeType kDefaultObjectCapacity = 16)
Поэтому линия "o.capacity = kDefaultObjectCapacity;" не выполняется и таНос является mallocing 0 байт, а затем пытается бросить его.
Почему это статическая Const удаляется?
Я попытался сделать объект & о как летучий и статическом, neithe r работал. Любые идеи?
Благодаря Will
EDIT: я не могу легко запускать тесты, как это на встроенной платформе, rapidjson построена с использованием Buildroot в данный момент. Я попробовал модульные тесты, но не мог заставить их идти по цели.
Я могу взглянуть на предоставление сборки, но это часть большого приложения, поэтому может быть трудно найти правильный бит.
Для информации, это метод, который вызывает код rapidjson и это, где проблема, кажется:
int16_t FrontEndJSONHandlers::get_run_cfg_packer(JSONEngine& json_engine, char *message, int32_t *length)
{
Document doc;
// Need to pack an empty request to get the data
doc.SetObject();
doc.AddMember(JSONRPC_MEMBER, JSONRPC_VERSION, doc.GetAllocator());
doc.AddMember(METHOD_MEMBER, JSON_RPC_METH_GET_RUN_CFG, doc.GetAllocator());
doc.AddMember(ID_MEMBER, json_engine.GetNextMessageID(), doc.GetAllocator());
// Format the message
json_engine.FormatMessageAndRegisterResponseHandler(&doc, &message, &length, get_run_cfg_handler);
return 0;
}
Если я документ документ статичен, он не сегмы вины - не уверен в том, это лучший способ обойти это?
Можете ли вы показать нам сгенерированную сборку, как с оптимизацией, так и без нее? (См. Https://stackoverflow.com/questions/137038/how-do-you-get-assembler-output-from-c-c-source-in-gcc) – robert
Выполняют ли модульные тесты в пакете fastjson? Возможно, приложение имеет поврежденную память. –