Код (взят с 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 при компиляции программ.



Ответ на:
комментарий
от Sikon

Ответ на:
комментарий
от xTERM


Ответ на:
комментарий
от frame

Ответ на:
комментарий
от frame

Ответ на:
комментарий
от anonymous

Ответ на:
комментарий
от anonymous

Ответ на:
комментарий
от anonymous



Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [OMG] gcc и abs() (2008)
- Форум Линковщик clang'а не видит функцию в заголовочном файле (2022)
- Форум Я, X11 и select (2009)
- Форум видимость переменных в разных функциях в С (2005)
- Форум [C++] Ковариантность и виртуальное наследование (2009)
- Форум Программа из K&R вопросы по warnings, полученные от gcc (2015)
- Форум Два вопроса, почему strcpy ругается варнингом и почему сигфолт? (2005)
- Форум Не работает рендеринг в Pixmap через EGL на Radeon (2014)
- Форум GDB выдает ошибку, если включить незадействованные исходники. (2023)
- Форум с, структура/данные/наполнение, как оптимизировать?! (2025)