С уважением к всемогущему комьюнити...
Хотелось бы задать пару глупых вопросов. Всегда хотел освоить язык си на никсах и конкретно на опёнке. И вот вроде бы созрел. Начал естественно с: ==================== $ 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% результат. Заранее благодарен любым рекомендациям и посылам. -- С уважением Сохин Никита Александрович... |
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++ сказал мне следующее: > > ====================================================================== > $ 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% результат. > Заранее благодарен любым рекомендациям и посылам. > -- > С уважением Сохин Никита Александрович... > > > -- Динар Талыпов |
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"); > } > ===================== > Скомпилил, выполнил, порадовался. Но сразу возник ряд вопросов и пока > я никак не придумаю где их можно разрешить... > При компиляции 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() > ====================================================================== 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% результат. > Заранее благодарен любым рекомендациям и посылам. > -- > С уважением Сохин Никита Александрович... > > |
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'овые идиомы программирования. |
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? в первую очередь надо писать, ну и разбирать чужой код тоже небесполезно кстати вопросы о Си в этой рассылке наверно оффтопик ... |
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 |
In reply to this post by Ilya A. Kovalenko
в первую очередь надо писать, ну и разбирать чужой код тоже
> небесполезно > > кстати вопросы о Си в этой рассылке наверно оффтопик ... > > > после недавней вакханалии с Buzzer, я даже про C готов общаться :) |
28-Oct-2009 числа в 16:04 часов, Maxim Tsyplakov написал(а) следующее:
>> кстати вопросы о Си в этой рассылке наверно оффтопик ... > после недавней вакханалии с Buzzer, я даже про C готов общаться :) А сможешь аргументировать свой эпитет? -- /Buzzer () кампания ascii ribbon - против писем в html формате /\ www.asciiribbon.org - против проприетарных вложений |
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(...); :)) |
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 |
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 помнится кричал что дескать не дело это :) |
In reply to this post by mitrofanzzz
Искренне благодарю учавствовавших.
Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити. -- С уважением Сохин Никита Александрович... |
In reply to this post by mitrofanzzz
От всего ядра, тобишь души, благодарю всех учавствовавших.
Надеюсь мои редкие оффтопики не обременят уважаемое комьюнити. -- С уважением Сохин Никита Александрович... |
In reply to this post by Maxim Tsyplakov-2
> а на то что main объявлен что int возвращает а return отсутствует
> (справедливо не только для main) > gcc помнится кричал что дескать не дело это :) угу ... по-моему это когда через make (а точнее через *.mk) или же с -Wall, тогда оно больше варнингов пишет |
In reply to this post by mitrofanzzz
> Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити.
Суть Дао такова, что с определённого уровня созерцания ОС вобщем-то и есть С (ну, в своём наиболее полно понимаемом виде), по крайней мере в уклоне *nix. Думаю многие последовательно открывали для себя что "енти самые демона-то" они есть С... Потом понимали, что ничего страшного в их коде нету, знай себе системные вызовы втыкай да получай результы. Это несло успокоение. И чем более свободно адепт применял сисколлы, тем ближе он подходил к двери, приоткрыв которую обнаруживал за ней, что все эти сисколлы они лишь обложки к чему-то та-а-м, но сделанные на С. Спустя время он сунется всей башкой в это пекло и найдёт, что оно тот же С, только уже без сисколлов :) Наоборот, лишь более простые функции, в своём обилии и многообразии сложенных в весьма пёструю картину. Здесь его посещает понимание того, что весь путь его был освоением обёрток вокруг С - с самых внешних (API, библиотеки), затем ближе (свои библиотеки, сисколлы), ещё ближе (от сисколлов к ядру) и ещё ближе, к самому ядру. Суть которого - опять чистый и простой С, с которого он начинал свои хелловорды. Так он приходит к пониманию простоты сложных вещей и обратимости вышесказанного. :)) Следовательно, ничего странного в теме С я тут не вижу :) -- antonvm |
On Thu, 29 Oct 2009 14:43:05 +0500
Anton Maksimenkov <[hidden email]> wrote: > > Надеюсь мои редкие оффтопики по сабжу не обременят уважаемое комьюнити. > > Суть Дао такова, что с определённого уровня созерцания ОС вобщем-то и > есть С (ну, в своём наиболее полно понимаемом виде), по крайней мере в > уклоне *nix. > Думаю многие последовательно открывали для себя что "енти самые > демона-то" они есть С... Потом понимали, что ничего страшного в их > коде нету, знай себе системные вызовы втыкай да получай результы. Это > несло успокоение. > И чем более свободно адепт применял сисколлы, тем ближе он подходил к > двери, приоткрыв которую обнаруживал за ней, что все эти сисколлы они > лишь обложки к чему-то та-а-м, но сделанные на С. Спустя время он > сунется всей башкой в это пекло и найдёт, что оно тот же С, только уже > без сисколлов :) Наоборот, лишь более простые функции, в своём обилии > и многообразии сложенных в весьма пёструю картину. Здесь его посещает > понимание того, что весь путь его был освоением обёрток вокруг С - с > самых внешних (API, библиотеки), затем ближе (свои библиотеки, > сисколлы), ещё ближе (от сисколлов к ядру) и ещё ближе, к самому ядру. > Суть которого - опять чистый и простой С, с которого он начинал свои > хелловорды. Так он приходит к пониманию простоты сложных вещей и > обратимости вышесказанного. :)) > > Следовательно, ничего странного в теме С я тут не вижу :) > -- > antonvm вы романы писать не думали ;), а то как-то все поэтично, красиво :) -- Динар Талыпов |
In reply to this post by Anton Maksimenkov-2
Anton Maksimenkov пишет:
> > Следовательно, ничего странного в теме С я тут не вижу :) > Речи эти, колокольчиками радости, отозвались в сердце одинокого путника познающего окружающий мир. С уважением Сохин Никита Александрович |
Free forum by Nabble | Edit this page |