Стоматологические услуги для компиляторов на примере LLVM 21
Многие слышали миф о маленьких птичках, "чистящих зубы" крокодилам. И пусть в живой природе этого не найти, но зато в мире программ есть свои герои, способные помочь ещё более могучим ящерам — драконам в лице компиляторов. Ну или в нашем случае виверне, ведь именно она на логотипе LLVM, чья очередная версия попала под чистку от багов.
Среди сегодняшних процедур: рытьё истории коммитов, чтение технических спецификаций и краткий румтур по совершенно разным уголкам проекта LLVM — от принтеров дебаг информации до оптимизатора и работы с регистрами.
Например, коснёмся инструкции CPUID:
Предупреждение PVS-Studio: V560 A part of conditional expression is always false: AVX10Ver >= 2. Host.cpp 2177
StringMap<bool> sys::getHostCPUFeatures() {
unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
....
bool HasLeaf24 = MaxLevel >= 0x24
&& !getX86CpuIDAndInfo(0x24, &EAX, &EBX, &ECX, &EDX);
int AVX10Ver = HasLeaf24 && (EBX & 0xff);
Features["avx10.1"] = HasAVX10 && AVX10Ver >= 1;
Features["avx10.2"] = HasAVX10 && AVX10Ver >= 2;
return Features;
}
В выражении HasLeaf24 && (EBX & 0xff) сперва оба операнда && приведутся к типу bool, вычислится логическое "И", а затем результат снова расширится до типа int. На выходе получаем значение 0 или 1, и выражение AVX10Ver >= 2 всегда будет вычисляться как false.
Опечатка, ошибка в логике или кривой мёрж? Git blame и спецификация помогут ответить на этот вопрос, как и на многие другие, если вас заинтересовало – продолжение читайте в статье.

















