Comments: |
From: | (Anonymous) |
Date: | July 26th, 2012 - 02:59 pm |
---|
| | | (Link) |
|
./some/path/mount -> mount
![[User Picture]](http://lj.rossia.org/userpic/191927/26445) | From: | herm1t |
Date: | July 26th, 2012 - 03:02 pm |
---|
| | | (Link) |
|
$ cat > 1.c main() { execve("/bin/mount", 0, 0); } $ gcc 1.c && ./a.out Segmentation fault $
если execv запускать с argv=0 - вообще много крови будет.
Затем, что могут.
В смысле, язык позволяет. Если бы этим людям разрешали писать только на Паскале, мир был бы чище.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | July 27th, 2012 - 09:51 am |
---|
| | | (Link) |
|
а нефиг на argv[0] забивать. никто — риальне, никто практически не проверяет на случай argc == 0. и я не проверяю. ибо нехуй. потому что другого переносимого способа определить, как меня зовут, нет. поэтому будьте уж так любезны, предоставляйте хоть это.
![[User Picture]](http://lj.rossia.org/userpic/191927/26445) | From: | herm1t |
Date: | July 27th, 2012 - 10:04 am |
---|
| | | (Link) |
|
все-таки способы получить настоящий путь (кажется) есть везде, а если не хочется, то хотя бы argc?argv[0]:"фубарище" - к пользовательскому вводу нужно относиться так, как он этого заслуживает. имхо.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | July 27th, 2012 - 10:10 am |
---|
| | | (Link) |
|
способы-то есть, переносимых способов нет. к тому же в argv[0] совершенно не обязательно что-то настоящее лежит (заразы).
алсо, argv[0] — это ни разу не пользовательский ввод, это системное соглашение. если кто-то забыл его соблюсти… ну, проблемы негров и индейцев. хотя и можно if (!argc) abort();, но лениво.
![[User Picture]](http://lj.rossia.org/userpic/191927/26445) | From: | herm1t |
Date: | July 27th, 2012 - 10:16 am |
---|
| | | (Link) |
|
> это ни разу не пользовательский ввод
в стандарте - implementation defined. и пользователь может запихнуть туда что угодно. лениво конечно, да, и о чем тут вообще разговаривать.
вот это еще понравилось:
if (Argc < 0) progname = "sudo"; else if ((progname = strrchr(Argv[0], '/')) != NULL) progname++; else progname = Argv[0];
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | July 27th, 2012 - 10:11 am |
---|
| | | (Link) |
|
в принципе, проверять на argc<1 — это почти то же самое, что проверять, не NULL-ы ли элементы argv от 0 до argc-1. в принципе, никто не мешает так извращаться, но нафига?
From: | (Anonymous) |
Date: | January 22nd, 2013 - 09:12 pm |
---|
| | | (Link) |
|
readlink() от /proc/self/exe, стало быть, тяжело сделать
![[User Picture]](http://lj.rossia.org/userpic/191927/26445) | From: | herm1t |
Date: | January 23rd, 2013 - 11:13 am |
---|
| | | (Link) |
|
есть два варианта. либо действительно argv[0] (чтобы узнать чего хотел пользователь), но без тупых ошибок; либо реальный путь к бинарю - тогда в стеке за aux-вектором он родимый и лежит. можно и readlink, но зачем? I/O, и все такое...
From: | (Anonymous) |
Date: | January 23rd, 2013 - 02:01 pm |
---|
| | | (Link) |
|
>либо действительно argv[0] где-то, кажется, на Darwin, были с этим проблемы. алсо там по умолчанию нет procfs, патовая ситуация была.
>тогда в стеке за aux-вектором он родимый и лежит это специфично для системы, которая использует ELF, не так ли?
>но зачем? I/O, и все такое... если это раз за программу делается, то, по-моему, ок. к тому же, парадигма Unix: "все есть файл".
![[User Picture]](http://lj.rossia.org/userpic/191927/26445) | From: | herm1t |
Date: | January 23rd, 2013 - 02:03 pm |
---|
| | | (Link) |
|
"это специфично для системы,"
дык, давно пора стандартизировать некий getprogname, и перестать спотыкаться на элементарных вещах, так или иначе эта инфа есть в любой системе, либо на теке, либо отдается системным вызовом.
"к тому же, парадигма Unix: "все есть файл"." на системном вызове нужно опять-таки не забыть проверить возвращаемое значение...
ну да, стандартизация решает все эти байтопроблемы
| |