Ошибка выполнения (неинициализированное чтение) в конкурсе Codeforces - PullRequest
0 голосов
/ 15 апреля 2020

Я пытался решить вопрос Префикс суффикса о Codeforces, когда столкнулся с неопределенной ошибкой чтения. Вот мое представление

#include <bits/stdc++.h>

#define ll long long int 
#define MOD 998244353

using namespace std;

int KMP (string s) {
    int arr[s.length()];
    int i = 1, j = 0;
    arr[0] = 0;
    while( i < s.length()) {
        if(s[i] == s[j]) {
            arr[i] = j + 1;
            i++;
            j++;
        }
        else {
            if( j != 0) {
                j = arr[j -1];
            }
            else arr[i] = 0;
            i++;
        }
    }
    return arr[s.length() - 1];
}

void solve() {
    string s;
    cin >> s;
    int i = 0, j = s.length() - 1;
    while ( i <= j && s[i] == s[j] ) {

        if( i == j || i + 1 == j ) {
            cout << s << endl;
            return;
        }
        i++; j--;
    }
    int k = i;
    string newS = s.substr(i, s.size() - 2 * i);
    string rev = newS;
    reverse(rev.begin(), rev.end());

    string pal1 = newS + '#' + rev;
    string pal2 = rev + '#' + newS;
    // cout << newS << " " << rev << " " << pal1 << " " << pal2 << endl;
    string res = "";
    int size1 = KMP(pal1),size2 = KMP(pal2);
    if( size1 > size2) {
        res += s.substr(0, k + size1) + s.substr(s.size() - i);
    }
    else {
        res += s.substr(0, k) + s.substr(s.size() - i - size2);
    }
    cout << res << endl;
}

int main()
{
    int t;
    cin >> t;
    while(t--) {
        solve();
    }
}

, которое дало следующую проблему

Diagnostics detected issues [cpp.g++17-drmemory]: ~~Dr.M~~ Dr. Memory version 1.11.0
~~Dr.M~~ Running "program.exe"
~~Dr.M~~ 
~~Dr.M~~ Error #1: UNINITIALIZED READ: reading 0x1059fe8c-0x1059fe90 4 byte(s)
~~Dr.M~~ # 0 solve               [K:\invoker-prod\work\codeforces6\2d955443cb64b59d0725278c4118bdb0\compile-dc6a4b92d96ace20e3fc7f428e5ccac3/p71.cpp:52]
~~Dr.M~~ # 1 main                [K:\invoker-prod\work\codeforces6\2d955443cb64b59d0725278c4118bdb0\compile-dc6a4b92d96ace20e3fc7f428e5ccac3/p71.cpp:66]
~~Dr.M~~ Note: @0:00:00.620 in thread 4944
~~Dr.M~~ Note: instruction: cmp    %eax 0xffffffe4(%ebp)
~~Dr.M~~ 
~~Dr.M~~ TERMINATING PROCESS after first error found
~~Dr.M~~ 
~~Dr.M~~ ERRORS FOUND:
~~Dr.M~~       0 unique,     0 total unaddressable access(es)
~~Dr.M~~       1 unique,     1 total uninitialized access(es)
~~Dr.M~~       0 unique,     0 total invalid heap argument(s)
~~Dr.M~~       0 unique,     0 total GDI usage error(s)
~~Dr.M~~       0 unique,     0 total handle leak(s)
~~Dr.M~~       0 unique,     0 total warning(s)
~~Dr.M~~       0 unique,     0 total,      0 byte(s) of leak(s)
~~Dr.M~~       0 unique,     0 total,      0 byte(s) of possible leak(s)
~~Dr.M~~ ERRORS IGNORED:
~~Dr.M~~       2 potential error(s) (suspected false positives)
~~Dr.M~~          (details: K:\invoker-prod\work\codeforces6\e66acc517678db6ede3f663ff018663a\check-7d66d73ddd03e8e7418a8d6e48a639ee\run\DrMemory-program.exe.2504.000\potential_errors.txt)
~~Dr.M~~      11 unique,    11 total,  24568 byte(s) of still-reachable allocation(s)
~~Dr.M~~          (re-run with "-show_reachable" for details)
~~Dr.M~~ Details: K:\invoker-prod\work\codeforces6\e66acc517678db6ede3f663ff018663a\check-7d66d73ddd03e8e7418a8d6e48a639ee\run\DrMemory-program.exe.2504.000\results.txt
~~Dr.M~~ WARNING: application exited with abnormal code 0xc0000005

Строка 52 - это та, где я сравниваю два размера после вызова функции KMP.

if( size1 > size2) {

После прочтения я узнал, что эта ошибка возникает, когда переменной выделяется память, но ей не присваивается значение, и она используется в операции. Я попытался назначить целое число переменным, которое, как я думал, послужило причиной этой проблемы, но также не помогло. Вот еще два представления к тому же 76739874 76740717

...