1. Си / Говнокод #12447

    +110

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    int strnlen(const char *s, int size)
    {
            int i;
            for(i=0; i<size; i++) if(!*s) break;
            return i;
    }

    Запостил: tz-lom, 18 Января 2013

    Комментарии (36) RSS

    • Опа - Индус стайл!!!
      Ответить
      • На самом деле это из Китая :)
        Ответить
        • А что мешало автору использовать аналогичную функцию из библиотеки поставки? Я Правда видел китайскую реализацию спринтфа - но там особая ситуация он для 16 битных строк.
          Ответить
          • а вы ещё посмотрите внимательно что код на самом деле делает
            Ответить
            • Греет комнату, видимо, в китае бывает довольно холодно
              P.S. Только собирать нужно без оптимизации
              Ответить
              • Я слоупок. Пока не прочитал этот комментарий, не заметил, что указатель в цикле не изменяется.
                Ответить
            • Да я понял что возвращает сайз, а не ищет индекс терминирующего символа,
              Ответить
              • Не совсем. Если первый символ нулевой - то вернет 0, в остальных случаях size.
                Ответить
          • вроде как из-за китайцев как раз юникод в 2 байта не укладывается.
            Ответить
      • > Опа - Индус стайл!!!
        http://www.youtube.com/watch?v=9bZkp7q19f0
        Ответить
        • 1.2 млрд... скорее бы перевалило через 2147483648, хочется узнать, не поставил ли там гугл 32-битный знаковый инт.
          Ответить
    • кто-то что-то например с линуха или бсд портировал. в GNU libc, в POSIX, и в фрибсд есть strnlen(), по описанию соответсвующая реализации сверху. но strnlen() не является частью С стандарта и поэтому на некоторых платформах (например солярка) отсутствует.
      Ответить
    • Зачем это вообще нужно?
      Ответить
      • > strnlen - determine the length of a fixed-size string
        Видимо неудачный порт чего-то ГНУтого и юзающего strnlen на какую-нибудь говноштудию, которая срала на POSIX.
        Ответить
        • Я не особо крут во многопоточном программировании, но это явно очень хитрый мьютекс со счетчиком, правда пришлось немного его допилить.
          #include <thread>
          #include <iostream>
          
          int strnlen(volatile const char *s, int size)
          {
                  int i;
                  for(i=0; i<size; i++) if(!*s) break;
                  return i;
          }
          
          int main(int, char **) 
          {
          	volatile char mutex = 'a';
          
          	std::thread thread1([&mutex]()
          	{
          		std::cout << std::hex << strnlen(&mutex, std::numeric_limits<int>::max()) << std::dec << std::endl;
          	});
          
          	std::thread thread2([&mutex]()
          	{
          		std::this_thread::sleep_for(std::chrono::milliseconds(100));
          		mutex = '\0';
          	});
          
          	thread1.join();
          	thread2.join();
          	return 0;
          }

          В одиннадцатой студии на Горе и5 в релизе при первом запуске вывело 4а8ф76ц.
          Ответить
          • volatile при многопоточном программировании только усугубляют ситуацию, но никак не помогают ;)

            Use barriers, Luke.

            P.S. Ай блин, старый дурак я, забыл что визуалка для защиты от не прочитавших про барьеры сует эти самые барьеры во все volatile сохранения\загрузки...
            Ответить
          • Неплохая статья про бесполезность volatile в многопоточных ситуациях: http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming

            "...the use of volatile accomplishes nothing but to prevent the compiler from making useful and desirable optimizations, providing no help whatsoever in making code "thread safe". " - David Butenhof
            Ответить
            • Спасибо за ссылочку, будем ковырять :) Когда регистрировался на говнокоде, то даже и не подозревал, что он станет для меня дополнительным источником образования. PROFIT
              Ответить
              • > Когда регистрировался на говнокоде, то даже и не подозревал, что он станет для меня дополнительным источником образования. PROFIT
                Я тоже... но благодаря местным обитателям каждый день получаю какие-то новые знания или интересные ссылки ;)
                Ответить
          • Тарасокод
            Ответить
    • Забавно, но такая программа в Delphi\Pascal - UB.
      Значение переменной цикла после цикла не определено. Если точнее то определено, что в диапазоне: i=a, i=a-1, i=a+1
      Ответить
      • Присмотрелся. все ещё хуже. s не меняется
        Ответить
      • > Значение переменной цикла после цикла не определено.
        Пасцаль такой пасцаль. Ради микрооптимизации сделали весьма полезное значение UB'ом, а я думал что только кресты этим славятся...

        P.S. Можно пруф от Вирта?
        Ответить
        • даже я такое помню со школьных лет
          а у паскаля разве есть стандарт, чтобы на него сослаться?
          Ответить
          • Ну вот наверное: ISO 7185:1990.

            UPD: Блин всего 92 страницы. Куда уж ему до крестостандартов.
            Ответить
            • Ты ещё лиспа не видел.
              Ответить
              • коммон лиспа. у схемы меньше, чем у паскаля, 59 страниц, если не считать аппендиксы (http://www.r6rs.org/final/r6rs.pdf)
                Ответить
                • CLispGovno now #
                  Я именно о схеме. Ну и смотри r5rs, так как rs6r сильно раздута.
                  Я даже больше скажу: Прочитав её стандарт - не нужно читать дополнительных книг по нему (по крайней мере это не критически необходимо, если хоть какие-то языки видел). Так как эти самые 59 страниц стандарта содержут и коментарии к стандарту на уровне туториала по языку на понятном уровне. А попробуйка прочитать стандарт крестов и сразу начать писать на них. Хуй начнешь писать и через полгода после нескольких книг.

                  И специально для тебя, Роман: Погугли Scala Workshitsheet.
                  Ответить
                  • > смотри r5rs, так как rs6r сильно раздута
                    В пятерке нет никакого аналога модулей. Язык без нормальной системы модулей серьёзно воспринимать довольно сложно (даже php чудом попал в мэйнстрим, посмотрел по сторонам и наговнявкал неймспейсы).

                    > Scala Worksheet
                    > There are 5 Eclipse plugins...
                    дальше не читал
                    Ответить
          • UPD2: Собственно цитата из стандарта: After a for-statement is executed, other than being left by a goto-statement, the control-variable shall be undefined.
            Ответить

    Добавить комментарий