Код (взят с 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)
- Форум Нужна помощь в вводе юникодной строки в программу C (2023)
- Форум Линковщик clang'а не видит функцию в заголовочном файле (2022)
- Форум Бинарник откомпилированный gcc - работает, clang - нет. (2014)
- Форум PostgreSQL и Си как компилятор gcc заставить найти libpq (2015)
- Форум Глюк GCC? (2010)
- Форум Я, X11 и select (2009)
- Форум видимость переменных в разных функциях в С (2005)
- Форум [бенчмарк] С++ медленне С в 5 раз при уже при 0.1% кидаемых исключений [ЧЯДНТ ?] (2009)
- Форум Вопрос по применению c-ares (2023)