c++ - program crash in std::sort() sometimes, can't reproduce -
description:
my program crash in std::sort()
, write minimal program reproduce situation, alright. here minimal example:
typedef struct st { int it; char ch; char charr[100]; vector<string *> *vs; } st; bool function(st *&s1, st *&s2) { static int = 1; cout<<i<<" "<<&s1<<" "<<&s2<<endl; ++i; return s1->it > s2->it; } int main(int argc, char **argv) { vector<st *> ar; (int = 0; < 100; ++i) { st *s = new st; s->it = urandom32(); ar.push_back(s); } ar.clear(); (int = 0; < 100; ++i) { st *s = new st; s->it = urandom32(); ar.push_back(s); } sort(ar.begin(), ar.end(), function); return 0; }
here gdb stack info:
- 0 0x00007f24244d9602 in article_cmp (cand_article_1=0x7f23fd297010, cand_article_2=0x4015) @ src/recom_frame_worker.h:47
- 1 0x00007f24244fc41b in std::__unguarded_partition<__gnu_cxx::__normal_iterator > >, cand_article*, bool ()(cand_article, cand_article*)> (__first=, __last=, __pivot=@0x7f230412b350: 0x7f23fd297010, __comp=0x7f24244d95e1 ) @ /usr/include/c++/4.8.3/bits/stl_algo.h:2266
- 2 0x00007f24244f829c in std::__unguarded_partition_pivot<__gnu_cxx::__normal_iterator > >, bool ()(cand_article, cand_article*)> (__first=, __last=, __comp=0x7f24244d95e1 ) @ /usr/include/c++/4.8.3/bits/stl_algo.h:2296
- 3 0x00007f24244f1d88 in std::__introsort_loop<__gnu_cxx::__normal_iterator > >, long, bool ()(cand_article, cand_article*)> (__first=, __last=, __depth_limit=18, __comp=0x7f24244d95e1 ) @ /usr/include/c++/4.8.3/bits/stl_algo.h:2337
- 4 0x00007f24244ed6e5 in std::sort<__gnu_cxx::__normal_iterator > >, bool ()(cand_article, cand_article*)> ( __first=, __last=, __comp=0x7f24244d95e1 ) @ /usr/include/c++/4.8.3/bits/stl_algo.h:5489
article_cmp
called in sort(article_result->begin(), article_result->end(), article_cmp);
, article_result vector<cand_article*> *
. cand_article
struct.
here definition of article_cmp
:
bool article_cmp(cand_article* cand_article_1, cand_article* cand_article_2) { return cand_article_1 -> display_time >= cand_article_2 -> display_time; }
here piece of code crash happens:
article_result->clear(); for(vec_iter = _channel_data -> begin(); vec_iter != _channel_data -> end(); vec_iter++) { cand_article* cand = to_cand_group(*vec_iter); if(cand == null) continue; // refresh open loadmore if(m_request.req_type == 1) { if(cand -> display_time > m_request.start){ article_result->push_back(cand); } }else if(m_request.req_type == 2){ if(cand -> display_time < m_request.end){ article_result->push_back(cand); } }else{ article_result->push_back(cand); } } sort(article_result->begin(), article_result->end(), article_cmp);
question:
i don't know how handle kind of coredump
, cause 0x4015
kernel space address? suggestions on how fix kind of bug? sorry, can't reproduce situation minimal program. , happened in single thread
, don't need think multi-thread
situation.
the rule "if std::sort
crashes, have invalid comparison function". comparison function is:
bool article_cmp(cand_article* lhs, cand_article* rhs) { return lhs -> display_time >= rhs -> display_time; }
this not strict weak ordering. in particular, if display times equal returns true
, means if swap arguments still return true
... , not allowed. need:
bool article_cmp(cand_article* lhs, cand_article* rhs) { return lhs -> display_time > rhs -> display_time; }
the reason simplified example works (congratulations @ least trying simplify), simplified comparison function valid. if return statement return s1->it >= s2->it;
, , used smaller range of values, crash.
incidentally, more natural c++ declaration of example structure like:
struct st { // no need typedef in c++ int it; char ch; std::string charr; // ... or *possibly* std::array<char,100>. std::vector<std::string> vs; // strings , vectors best held value };
also note have used std::
prefix.
Comments
Post a Comment