Я экспериментирую с gcov, используя mingw gcc 4.4.0. Я получаю интересные, но странные результаты. Обычная схема примерно такая...
5162: 66: std::string::iterator i = l_Temp.begin ();
5162: 67: std::string::iterator j = l_Temp.end () - 1;
-: 68: char ch;
-: 69:
20564: 70: while (i < j)
-: 71: {
10240: 72: ch = *i; *i = *j; *j = ch; i++; j--;
-: 73: }
-: 74:
#####: 75: return l_Temp;
-: 76:}
Как это return
может вообще не выполняться, учитывая, что предыдущий цикл явно одновременно выполняется и завершается? Я думаю, что стал жертвой оптимизации возвращаемого значения, учитывая, что эта временная переменная имеет тип std::string
.
Проблема в том, что я уже указываю -O0
в опциях компилятора. Это точные флаги компилятора, которые я использую...
-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage
Я думаю, что не все оптимизации отключены -O0
в конце концов. Я могу начать искать определенные флаги оптимизации один за другим, когда замечаю проблемы, но это кажется странным.
Итак, какие флаги должны я указать, чтобы получить нормальные результаты покрытия от gcov?
ИЗМЕНИТЬ
Пока что я думаю, что мне нужны следующие дополнительные флаги...
- -fno-по умолчанию встроенный
- -fno-встроенный
Я не уверен, что они оба нужны, хотя я думаю, что каждый из них отключает определенный тип встроенного кода.
Однако я не нашел способа отключить оптимизацию возвращаемого значения. Это не большая проблема, но немного раздражает. При стремлении к 100-процентному охвату некоторые файлы, которые действительно достигают 100-процентного охвата, будут отмечены как меньшие из-за этой проблемы. Grep может найти маркеры #####
и показать, относятся ли они к операторам return
, но вам все равно нужно провести визуальную проверку, чтобы убедиться, что проблема связана исключительно с RVO.