LINUX.ORG.RU

GCC Developers Summit


0

0

Закончился GCC Developers Summit (http://www.gccsummit.org). Встречались и решали пути дальнейшего развития gcc. Как можно посмотреть тут: http://tricolour.net/photos/2003/05/2... Результаты встречи можно посмотреть тут: http://www.linux.org.uk/~ajh/gcc/gccs... (похоже был получен мощный импульс энергии FUN - надеюсь теперь мы сможем получить ее в новых версиях gcc :)

>>> Подробности

anonymous

Проверено: green

не надо нам fun, мы уже с 2.96 и прочими 3.1 его поимели

anonymous
()

Прошу извинить меня, но я снова обращаюсь
со своим вопросом:

#include <iostream>

typedef struct tagA
{
    int x;
}
A;

void f(A *a)
{
    a->x = 1;
}

int main(int argc, char *argv[])
{
    A *a = NULL;

    // Умышленно!
    // a = (A *) malloc(sizeof(A));

    try
    { 
      f(a); 
      std::cout << a->x << std::endl;
    }
    catch(A)
    {
	std::cout << "Hi!" << std::endl;
    }
}

Будьте любезны, опубликуйте _полный_ экранный вывод
компиляции и работы программы для разных версий GCC. 

Как в gcc запретить компиляцию такого
некорректного кода? 

(У MS cl 7 и Intel icl и icc 7 это ключ "WX").

Заранее признателен за ответ по существу.

NikS
()

Sorry, для эстетов: // a = new A;

NikS.

anonymous
()

NikS иди в попу ! тебе все уже не однократно объяснили - ну не знаешь ты C/C++ ну и сиди по малкивай, зачем ты себя придурком-то выставляешь а ? Стандарт почитай блин - undefined behavior это - может быть что угодно вплоть до форматирования твоего винта ! Чего тебе и желаю - раз думать не умеешь !

anonymous
()

"Юпитер, ты сердишься - значит ты не прав!"

"ну и сиди по малкивай" - это не ответ. Вы мне _вывод_ компиляции и работы программы предоставьте, пожалуйста. Договорились?

NikS.

anonymous
()

// Умышленно! // a = (A *) malloc(sizeof(A)); Слушай Люцис Апулеус а зачем тебе вот это : (A*) Что оно должно давать?

anonymous
()

>Что оно должно давать?

Программа должна выдавать "segmentation fault" или, как вежливо говорит "Майкрософт":

"c1.exe has encountered a problem and needs to close. We are sorry for the inconvenience."

Кроме того, по крайней мере в С++, должен быть предусмотрен механизм, блокирующий компиляцию подобного рода программ.

Я просто набираю статистику по версиям gcc.

NikS.

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

crz@crzlptp> cat>a.cpp
#include <iostream>

typedef struct tagA
{
    int x;
}
A;

void f(A *a)
{
    a->x = 1;
}

int main(int argc, char *argv[])
{
    A *a = NULL;

    // Умышленно!
    // a = (A *) malloc(sizeof(A));

    try
    {
      f(a);
      std::cout << a->x << std::endl;
    }
    catch(A)
    {
        std::cout << "Hi!" << std::endl;
    }
}
crz@crzlptp> gcc a.cpp -o a -lstdc++
crz@crzlptp> ./a
zsh: 2302 segmentation fault  ./a

и это совершенно неудивительно.
предупреждения нету, потому что значение указателю ты присваиваешь. а то, что ты долбоёб - этого компилятор знать, увы, не может.

ps. а что такое try/catch ты тоже не знаешь.

crz
()

>try/catch ты тоже не знаешь

Ну все - не видать мне MCP 70-016!


> gcc a.cpp -o a -lstdc++

$g++ a.cpp -o a 
?

а теперь $g++ --version 

и 

#include <stdio.h>

typedef struct tagA
{
    int x;
}
A;

void f(A *a)
{
    a->x = 1;
}

main()
{
    A *a;

//    a = (A *) malloc(sizeof(A));

    f(a); 
    printf("%d\n", a->x);
}

$gcc --version
$ gcc a.c -o a
$ ./a

Кстати, Вы мне так и не ответили на вопрос по поводу аналога 
ключа -WX. Ждем-с.

PS. Кстати, а что Вы так разнервничались? Какие-то проблемы?

NikS.

anonymous
()

-WX Force warnings to be reported as errors.

Ну найди аналогичную опцию в gcc.

anonymous
()

-Werror Treat warnings as errors (stop compilation on warning).

Вот, нашёл для ленивых пользователей gcc.

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

crz@crzlptp> g++ a.cpp -o a
crz@crzlptp> ./a           
zsh: 2331 segmentation fault  ./a
[139] crz@crzlptp> g++ --version
g++-3.2.3 (GCC) 3.2.3 (Mandrake Linux 9.2 3.2.3-1mdk)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

crz@crzlptp> cat>a.c            
#include <stdio.h>

typedef struct tagA
{
    int x;
}
A;

void f(A *a)
{
    a->x = 1;
}

main()
{
    A *a;

//    a = (A *) malloc(sizeof(A));

    f(a);
    printf("%d\n", a->x);
}

crz@crzlptp> gcc a.c -o a       
crz@crzlptp> gcc a.c -Wall -o a 
a.c:15: warning: return type defaults to `int'
a.c: In function `main':
a.c:22: warning: control reaches end of non-void function
crz@crzlptp> ./a                
1
zsh: 2349 segmentation fault  ./a

чего я понять никак не могу, так это что ты пытаешься тут доказать?

crz
()

2NikS: блин я сержусь потому что до тебя не доходит. Повоторяю еще раз: ПОВЕДЕНИЕ программы в подобном случае НЕ ОПРЕДЕЛЕНО ! И еще раз: ПОВЕДЕНИЕ НЕ ОПРЕДЕЛЕНО ! Но все же я вижу ты хочешь написать еще одно письмо и еще раз спросить, так ? Поэтому ЕЩЕ раз: ПОВЕДЕНИЕ НЕ ОПРЕДЕЛЕНО !!!

anonymous
()

>что ты пытаешься тут доказать?

>g++ --version >g++-3.2.3 (GCC) 3.2.3 (Mandrake Linux 9.2 3.2.3-1mdk)

Я собираю статистику. Проверьте, pls, 2.96. OK?

NikS.

anonymous
()

>ПОВЕДЕНИЕ программы в подобном случае НЕ ОПРЕДЕЛЕНО !

А Вы не сердитесь, а дайте ссылочку на стандарт. Ждем-с.

NikS.

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

>Кроме того, по крайней мере в С++, должен быть предусмотрен механизм,
>блокирующий компиляцию подобного рода программ.

Cтандартом он не предусмотрен, поскольку _гарантированно_ на этапе
компиляции отловить все такие случаи невозможно. С другой стороны,
стандарт не требует "объявления-явной-инициализации".
_Псевдокод_ :
//
void alloc(int*& PTR)
{
int user_flag;
std::cin >> user_flag;
if(user_flag == 1) {
PTR = new int(1001);
}
}

int main(int argc,char* argv[])
{
int* ptr_1;
int* ptr_2;

int*& ref_1 = ptr_1; //ругаться или нет?
ref_1 = new int(101); //если ругаемся повсюду, то зря.
std::cout << "pointer 1:" << *ptr_1 << std::endl; // 101

//как отловить заранее?
alloc(ptr_2); //ругаться или нет?
//пользователь в alloc ввел не 1
std::cout << "pointer 2:" << *ptr_2 << std::endl; //упали.
}
//

Предупреждения, которые выдают в простых случаях некоторые компиляторы
-- не более чем их самодеятельность.

AC
()

2NikS >>Я просто набираю статистику по версиям gcc. :))) Я просто хренею :))) ты вообще в курсе что такое -WX ? Это преобразовывать ворнинги в ошибки. Спорим что я напишу такой код на который никакой VC++/Intel C++ не даст никакого ворнинга ни с какими опциями а просто тихо упадет :))) Спорим ?!! Тебе же сказали не знаешь C/C++ - не позорься :))) Любитель C# мля :)

