Освоение языка C акт первый

classic Classic list List threaded Threaded
17 messages Options
Reply | Threaded
Open this post in threaded view
|

Освоение языка C акт первый

mitrofanzzz
С уважением к всемогущему комьюнити...
Хотелось бы задать пару глупых вопросов.
Всегда хотел освоить язык си на никсах и конкретно на опёнке.
И вот вроде бы созрел.
Начал естественно с:
====================
$ cat example1.c
#include <stdio.h>

int main ()
{
    printf ("Hello world!\n");
}
=====================
Скомпилил, выполнил, порадовался. Но сразу возник ряд вопросов и пока
я никак не придумаю где их можно разрешить...
При компиляции g++ сказал мне следующее:

======================================================================
$ g++ example1.c -o example1.out
/usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always misused,
please use strlcpy()
/usr/lib/libstdc++.so.45.0: warning: strcat() is almost always misused,
please use strlcat()
======================================================================

Умом понимаю, что написано. Но маны не наводят меня на то как я должен
поправить свой шедевр.
И еще пара вопросов:
Имеется ли возможность дизассемблировать скомпилированное?
Как научиться использовать gdb?
Даст ли пользу чтение исходников userland-a?

Отсылы к манам действенны, но не всегда дают мне 100% результат.
Заранее благодарен любым рекомендациям и посылам.
--
С уважением Сохин Никита Александрович...


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Dinar Talypov
On Wed, 28 Oct 2009 13:47:47 +0300
mitrofanzzz <[hidden email]> wrote:

> С уважением к всемогущему комьюнити...
> Хотелось бы задать пару глупых вопросов.
> Всегда хотел освоить язык си на никсах и конкретно на опёнке.
> И вот вроде бы созрел.
> Начал естественно с:
> ====================
> $ cat example1.c
> #include <stdio.h>
>
> int main ()
> {
>     printf ("Hello world!\n");
> }
> =====================
> Скомпилил, выполнил, порадовался. Но сразу возник ряд вопросов и пока
> я никак не придумаю где их можно разрешить...
> При компиляции g++ сказал мне следующее:
>
1) не надо путать "c" c "c++"


> ======================================================================
> $ g++ example1.c -o example1.out
> /usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always misused,
> please use strlcpy()
> /usr/lib/libstdc++.so.45.0: warning: strcat() is almost always misused,
> please use strlcat()
> ======================================================================

2) обычно достаточно, если надо скомпилить прогу состоящую из одного файла .с
make example1

> Умом понимаю, что написано. Но маны не наводят меня на то как я должен
> поправить свой шедевр.
> И еще пара вопросов:
> Имеется ли возможность дизассемблировать скомпилированное?

да, objdump -D <object file>, соответственно man objdump
> Как научиться использовать gdb?
man gdb, хотя gdb нужен чтоб отловить где происходит segmentation fault и т.д.,
помогает опция компилятора -ggdb, подробности в том же самом мане

> Даст ли пользу чтение исходников userland-a?
конечно, с этого и надо начинать, и не только userland,но и kernel надо читать
>
> Отсылы к манам действенны, но не всегда дают мне 100% результат.
> Заранее благодарен любым рекомендациям и посылам.
> --
> С уважением Сохин Никита Александрович...
>
>
>

--
Динар Талыпов


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Maxim Tsyplakov-2
In reply to this post by mitrofanzzz
On 28.10.2009 13:47, mitrofanzzz wrote:

> С уважением к всемогущему комьюнити...
> Хотелось бы задать пару глупых вопросов.
> Всегда хотел освоить язык си на никсах и конкретно на опёнке.
> И вот вроде бы созрел.
> Начал естественно с:
> ====================
> $ cat example1.c
> #include <stdio.h>
>
> int main ()
> {
>    printf ("Hello world!\n");
> }
> =====================
неплохо бы сюда еще return (0);

> Скомпилил, выполнил, порадовался. Но сразу возник ряд вопросов и пока
> я никак не придумаю где их можно разрешить...
> При компиляции g++ сказал мне следующее:
>
> ======================================================================
> $ g++ example1.c -o example1.out
> /usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always
> misused, please use strlcpy()
> /usr/lib/libstdc++.so.45.0: warning: strcat() is almost always
> misused, please use strlcat()
> ======================================================================
#include <stdio.h>

int
main(int argc, char *argv[])
{
         printf("%s\n", "Hello world!");

         return (0);
}

% cc -c hello.c && cc -o hello hello.o && ./hello
Hello world!

> Умом понимаю, что написано. Но маны не наводят меня на то как я должен
> поправить свой шедевр.
> И еще пара вопросов:
> Имеется ли возможность дизассемблировать скомпилированное?
objdump ?

> Как научиться использовать gdb?
man gdb
и в интернете дохрена вообще по нему доки

>
> Даст ли пользу чтение исходников userland-a?
>
да

> Отсылы к манам действенны, но не всегда дают мне 100% результат.
> Заранее благодарен любым рекомендациям и посылам.
> --
> С уважением Сохин Никита Александрович...
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Igor Zinovik-3
In reply to this post by mitrofanzzz
28 октября 2009 г. 13:47 пользователь mitrofanzzz
<[hidden email]> написал:
> $ g++ example1.c -o example1.out
> /usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always misused,
> please use strlcpy()
> /usr/lib/libstdc++.so.45.0: warning: strcat() is almost always misused,
> please use strlcat()

А зачем Вы используете C++ компилятор для C кода? Почему не
используете cc, вместо g++?


> Имеется ли возможность дизассемблировать скомпилированное?

Есть IDA Pro она понимает ELF (формат исполняемых файлов OpenBSD).

> Как научиться использовать gdb?

Для начала скомпилируйте код с отладочной информацией (опция -g). Потом
# gdb -q
# file your_executable_file
# help run
# help break
# help list
# help next
# help quit
# break main
# run

> Даст ли пользу чтение исходников userland-a?

Определенно, по крайней мере можно увидеть многие UNIX'овые идиомы
программирования.
Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Ilya A. Kovalenko
In reply to this post by mitrofanzzz
> ======================================================================
> $ g++ example1.c -o example1.out
> /usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always misused,
> please use strlcpy()
> /usr/lib/libstdc++.so.45.0: warning: strcat() is almost always misused,
> please use strlcat()
> ======================================================================

> Умом понимаю, что написано. Но маны не наводят меня на то как я должен
> поправить свой шедевр.
это нельзя исправить, т.к. предупреждение касается стандартной
библиотеки С++ (/usr/lib/libstdc++.so.45.0), это в ней используются
strcat() и strcpy()

вообще-то это бибилиотека С++ и я не совсем понял почему ваша
Си-програма (программы с++ имеют расширение .сс) стала линковаться
как C++, вероятно из-за "g++" вместо "gcc"

попробуйте "gcc", возможно с ним предупреждений не будет ...

> Как научиться использовать gdb?
.. поискать документацию ...

> Даст ли пользу чтение исходников userland-a?
в первую очередь надо писать, ну и разбирать чужой код тоже
небесполезно

кстати вопросы о Си в этой рассылке наверно оффтопик ...


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Alexander Yurchenko-3
In reply to this post by mitrofanzzz
On Wed, Oct 28, 2009 at 01:47:47PM +0300, mitrofanzzz wrote:
>    printf ("Hello world!\n");
> }
> =====================
> Скомпилил, выполнил, порадовался. Но сразу возник ряд вопросов и пока
> я никак не придумаю где их можно разрешить...
> При компиляции g++ сказал мне следующее:

Начнем с того, что программы на языке C нужно компилировать компилятором
языка C. g++ это компилятор языка C++.

С другой стороны C является подмножеством C++, поэтому тяжкой ошибки тут
нет. С третьей стороны g++ умеет лучше проверять типы и позволяет
отловить некоторые ошибки на этапе компиляции, которые может пропустить
gcc. Есть слух, что один из разработчиков OpenBSD регулярно собирает
ядро с помощью g++ для поиска таких ошибок.

>
> ======================================================================
> $ g++ example1.c -o example1.out
> /usr/lib/libstdc++.so.45.0: warning: strcpy() is almost always misused,
> please use strlcpy()
> /usr/lib/libstdc++.so.45.0: warning: strcat() is almost always misused,
> please use strlcat()
> ======================================================================
>
> Умом понимаю, что написано. Но маны не наводят меня на то как я должен
> поправить свой шедевр.

Видимо, внутри libstdc++ в реализации printf используются strcpy и
strcat. Поэтому это не ваша проблема, а разработчиков libstdc++. При
компиляции с помощью gcc такой ошибки не будет.

> И еще пара вопросов:
> Имеется ли возможность дизассемблировать скомпилированное?

Конечно. Простейший вариат objdump -d. Можно еще запустить gdb и
выполнить команду disassembly. Кстати сам gcc умеет генерить не бинарь,
а ассемблер, опция -S.

> Как научиться использовать gdb?

Почитать документацию. Однако проще воспользоваться каким-нибудь
графическим фронтендом, например ddd.

> Даст ли пользу чтение исходников userland-a?

Зависит от исходников. Если читать всякую каку вроде gnu'шных программ,
может и поплохеть. Содержимое /usr/src/, появившееся после 2000 года,
можно рекомендовать к чтению.

>
> Отсылы к манам действенны, но не всегда дают мне 100% результат.
> Заранее благодарен любым рекомендациям и посылам.
> --
> С уважением Сохин Никита Александрович...
>

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Maxim Tsyplakov-2
In reply to this post by Ilya A. Kovalenko
в первую очередь надо писать, ну и разбирать чужой код тоже
> небесполезно
>
> кстати вопросы о Си в этой рассылке наверно оффтопик ...
>
>
>    
после недавней вакханалии с Buzzer, я даже про C готов общаться :)


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

4625
28-Oct-2009 числа в 16:04 часов, Maxim Tsyplakov написал(а) следующее:

>> кстати вопросы о Си в этой рассылке наверно оффтопик ...
> после недавней вакханалии с Buzzer, я даже про C готов общаться :)
А сможешь аргументировать свой эпитет?

--
/Buzzer         () кампания ascii ribbon - против писем в html формате
                /\ www.asciiribbon.org   - против проприетарных вложений


Reply | Threaded
Open this post in threaded view
|

Re[2]: Освоение языка C акт первый

Ilya A. Kovalenko
In reply to this post by Maxim Tsyplakov-2
> #include <stdio.h>

> int
> main(int argc, char *argv[])
> {
>          printf("%s\n", "Hello world!");

>          return (0);
> }

> % cc -c hello.c && cc -o hello hello.o && ./hello
> Hello world!

тогда уж и (void) printf(...);
:))


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Anton Maksimenkov-2
In reply to this post by mitrofanzzz
Раз пошла такая пьянка... Я тоже, я тоже скажу!

> warning: strcpy() is almost always misused, please use strlcpy()
Сей варнинг будет встречаться довольно часто, если станете програмить
нечто юзательное. На него вполне безболезненно можно не обращать
внимания (если конечно это не ВАШ код использует strcpy() вместо
strlcpy()). Причины уже рассказали выше. Думаю, бОльшая часть
библиотек, которые будете подключать (я посгрес использую, кажется там
это... но, повторюсь, я не обращаю внимание и поэтому не помню даже)
будет вам такое показывать.

> Всегда хотел освоить язык си на никсах и конкретно на опёнке.
> Даст ли пользу чтение исходников userland-a?
Моё мнение: ооочень полезно сначала прочитать классику
("Взаимодействие процессов в UNIX", "Сетевое программирование в UNIX"
- кажется так звучит... вобщем это такие две книжки, толстая и тонкая.
Там почти ВСЁ). После этого смотреть код, будет понятно "с полуслова",
в основном уже смотреть будете технику исполнения, если можно так
сказать.
Просто читать весь код... по-моему дело неблагодарное, очень долго и
очень медленно. Плюс многое не будет понято, поэтому смысл затрат
будет ещё более сомнителен.
А вообще, С он везде С. В опёнке такой же, разве что более скурпулёзно
проверяются возвращаемые значения, на ошибки. Ну, насчёт "красиво и
понятно написанного" (в отличие от "индийского кода") я даже не
говорю, это и так понятно.

Если хочется писать юзерские проги, то достаточно внимательно
проштудировать примеры form@'а (мои благодарности) на www.openbsd.ru,
и исходники cnupm'а, например. Может и остальных проектов. Мне
показалось весьма полезно. Там основная часть "как писать на С"
отражена.
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Maxim Tsyplakov-2
In reply to this post by Ilya A. Kovalenko
On 29.10.2009 5:11, Ilya A. Kovalenko wrote:

>> #include<stdio.h>
>>      
>    
>> int
>> main(int argc, char *argv[])
>> {
>>           printf("%s\n", "Hello world!");
>>      
>    
>>           return (0);
>> }
>>      
>    
>> % cc -c hello.c&&  cc -o hello hello.o&&  ./hello
>> Hello world!
>>      
> тогда уж и (void) printf(...);
> :))
>
>
>    
ну на это компилятор ругаться не будет (хотя опять же наверное смотря какой
а на то что main объявлен что int возвращает а return отсутствует
(справедливо не только для main)
gcc помнится кричал что дескать не дело это :)


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

mitrofanzzz
In reply to this post by mitrofanzzz
Искренне благодарю учавствовавших.
Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити.

--
С уважением Сохин Никита Александрович...


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

mitrofanzzz
In reply to this post by mitrofanzzz
От всего ядра, тобишь души, благодарю всех учавствовавших.
Надеюсь мои редкие оффтопики не обременят уважаемое комьюнити.


--
С уважением Сохин Никита Александрович...


Reply | Threaded
Open this post in threaded view
|

Re[2]: Освоение языка C акт первый

Ilya A. Kovalenko
In reply to this post by Maxim Tsyplakov-2
> а на то что main объявлен что int возвращает а return отсутствует
> (справедливо не только для main)
> gcc помнится кричал что дескать не дело это :)
угу ... по-моему это когда через make (а точнее через *.mk) или же
с -Wall, тогда оно больше варнингов пишет


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Anton Maksimenkov-2
In reply to this post by mitrofanzzz
> Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити.

Суть Дао такова, что с определённого уровня созерцания ОС вобщем-то и
есть С (ну, в своём наиболее полно понимаемом виде), по крайней мере в
уклоне *nix.
Думаю многие последовательно открывали для себя что "енти самые
демона-то" они есть С... Потом понимали, что ничего страшного в их
коде нету, знай себе системные вызовы втыкай да получай результы. Это
несло успокоение.
И чем более свободно адепт применял сисколлы, тем ближе он подходил к
двери, приоткрыв которую обнаруживал за ней, что все эти сисколлы они
лишь обложки к чему-то та-а-м, но сделанные на С. Спустя время он
сунется всей башкой в это пекло и найдёт, что оно тот же С, только уже
без сисколлов :) Наоборот, лишь более простые функции, в своём обилии
и многообразии сложенных в весьма пёструю картину. Здесь его посещает
понимание того, что весь путь его был освоением обёрток вокруг С - с
самых внешних (API, библиотеки), затем ближе (свои библиотеки,
сисколлы), ещё ближе (от сисколлов к ядру) и ещё ближе, к самому ядру.
Суть которого - опять чистый и простой С, с которого он начинал свои
хелловорды. Так он приходит к пониманию простоты сложных вещей и
обратимости вышесказанного. :))

Следовательно, ничего странного в теме С я тут не вижу :)
--
antonvm
Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

Dinar Talypov
On Thu, 29 Oct 2009 14:43:05 +0500
Anton Maksimenkov <[hidden email]> wrote:

> > Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити.
>
> Суть Дао такова, что с определённого уровня созерцания ОС вобщем-то и
> есть С (ну, в своём наиболее полно понимаемом виде), по крайней мере в
> уклоне *nix.
> Думаю многие последовательно открывали для себя что "енти самые
> демона-то" они есть С... Потом понимали, что ничего страшного в их
> коде нету, знай себе системные вызовы втыкай да получай результы. Это
> несло успокоение.
> И чем более свободно адепт применял сисколлы, тем ближе он подходил к
> двери, приоткрыв которую обнаруживал за ней, что все эти сисколлы они
> лишь обложки к чему-то та-а-м, но сделанные на С. Спустя время он
> сунется всей башкой в это пекло и найдёт, что оно тот же С, только уже
> без сисколлов :) Наоборот, лишь более простые функции, в своём обилии
> и многообразии сложенных в весьма пёструю картину. Здесь его посещает
> понимание того, что весь путь его был освоением обёрток вокруг С - с
> самых внешних (API, библиотеки), затем ближе (свои библиотеки,
> сисколлы), ещё ближе (от сисколлов к ядру) и ещё ближе, к самому ядру.
> Суть которого - опять чистый и простой С, с которого он начинал свои
> хелловорды. Так он приходит к пониманию простоты сложных вещей и
> обратимости вышесказанного. :))
>
> Следовательно, ничего странного в теме С я тут не вижу :)
> --
> antonvm

вы романы писать не думали ;), а то как-то все поэтично, красиво  :)

--
Динар Талыпов


Reply | Threaded
Open this post in threaded view
|

Re: Освоение языка C акт первый

mitrofanzzz
In reply to this post by Anton Maksimenkov-2
Anton Maksimenkov пишет:
>
> Следовательно, ничего странного в теме С я тут не вижу :)
>  
Речи эти, колокольчиками радости, отозвались в сердце одинокого путника
познающего окружающий мир.

С уважением Сохин Никита Александрович