Сейчас так же тихо для C и C++ начата переделка механизма анализа потока данных. Будем переходить от "исторически сложившихся механизмов" к полноценному IR для вычислений.
Это улучшит вычисления для того, что называется страшным словосочетанием "межпроцедурный контекстно-чувствительный анализ". На практике это учёт того, что возвращает функция в зависимости от переданных аргументов:
int get(int a, int b = 7)
{
return a + 2 - b;
}
int main()
{
int a = 5;
auto divider = get(a, 1);
return a / divider;
}
PVS-Studio выдаёт предупреждение: V609 Divide by zero. Denominator 'divider' == 0.
А если вот так, то уже всё хорошо:
int main()
{
int a = 5;
auto divider = get(a, 1);
return a / divider;
}
Вернее, хорошо, что больше нет деления на ноль. Зато выявляется другой дефект: результат деления 5/6 не имеет смысла, так как в результате целочисленного деления всегда будет получаться 0. Про это уже будет другое предупреждение: V1064 The 'a' operand of integer division is less than the 'divider' one. The result will always be zero.