anonymous
()

Привет AC!

Как я предполагаю - ругаться не будет (по крайней мере MS cl 7), но на 

alloc(ptr_2); //ругаться или нет? 
//пользователь в alloc ввел не 1 
std::cout << "pointer 2:" << *ptr_2 << std::endl; //упали.

не упадет, а повиснет.

(Мину через 10 проверю на практике)


NikS.

anonymous
()

> Спорим что я напишу такой код на который никакой VC++/Intel C++ не даст никакого ворнинга ни с какими опциями а просто тихо упадет :))) Спорим ?!!

Напишите. Не нервничайте, напишите пожалуйста. Жду с нетерпением Вашего примера.

NikS.

anonymous
()

>Что оно должно давать? Программа должна выдавать "segmentation fault" или, как вежливо говорит "Майкрософт":

"c1.exe has encountered a problem and needs to close. We are sorry for the inconvenience."

Кроме того, по крайней мере в С++, должен быть предусмотрен механизм, блокирующий компиляцию подобного рода программ.

А зачем это ВАШИМ ПОЛЬЗОВАТЕЛЯМ вот что я хотел спросить ? (Отношусть с огромным уважением к вашему знанию и опыту :) А кстати не лучше ли подобный "механизм" встроить в программера:)

anonymous
()

2NikS а вы вообще в курсе что стандарт распространяется за бабки ? У меня-то оно есть а вам похоже и не надо :) Это вам не C# ублюдочный - тут головой думать надо :)

