LINUX.ORG.RU

Задание пути


0

0

Как в С'шной проге задать путь к файлу $HOME/aaa ?
Т.е. нужно чтоб не зависимо от пользователя файл искался в его
домашнем каталоге. 


Ответ на: комментарий от klalafuda

Вопрос о портабельности тут не стоял. Лично я в своих программах использую свою реализацию asprintf, так что проблем с этим не бывает.

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

---cut---
Вопрос о портабельности тут не стоял. Лично я в своих программах использую свою реализацию asprintf, так что проблем с этим не бывает.
---cut---

а произвольные SIGSEGV в указанном примере вас не беспокоят? а если у кого-то [IMHO не очень дальновидного] родится желание напрямую использовать ваш код? а если под suid... ? ugh ugh..

ps: своя реализация asnprintf()? постоянно таскаемая за собой? оригинально..

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

2klalafuda:

> а произвольные SIGSEGV в указанном примере вас не беспокоят? а если у кого-то [IMHO не очень дальновидного] родится желание напрямую использовать ваш код? а если под suid... ? ugh ugh..

А что не так в приведенном примере?

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> А что не так в приведенном примере?

http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html

---cut---
Upon successful completion, getenv() shall return a pointer to a string containing the value for the specified name. If the specified name cannot be found in the environment of the calling process, a null pointer shall be returned.
---cut---

--- foo.c ---
int
main ()
{
......
asprintf(&path, "%s/%s", getenv("HOME"), fn);
return 0;
}
--- foo.c ---

$ cc -o foo foo.c
$ unset HOME
$ ./foo -> foo.core

причина: далеко не все *NIX отслеживают значение NULL для аргумента %s в printf. и это правильно, бо ни ANSI C ни POSIX этого не требуют -> в указанном случае запросто core чистой воды. точнее, сегодня все ок а завтра - core по "непонятным" причинам.

http://www.opengroup.org/onlinepubs/009695399/functions/printf.html

---cut---
s
The argument shall be a pointer to an array of char. Bytes from the array shall be written up to (but not including) any terminating null byte. If the precision is specified, no more than that many bytes shall be written. If the precision is not specified or is greater than the size of the array, the application shall ensure that the array contains a null byte.

If an l (ell) qualifier is present, the argument shall be a pointer to an array of type wchar_t. Wide characters from the array shall be converted to characters (each as if by a call to the wcrtomb() function, with the conversion state described by an mbstate_t object initialized to zero before the first wide character is converted) up to and including a terminating null wide character. The resulting characters shall be written up to (but not including) the terminating null character (byte). If no precision is specified, the application shall ensure that the array contains a null wide character. If a precision is specified, no more than that many characters (bytes) shall be written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the character sequence length given by the precision, the function would need to access a wide character one past the end of the array. In no case shall a partial character be written.

[snip]

If a conversion specification does not match one of the above forms, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
---cut---

живой пример - QNX6. отлично работает как глюколовка против подобных ляпов разработчиков. AFAIU в ней почти преднамеренно нет проверок на некорректные параметры -> или вы соответствуете общепринятому стандарту, или имеете проблемы.

pps: придираюсь? отнюдь. просто живой опыт. take care.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

2klalafuda:

Да нет, там как раз все в порядке: asprintf() -- гнутое расширение, а гнутая либс гарантирует корректную обработку NULL.

То есть, единственный ¨криминал¨ -- пользование нестандартной функцией asprintf(). Поскольку автор примера оговорился, что у него своя asprintf(), то, вполне возможно, он там проверку на NULL делает.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

---cut---
Да нет, там как раз все в порядке: asprintf() -- гнутое расширение, а гнутая либс гарантирует корректную обработку NULL.
---cut---

AFAIU неявно -> все может и поменяться в любой момент времени -> unsafe.

---cut---
То есть, единственный ¨криминал¨ -- пользование нестандартной функцией asprintf(). Поскольку автор примера оговорился, что у него своя asprintf(), то, вполне возможно, он там проверку на NULL делает.
---cut---

...или же не делает. вот была бы веселуха кому-то, кто потом разгребал бы эту самодеятельность, гадать - делает он проверку или нет, и будет ли гарантированно продолжать делать в будущем etc..? :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

2klalafuda:

> AFAIU неявно ...

Да нет, в мануале прописано => явно.

> ...вот была бы веселуха кому-то, кто потом разгребал бы эту самодеятельность, ...

Да ну...

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

BTW, я согласен, что замечание klalafuda (10.01.2006 14:33:28) было полезным, но не согласен с его категоричностью ("5 балов... :-/") и последующей дискуссией на пустом месте. Гораздо конструктивнее IMHO было бы просто заметить то, что NULL надо бы обрабатывать особо, а asprintf() вообще не юзать.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

---cut---
BTW, я согласен, что замечание klalafuda (10.01.2006 14:33:28) было полезным, но не согласен с его категоричностью ("5 балов... :-/") и последующей дискуссией на пустом месте. Гораздо конструктивнее IMHO было бы просто заметить то, что NULL надо бы обрабатывать особо, а asprintf() вообще не юзать.
---cut---

по поводу тона - согласен. явно "крутовато" да и не к лицу и пр. приношу свои извинения, если тон кого-то задел.

по сути: я не верю в полупрофессионалов. когда человек выдает рабочее решение на 100 в рабочей, и "просто так" aka заведомо с проблемами - в прочих ситуациях. просто потому, что "спешил, забыл, нету времени да и сам разберется". вы или делаете что-то хорошо *ВСЕГДА* независимо от конткеста бо иначе просто не можете, и несете за это ответственность [как минимум, можете полностью обосновать], или же одно из двух. если второе - молчите. тем более, если человек берет на себя смелость что-то советовать постороннему в сущности для него оппоненту в форуме -> заранее не зная его уровня, подготовки, восприимчивости etc. и именно это меня "возбудило" - наличие мелких [для меня] но потенциально серьезных [для кого-то] неточностей. я - в курсе про asprintf. а автор поста? а другие читатели? я знаю про *notify на Linux и область его применимости - а читатели? и так по каждому спорному вопросу. вы не можете заранее предугадать: кто, как и зачем вас читает и какие последствия это повлечёт -> не забывайте вечное "вы в ответственности за тех, кого приручили" и старайтесь дать как можно более полную информацию.

pps: зануда, правда? могу лишь привести в свое оправдание то, что мое занудство AFAIK позволило [многим?] людям сохранить массу их
собственного и рабочего времени времени.

ppps: вы в данном случае - естественно безлично.

// wbr

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