Функция C меняет поведение в зависимости от того, есть ли в ней вызов printf - PullRequest
3 голосов
/ 15 марта 2010

У меня есть функция, которая обрабатывает некоторые данные и находит порог, который классифицирует данные с наименьшей ошибкой. Это выглядит так:

void find_threshold(FeatureVal* fvals, sampledata* data, unsigned int num_samples, double* thresh, double* err, int* pol) {
    //code to calculate minThresh, minErr, minPol omitted
    printf("minThresh: %f, minErr: %f, minPol: %d\n", minThresh, minErr, minPol);
    *thresh = minThresh;
    *err = minErr;
    *pol = minPol;
}

Тогда в моем тестовом файле у меня есть это:

void test_find_threshold() {
    //code to set up test data omitted
    find_threshold(fvals, sdata, 6, &thresh, &err, &pol);

    printf("Expected 5 got %f\n", thresh);
    assert(eq(thresh, 5.0));
    printf("Expected 1 got %d\n", pol);
    assert(pol == 1);
    printf("Expected 0 got %f\n", err);
    assert(eq(err, 0.0));
}

Запускается, и тест проходит со следующим выводом:

minThresh: 5.000000, minErr: 0.000000, minPol: 1
Expected 5 got 5.000000
Expected 1 got 1
Expected 0 got 0.000000

Однако, если я уберу вызов printf () из find_threshold, тест неожиданно провалится! Закомментируя утверждения, чтобы я мог видеть, что возвращается, вывод:

Expected 5 got -15.000000
Expected 1 got -1
Expected 0 got 0.333333

Я не могу понять этого вообще.

Ответы [ 2 ]

6 голосов
/ 15 марта 2010

printf можно звонить malloc. Из-за этого, если у вас есть несколько висячих указателей, вызов printf может изменить значения, на которые они указывают. Если ваша программа строго соответствует, вы не заметите такого рода различий при вызове printf (как вы и ожидали). В худшем случае распределение в printf может завершиться неудачно, но не приведет к повреждению других переменных.

5 голосов
/ 15 марта 2010

Я бы заподозрил некоторые проблемы с доступом / распределением памяти и тестировал с valgrind

...