>>Кроме того, по крайней мере в С++, должен быть предусмотрен механизм, блокирующий компиляцию подобного рода программ.

Ну не знаешь ты C++, ну не знаешь :))) В рамках стандарта языка C++ создать подобный механизм НЕВОЗМОЖНО - это будет уже не C++ а помесь васика с жабой - ваш любимый тормозной и ублюдочный до жути C# :)))

anonymous
()

Вот и проверил пример, присланный AC.

"Висит" в строке alloc(ptr_2); (но снимается по Ctrl+C)

/WX полностью запрещает компиляцию подобного, но ключ /EHs, как и следовало ожидать, "снимает" действие ключа WX.

>не лучше ли подобный "механизм" встроить в программера:)

Это философской дискуссии с Луговским. F# не зря появился для определенного класса программ.

>Читай.

А если не трудно, для экономии времени, конкретный параграф укажите, пожалуйста.

NikS.

anonymous
()

2NikS: Напишите. Не нервничайте, напишите пожалуйста. Жду с нетерпением Вашего примера.

Ну ладно - ты меня достал :))) Обещаю написать - вот отлько со сроками ни чего не стану обещать - мне под линуксом такое говнище как VC++ нафиг не надо. И так давайте определимся - какой у вас копилятор ? У моего приятеля VC++6.0 скомпилил твой дурацкий пример без ошибок и ворнингов :)
Компилилось так: cl -WX test.cpp
Версия команд-лайн компилятора: 12.00.8168

мой примитивный пример то-же заглотал и не пикнул:
#include <stdio.h>
int main()
{
char *p = NULL;
*p = 0;
return 0;
}

:)))

anonymous
()

NIKS ili ya chego to ne ponyal
ili vy hotite primer gde compilyator ne dast warningov a
programma upadet ??????? Seriozno ???

uman

anonymous
()

>В рамках стандарта языка C++ создать подобный механизм НЕВОЗМОЖНО - это будет уже не C++ а помесь васика с жабой - ваш любимый тормозной и ублюдочный до жути C# :))) 

Религиозные споры по поводу чтот лучше яблоко или апельсин заводить 
не буду. Но то что не "заблокирует" /WX было бы любопытно посмотреть 
для самообразования. Так что примерам я был бы очень рад.


"...At one beta test location, the application falls intermittently, 
losing customer data when it does so. You visit the beta location 
and isolate the problem to a Win32 function call that returns a NULL 
handle from a network socket call. ...

A. Use the ASSERT macro. 
B. Use the VERIFY macro. 
C. Use an it statement. 
D. Use the CObjcrl::AssertValid function. 
E. Use the assert function. "

Готовлюсь я просто к таким и подобным вопросикам. 
Вдруг попадутся. ;-((

NikS.

anonymous
()

>Seriozno ???

Нет, мне обещали привести пример где /WX не поможет. А я скептически отношусь к таким примерам (если не использовать /EHs). ls.

Кстати, а какой аналог у /EHs в GCC?

NikS.

anonymous
()

ya shozhu s uma ???

#include <stdio.h>

int main() { char *v=NULL; char v1[100]; memcpy(v,v1,10000 ); return 1; }

VC++ compiliruet bez warningov i vyletaet koneshno zhe

uman p.s. pohozhe ya sovsem tupoi ili ya ne ponimayu Niks

anonymous
()

хорош уже кривой код обсуждать. расскажите лучше что такое FUN

.

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

>"Висит" в строке alloc(ptr_2);

Тем хуже для него. Не с чего в этой строке виснуть, она _абсолютно_легальна_. Скорее всего вы вбили что-то не то. Потому что если это не так, то место вашему компилятору -- к сожалению, на помойке.

>/WX полностью запрещает компиляцию подобного,

Естественно. /WX на самом деле -- довольно тупой механизм. Он просто не дает "физически" использовать переменную -- разыменовать, передать как параметр, и т.д., пока ей не будет присвоено значение. Работает по принципу "лучше перебдеть", и ругается на _абсолютно_ корректный код, например приведенный мной.

AC
()

Народ, кончай офтопик...

Есть, что по теме сказать ?

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

>Работает по принципу "лучше перебдеть", и ругается на _абсолютно_ >корректный код, например приведенный мной.

То есть в приведенном мной примере, если /WX ругается, то это ошибка и отклонение от стандарта. Компилятор ругаться на "правильный" код не должен.

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

>"...At one beta test location, the application falls intermittently, >losing customer data when it does so. You visit the beta location >and isolate the problem to a Win32 function call that returns a NULL >handle from a network socket call. ...

Говорят, что курс акций скачет на бирже, когда чихает кошка у брокера... А программы Win32 вываливаются с exception когда чихает кошка у Гейтса ;)

Кстати дурной пример от NikS в VC60 компилится без проблем, а с -WX не компилится из-за того, что ф-ция main не возвращает значения, а не из-за некоректного указателя

E:\share\c\temp_zip>type dumm1.cpp #include <iostream>

typedef struct tagA { int x; } A;

void f(A *a) { a->x = 1; }

int main(int argc, char *argv[]) { A *a = NULL;

// ?????????! // a = (A *) malloc(sizeof(A));

try { f(a); std::cout << a->x << std::endl; } catch(A) { std::cout << "Hi!" << std::endl; } }

E:\share\c\temp_zip>cl -GX -WX dumm1.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

dumm1.cpp dumm1.cpp(30) : error C2220: warning treated as error - no object file generated

dumm1.cpp(30) : warning C4508: 'main' : function should return a value; 'void' r eturn type assumed

Без -WX компилится и запускактся (естественно с ошибкой). Что хотел сказат примером автор - не понятно.

anonymous
()

Против: 

main() 
{ 
   int *p = (int*) 1; 
   *p = 10;
} 

приемов не знаю. Однако, такой код:

#include <iostream>

typedef struct tagA
{
    int x;
}
A;

void f(A *a) 
{
    a->x = 1;
}

main(int argc, char *argv[])
{
    A *a = 0;
    f(a); 
    std::cout << a->x << std::endl;
}

блокируется ли новейшим gcc? (Мне это для самообразования интересно.
А то ведь J.Alger, как мне сказали, merde делает.)


NikS.

anonymous
()

>в VC60 компилится без проблем, а с -WX не компилится из-за того, что ф-ция main не возвращает значения, а не из-за некоректного указателя 

Да? А вот специально для специалистов MCP (даже MCAD/MSCD)


#include <iostream>

typedef struct tagA
{
    int x;
}
A;

void f(A *a) throw (A)
{
    a->x = 1;
}

int main(int argc, char *argv[])
{
    A *a;

    f(a); 
    std::cout << a->x << std::endl;

    return 0;
}

cl /WX c1.cpp

Дерзайте. И подписывайтесь - мы должны знать знатоков M$ VC. ;-))))


С тем давайте перейдем на общий форум по программированию.

NikS.



anonymous
()

никс долбоеб, один раз запостил кривулю его ткнули носом что нихера он не понимает в C/C++, так он теперь отмывается, "статистику собирает". разыменование мусора (или NULL) может работать как попало, и компилятор тут не при чем.

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

>блокируется ли новейшим gcc?

Не должен.
Все зависит от того, как сделано распространение констант.
Вас же русским языком уже многократно объяснили, что стандарт таких блокировок не требует, и их наличие/отсутствие и конкретная реализация -- конкретная особенность конкретного компилятора. Которую знать для работы и на которую закладываться совершенно ни к чему. И для самообразования это бесполезно. Для самообразования ни к чему знать, как реализует ту или иную фичу обработки ошибок комплятор X версии Y.Z.AA, а гораздо полезнее внимательно изучить стандарт и сделать правильные выводы.
Пожелание -- не заморачивайтесь ненужной и бесполезной ерундой.
К Элджеру и реально важным вещам ваш вопрос отношения не имеет.

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

>void f(A *a) throw (A)

А этой то строкой что сказать хотелось? Если не секрет.

AC
()

> -WX не компилится из-за того, что ф-ция main не возвращает значения,

И последний код:

int main() { }

C:\>cl /WX НаКаждогоМудрецаДовольноПростаты.cpp

C:\>НаКаждогоМудрецаДовольноПростаты.exe

Надо же! Работает! Как же так! ;-)))

Так что Юпитер сердится только тогда, когда ....

NikS.

anonymous
()

>А этой то строкой что сказать хотелось? Если не секрет.

Хвосты от тестовых примеров. Яж не Юпитер, мне готовться к MCP надо. А там есть вопросики по С++ tricks & tips. Зато я не злюсь. ;-)

NikS.

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

>Надо же! Работает! Как же так! ;-)))

Вот так хреново. Потому что работать не должно.
Более того, если вы отключите "расширения MS", и работать не станет.
Короче, очередное извращение стандарта.
Не вижу причин, чтобы ошибку известного своими отклонениями от стандарта компилятора считать за аргумент.

AC
()

> разыменование мусора (или NULL) может работать как попало, и компилятор тут не при чем.

Укажите, пожалуйста, первоисточник или приведите цитату с указанием первоисточника. Хорошо?

NikS.

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

>Хвосты от тестовых примеров.

Просто эта строчка бессмысленна. Она говорит, что f может бросать исключения только типа А. Вряд ли это то, что вы имели в виду.

AC
()

> Не вижу причин, чтобы ошибку известного своими отклонениями от стандарта компилятора считать за аргумент.

Согласен, проверьте Intel. По поводу M$ расширений в конкретном случае не согласен - это не расширения типа #import , MIDL & etc..

А кстати, идею проверить указатели в unsafe коде мне подкинули хорошую.

NikS.

anonymous
()

Объективности ради:

class Class1
{
    unsafe public static void Main() 
    {
        char *p = null;
        *p = 'p';
    }
}

>csc /unsafe my.cs

$msc /unsafe my.cs

my.exe тоже вылетает.


NikS.

anonymous
()

#include <iostream>

typedef struct tagA { int x; } A;

void f(A *a) throw (A) { a->x = 1; }

int main(int argc, char *argv[]) { A *a;

f(a); std::cout << a->x << std::endl;

return 0; }

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

ты совсем идиот, или прикалываешься?
указатель хранит адрес в памяти.
разыменовывание указателя - обращение по этому адресу.
дальше иди читай книжки по архитектуре x86 на тему защищенного режима.
может быть тогда ты поймешь, что происходит при обращении по адресу, не попадающему в выделенную процессу область.

какое это имеет отношение к компилятору? он не может проверить валидность указателя во время компиляции. это просто невозможно.

создается впечатление, что ты просто кащенит..

crz
()

#include <iostream>

typedef struct tagA
{
    int x;
}
A;

void f(A *a) throw (A)
{
    a->x = 1;
}

int main(int argc, char *argv[])
{
    A *a;

    f(a); 
    std::cout << a->x << std::endl;

    return 0;
}

Компилить надо с /GX:

>cl /WX /GX aa.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

aa.cpp
aa.cpp(18) : error C2220: warning treated as error - no object file generated
aa.cpp(18) : warning C4700: local variable 'a' used without having been initialized

anonymous
()

2Знатоку VC и функции main()

Кстати, "бороться" с Вашим примером можно так:

#include <iostream>

void main() 
{
   try 
   {
      std::cout<< "++" << std::endl;
      char *p = 0;
      *p = 0;
   }
   catch (...)
   {
      std::cout<< "--" << std::endl;
   }
}

// cl -WX -EHs *.cpp


class Class1
{
    unsafe public static void Main() 
    {
	try 
        {
           System.Console.WriteLine("++");
           char *p = null;
           *p = 'p';
        }
        catch
        {
           System.Console.WriteLine("--");
        }
    }
}


NikS.


anonymous
()

>Согласен, проверьте Intel

На main без return ICC должен ругаться.
Хотя, насчет ошибки от MS я и сам был неправ -- можно иметь main без явного return, как можно иметь любую функцию без явного return.
Если в main нет return, то реализация должна обеспечить return 0.


>По поводу M$ расширений в конкретном случае не согласен

К MS-расширениям относятся в частности область действия переменной, объявленной в операторе цикла, за соответствующий блок, и разнообразные вариации на тему main.

AC
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.