forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   ненависть: strtok (http://forum.boolean.name/showthread.php?t=19878)

impersonalis 26.06.2015 13:09

ненависть: strtok
 
strtok

Никогда этой функцией не пользовался, так как всегда была возможность реализовать контекстно более рациональный механизм работы с токенами. А тут представилась свободная минутка почитать про эту непотокобезопасную, нереентерабельную жуть. Фиг бы с ним (зачастую) с потоками, да даже и для нереентерабельности, скрепя сердце, можно найти оправдание... ЭТА ШТА ТАКОЭ:
Код:

char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }

(http://www.cplusplus.com/reference/cstring/strtok/)
Может функция возвращает указатели на токены, создавая их в куче? Нет - судя по адресам - указатели непосредственно на байты исходной строки. Но ведь она может быть const (хоть, согласно костылю стандарта, может быть объявлена и без соответствующего спецификатора) - а для закрытия токена необходимо перезаписать ближайший разделитель терминатором. Подобное надругательство у Страуструпа комментируется как "ошибки, обычно не выявляющиеся до стадии выполнения программы" и отмечается зависимость поведения от реализации. Так же упомянуто в разделе "Нежелательные особенности".
Всё что нужно, чтобы уронить программу, оформить обрабатываемую строку как литерал:
Код:

char *str ="- This, a sample string.";
Спецификатора const нет - ошибок при сборке нет - крах есть.
Не пользовался и не буду >>:(

Нафиг такую муть в стандартную либу пихать, посоны?

SBJoker 26.06.2015 14:54

Ответ: ненависть: strtok
 
Ну походу это Legacy.

mr.DIMAS 27.06.2015 02:08

Ответ: ненависть: strtok
 
̶П̶о̶т̶о̶м̶у̶ ̶ч̶т̶о̶ ̶С̶и̶ ̶н̶е̶ ̶д̶л̶я̶ ̶н̶у̶б̶о̶в̶

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

impersonalis 01.07.2015 15:01

Ответ: ненависть: strtok
 
2mr.DIMAS

Да будь я
______и нубом преклонных годов
и то,
____без унынья и лени,
я СИшник бы выучил
_____________только за то,
что б
____ставить врагов на колени.

mr.DIMAS 01.07.2015 16:04

Ответ: ненависть: strtok
 
Какой посыл сея стиха? Я не называл тебя нубом, просто Си коварный и опасный язык при неверном обращении.


Часовой пояс GMT +4, время: 00:31.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot