Неопределенное поведение при сортировке с компаратором - PullRequest
2 голосов
/ 19 июня 2020

Мне нужно проанализировать числа из строки и отсортировать вектор в возрастающем диапазоне для первого числа и, если первые числа равны, по вторым числам в алфавите c порядок, как строки: [1, 250; 2, 30; 4, 40; 1, 26] -> [1, 250; 1, 26; 2, 30; 4, 40].
Как «250» <«26», массив отсортирован как раньше. <br>
Есть алгоритм:

#include<assert.h>
#include<vector>
#include<string>

int sum_digits(int a);

string orderWeight()
{
    vector<pair<int, int> > weight_number;
    string str = "103 123 4444 99 2000 ";
    string Numbers = "1234567890";
    int Num;
    for (auto i_beg = str.cbegin(); i_beg < str.cend(); ++i_beg)
    {
        if (Numbers.find(*i_beg) != string::npos)
            for (auto i_end = i_beg + 1; i_end < str.cend(); ++i_end)
            {
                if (Numbers.find(*i_end) == string::npos)
                {
                    Num = stoi(string(i_beg, i_end));
                    weight_number.emplace_back(sum_digits(Num)/*This function count sum of digits*/, Num);
                    i_beg = i_end;
                    break;
                }
            }
    }
    sort(weight_number.begin(), weight_number.end(),
       [](const pair<int, int>& a, const pair<int, int>& b) -> bool {
        if (a.first != b.first)
            return a.first < b.first;
        string s1 = to_string(a.second);
        string s2 = to_string(b.second);
        bool res = s1.compare(s2) < 0;
        return res;
    });

    string result;
    for (auto El: weight_number)
    {
        result += to_string(El.second) + " ";
    }
    result.pop_back();
    return result;
}

int sum_digits(int a)
{
    int sum = 0;
    for (; a > 0; a /= 10)
    {
        sum += a % 10;
    }
    return sum;
}

int main ()
{
assert(orderWeight()=="2000 103 123 4444 99")
return 0;
}

На g cc все работает хорошо, но компилятор clang выдает ошибку :

UndefinedBehaviorSanitizer:DEADLYSIGNAL
==1==ERROR: UndefinedBehaviorSanitizer: stack-overflow on address 0x7ffc35a59000 (pc 0x7f6029c2bb1f bp 0x000000001fff sp 0x7ffc35a562a8 T1)
==1==WARNING: invalid path to external symbolizer!
==1==WARNING: Failed to use and restart external symbolizer!
    #0 0x7f6029c2bb1e  (/lib/x86_64-linux-gnu/libc.so.6+0x18eb1e)
    #1 0x7f602a60a137  (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x13d137)
    #2 0x7f602a5f9432  (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x12c432)
    #3 0x42be9d  (/workspace/test+0x42be9d)
    #4 0x42b9a2  (/workspace/test+0x42b9a2)
    #5 0x425660  (/workspace/test+0x425660)
    #6 0x4258b7  (/workspace/test+0x4258b7)
    #7 0x42838c  (/workspace/test+0x42838c)
    #8 0x426a9e  (/workspace/test+0x426a9e)
    #9 0x426622  (/workspace/test+0x426622)
    #10 0x4261db  (/workspace/test+0x4261db)
    #11 0x42b5a5  (/workspace/test+0x42b5a5)
    #12 0x42573d  (/workspace/test+0x42573d)
    #13 0x7f6029abeb96  (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
    #14 0x404679  (/workspace/test+0x404679)

==1==ABORTING

Если я прокомментирую if(..), или напишу res=true, или s1="Something", или s2 ="Something" без to_string(.second), эта ошибка исчезнет. Но программа работает как раз наоборот. Я уже ищу в поисковой системе безрезультатно.
Что мне делать, чтобы удалить эту ошибку в компиляторе clang?

1 Ответ

0 голосов
/ 29 июня 2020

Возможно, сайт www.codewars.com делает что-то не так, как я писал в комментариях, потому что я также пробую это с компилятором clang, и ошибок нет.
Спасибо всем за попытку помочь мне с моим вопросом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...