Код (взят с http://lkml.org/lkml/2007/11/19/493):
#include <stdio.h>
#include <stdlib.h>
int main () {
int i=2;
if( -10*abs (i-1) == 10*abs(i-1) ) printf ("OMG,-10==10 in linux!\n");
else printf ("nothing special here\n");
}
GCC заменяет вызов abs() на встроенную версию, после чего применяет неправильную оптимизацию вида -C*ABS<n> -> ABS<-C*n>. В результате программа выше пишет:
OMG,-10==10 in linux!
Ошибка затрагивает все программы, скомпилированные официальными версиями GCC и умножающие на отрицательную константу результат функции abs(), которую GCC догадался заменить на встроенную версию.
Ядро Linux от этой ошибки не страдает, так как там abs() - это макроопределение.
Исправление: пересобрать gcc с патчем по ссылке. Workaround: использовать опцию -fno-builtin при компиляции программ.