Как сделать мой компилятор более глупым (неправильный индекс)? - PullRequest
0 голосов
/ 27 декабря 2018

Я столкнулся с ужасной ситуацией.Я обычно использую визуальный код для редактирования своего кода, а также компилирую и выполняю в нем (F5).Но я обнаружил, что vscode слишком умный или игнорирует некоторые предупреждения для меня.И выведите правильный ответ, который также отлично работает в Ideone. Но в окне cmd или dev C ++ мой код не может ничего выводить, просто возвращает большое число.

И я обнаружил, что произойдет некоторая ситуация, о которой я упоминал выше.

Код, подобный этому

for (i = 0; i < g.size(); i++)
{
    int source;
    int dest;
    int minWeight = 999;

    for (j = 0; i < g[j].size(); j++)
    {
        // no edge, come to next condition
        if (!g[i][j])
            continue;
        if (g[i][j] < minWeight)
        {
            source = i;
            dest = j;
            minWeight = g[i][j];
        }
    }
    if
        updateGroup(index, index[source], index[dest]);
    else
        updateGroup(index, index[source], index[dest]);
}

Вы можете обнаружить, что второй цикл for имеет неправильный оператор условия, он должен измениться j = 0; i < g[j].size(); j++ на j = 0; j < g[i].size(); j++

Так что мне интересно знать

  1. Можно ли как-нибудь разрешить мой vscode более строгий?

  2. Почему он все еще может выводить правильный ответ в vscode и ideone?

  3. Как избежать или легче найти, где мой код неверен, когда такого рода нет сообщений об ошибках ?

Действительно надеюсь, что кто-то может помочья, и ценю все ваши предложения !!

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

1) Увеличьте количество предупреждений вашего компилятора.

2) Используйте несколько разных компиляторов (все они предупреждают о разных вещах).

3) Хорошо знайте детали языка (многолетнее усилие) и будьте очень, очень осторожны с кодом, который вы пишете.

4) Пишите (и регулярно запускайте) множество тестов.

5) Используйте инструменты, такие как дезинфицирующие средства, фаззеры, линтеры, статические анализаторы кода и т. Д., Чтобы помочь обнаруживать ошибки.

6) Создавайте и запускайте код на нескольких платформах, чтобы он был переносимым и находилошибки, обнаруженные в различных средах / реализациях.

0 голосов
/ 27 декабря 2018

Компилятор или компьютер не могут прочитать ваши мысли и угадать, что вы хотели написать вместо того, что вы действительно имели в виду.

Даже если эта ошибка приводит к ошибке, он не может знать, чтовы не намеревались писать это, или что вы хотели написать что-то другое.

Даже когда эта ошибка приводит к тому, что ваша программа имеет неопределенное поведение, невозможно обнаружить много случаев неопределенного поведения,и автору компилятора не стоит пытаться писать код для этого, потому что это слишком сложно и недостаточно полезно.Даже если бы они это сделали, компилятор все равно не мог бы угадать, что вы имели в виду.

Помните, что подобные циклы не имеют для проверки или увеличения той же переменной, которую вы объявили в преамбуле;это просто общий шаблон (теперь заменен более безопасным оператором дальнего радиуса действия).Нет ничего плохого в том, чтобы иметь цикл, который увеличивает i, но проверяет j.

В конечном счете, решение этой проблемы заключается в написании tests для вашего кода, поэтому многиеВ организациях есть специальные группы обеспечения качества для поиска ошибок и того, почему вы должны уже тестировать свой код, прежде чем вносить его в свой проект.

Не забывайте концентрироваться, уделять пристальное внимание и читать ваш коди в конечном итоге такие опечатки станут менее распространенными в вашей работе.Конечно, время от времени вы будете писать ошибку, и ваши тесты ее поймут.Иногда ваши тесты не будут ловить его, когда ваши клиенты в конечном итоге заметят это и подадут жалобу.Затем вы выпускаете новую версию, которая исправляет ошибку.

Это абсолютно нормальная практика разработки программного обеспечения.Вот что делает это забавным!?

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