1. C# / Говнокод #12642

    +140

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    fixed (char* p = "A")
    {
        p[0] = 'B';
    }
    
    Console.WriteLine("A");

    Immutable strings

    Запостил: Ccik, 24 Февраля 2013

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

    • unsafe такой unsafe ;)
      Ответить
      • P.S. Хотя я не думал, что он настолько unsafe.
        Ответить
        • Если это работает в Си или С++, а в C# даже константности нет, то логично.
          Ответить
          • Да вот в Си/C++ оно как раз не особо работает.

            Не смотрел что по поводу модификации литерала говорит стандарт, но по идее это должен быть UB. Именно UB на модификации литерала позволяет компилятору группировать одинаковые литералы в один. Без UB'а он не имел бы никакого права так делать.

            Ну и в линухе вот такой код падает с сегфолтом:
            #include <stdio.h>
            
            int main() {
                char *s = "dasd";
                s[0] = 'b';
                return 0;
            }
            Ответить
            • разве этот код не должен выдавать как минимум ворнинг?
              про то, что "куда дел константность, ирод?"
              Ответить
              • > разве этот код не должен выдавать как минимум ворнинг?
                Ну gcc в крестах выдает по дефолту. А в сишке - только если включен -Wwrite-strings, почему-то не входящий в -Wall и -Wextra. Видимо из-за того, что для сишки пихание литералов в char* долгое время считалось нормальной практикой, и при сборке говна мамонта не юзающего const типичной старой сишколибы будут сыпаться тонны ворнингов.
                Ответить
            • ну тут понятно, почему сегфолт
              Ответить
            • А вот с char s[] уже всё ок.
              Ответить
              • Ну дык это копия ;)
                Ответить
                • кто копия?
                  Ответить
                  • На стеке массив создаётся и инициируется строкой, пиши в него что хочешь.
                    Ответить
                    • Во бля, теперь я знаю, чем отличается char[] от char*
                      Я раньше не знал...
                      Ответить
                      • это ведь концептуально между прочим
                        Ответить
                      • более того, если объявить как массив, размер будет тоже иметь отношение к типу.
                        Ответить
    • А чего ссылку на первоисточник не кинули? Это ж немного переделанный пример от MS.

      http://msdn.microsoft.com/en-us/library/ms228599.aspx
      Самый нижний пример на странице.
      Ответить
      • Ну я, кстати, сам нашел, случайно :)
        Ответить
    • я помню я как-то умудрялся с помощью unsafe и fixed перезаписывать левые данные вверх по стеку и менять ход программы, ваще fun
      Ответить

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