2009-12-09 7 views
2

Я проверяю результаты из инструмента анализа статического кода Klocwork.STL iterator - почему инструмент анализа кода жалуется?

Он жалуется на следующий код:

293 for(my_vector_typedef::iterator it(start_pos); it != end_pos ; ++it){ 
294 delete *it; 
295 } 

со следующим сообщением:

Object 'it._M_current' используется после того, как он был освобожден. Объект 'it._M_current' был использован в строке 293 после освобождения путем передачи аргумента 1 функции 'delete' в строке 294

Я знаю, что вещи (особенно итераторы) в STL иногда не так, как они кажутся мне. хотел бы понять, что происходит. Целесообразно формулировать вопрос глупо - «delete» выполняется на том, что «он» указывает, а не «сам», поэтому почему он жалуется на то, что он используется с «++ it»? Это не то, что было удалено?

+2

Статический анализ не является совершенным. Он может ошибочно отмечать ошибки в программе, где код ведет себя корректно. Поскольку некоторые проверки кода требуют большей точности анализа, чем другие, частота ложных срабатываний может сильно различаться между различными проверками. –

ответ

1

Это выглядит так, как будто инструмент немного смущен тем фактом, что вы пытаетесь удалить объект, на который ссылается итератор. ++it должен просто перезагрузить _M_current с его новым значением, но это, похоже, путает инструмент.

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

0

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

0

Вы можете переписать ваш цикл, чтобы увеличить it до delete:

my_vector_typedef::iterator it(start_pos); 
while(it != end_pos) 
{ 
    type_used_in_my_vector* x = *it++; 
    delete x; 
} 
+0

iek! переписать идеальный код для соответствия выходному значению инструмента? – xtofl

+1

Ну, инструмент не думает, что это прекрасно. И мне нужно задаться вопросом, для чего нужен 'operator ++' итератора 'it._M_current' для. Это сводится к: 1) найти способ сообщить инструменту, что эта «ошибка» в порядке, или 2) переписать код, чтобы сделать то же самое, но в еще одной строке, или 3) вывернуть инструмент. Я не вижу здесь лучшего ответа, извините. –