Дорвался, наконец, до Coverity (система статического анализа кода на предмет типичных программистских ошибок). В бытность стартапом много лет назад мы их продукт рассматривали на предмет полезности; тогда оказалось, что он скорее обуза. Сейчас же, в большой компании, где она уже установлена, почему бы не попробовать, тем более что столько времени прошло, должно было бы получше стать?
Ну и попробовал на свою голову (ниже псевдокод, демонстрирующий проблему, цветом выделены комментарии Coverity):
char* sName = strdup(что-то); char* sTempName = NULL; while (...) { Assigning: "sTempName" = "sName". Now both point to the same storage. sTempName = sName ; if (...) { sName = strdup(что-то ещё); } ... At conditional: "sTempName != sName" taking the true branch. if (sTempName != sName) { "free" frees parameter "sTempName". free(sTempName); } } Using freed pointer "sName". return sName;
Ну не зайки?
Upd: --enable-constraint-fpp