Анализатор обнаружил в теле функции метку, на которую не ссылается ни один оператор 'goto'. Возможно, программист ошибся и использует где-то переход не на ту метку.
Синтетический пример некорректного кода:
string SomeFunc(const string &fStr) { string str; while(true) { getline(cin,str); if (str == fStr) goto retRes; else if(str == "stop") goto retRes; } retRes: return str; badRet: return "fail"; }
В теле функции есть метка 'badRet' на которую не ссылается ни один оператор 'goto', но при этом присутствует другая метка 'retRes', на которую есть ссылка. Программист ошибся и вместо перехода на метку 'badRet' продублировал переход на метку 'retRes'.
Тогда корректный код мог бы выглядеть так:
string SomeFunc(const string &fStr) { string str; while(true) { getline(cin,str); if (str == fStr) goto retRes; else if(str == "stop") goto badRet; } retRes: return str; badRet: return "fail"; }
Другой пример некорректного кода:
int DeprecatedFunc(size_t lhs, size_t rhs, bool cond) { if (cond) return lhs*3+rhs; else return lhs*2 + rhs*7; badLbl: return -1; }
В данном случае будет выдано сообщение с низким уровнем опасности, так как метка 'badLbl' осталась после изменения функции, а операторы 'goto', ссылающиеся на неё, были удалены.
Анализатор не будет выдавать предупреждение в случае, если в теле функции есть оператор 'goto', ссылающийся на данную метку, но он закомментирован или этот участок кода не компилируется из-за директивы '#ifdef'.
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V729. |