1. C++ / Говнокод #14525

    +56

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #include <iostream>
    using namespace std;
    
    int main() {
    	int i = 5;
    	int* p1 = &i;
    	volatile int* p2 = &i;
    	cout << p1 << endl;
    	cout << p2 << endl;
    	return 0;
    }

    http://ideone.com/hpw4CB

    Запостил: LispGovno, 08 Февраля 2014

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

    • Вброс верхнего уровня от страуструпа.
      Ответить
      • прикольно

        интересно, какие были исторические причины запрета приведения volatile void * к const void *
        Ответить
        • А может быть, volatile появилось не сразу и про него забыли? Или психологический барьер не позволил сравнить такие непохожие сущности?
          Ответить
        • C.1.3 Clause 4: standard conversions [diff.conv]
          Сhange: Only pointers to non-const and non-volatile objects may be implicitly сonverted to void*
          Rationale: This improves type safety.
          Effect on original feature: Deletion of semantically well-defined feature.
          Difficulty of converting: Could be automated. A C program containing such an implicit conversion from, e.g., pointer-to-const-object to void* will receive a diagnostic message. The correction is to add an explicit cast.
          How widely used: Seldom.
          Ответить
          • но тут не о том, что я спросил:)
            Ответить
            • В общем запрет приведения volatile ссылки/указателя к не-volatile приблизительно такие же как и у запрета приведения const к не-const: нарушение семантики. В случае volatile ты ожидаешь, что компилятор не будет оптимизировать обращение к переменной. А если ты передаёшь, скажем volatile переменную в функцию принимающую просто ссылку, ты не можешь гарантировать, что компилятор не закеширует переменную, чтобы не дёргать память или не оптимизирует запись, или что-то ещё, ведь определение функции пожет быть вообще скомпилировано другим компилятором в другое время.
              Ответить
    • Такая же ситуация, если использовать только одну переменную, т. е. можно обойтись приведением типа: cout << (volatile int *)p1 << endl; или cout << (int *)p2 << endl;

      std:cout по-разному реагирует на (int *) и на (volatile int *) — для него это разные типы.

      P.S. На слова const и static он почему-то так не реагирует.
      Ответить
      • ostream::operator<<() берёт указатели как const void*. volatile в конст неявно не преобразуются, соответственно самая близкая перегрузка это ostream::operator<<(bool), вот она и используется.
        Ответить
        • И снова придётся вспомнить о том, что слабая типизация не нужна. Если бы компилятор посылал куда подальше, не найдя точного соответствия, найти ошибку было бы легче.
          Ответить
          • какую ошибку?
            давно своими руками volatile писал?
            Ответить
            • Честно? Я и в готовом ПО не помню, когда последний раз это слово видел. Кажется, что-то было связано с обработкой исключительных ситуаций...
              Ответить
              • Для МК нужно, если переменную в прерывании трогаешь.
                Ответить
        • Тут не только конст, тут вообще отбрасывание volatile при передаче ссылки/указателя запрещено
          Ответить
    • Просто и элегантно. В мемориз.
      Ответить
      • High Order Throw
        Ответить
        • Вброс возвращает вброс.
          Один вброс Страуструпа приводит к вбросу созданному в коде стандартной библиотеки гцц, который привел к вбросу на говнокоде. Осталось дождаться пока вброс на говнокоде приведет к очередному вбросу.
          А я ещё не верил в сюжет фильма Ёлки.
          Ответить
          • >Осталось дождаться пока вброс на говнокоде приведет к очередному вбросу.
            Из вброса на говнокоде идея прочно внедряется в мозг и искоренить её невозможно.
            Посмотри фильм Inception.
            Ответить
            • да кто ж его не видел?
              http://habrastorage.org/storage/habraeffect/7e/c6/7ec6526b2a6fa85a30736912c357c5b3.jpg
              Ответить
              • Эх. Никто не оценил щутку. High Order Function - Функция возвращает функцию.
                Ответить
                • щути чётче!

                  плюсанул тебя, наревел
                  Ответить
                • Дык я оценил. Потому и Inception.
                  Ответить
                  • > Inception
                    Наверняка программисты понимают это кино по-своему. Я смотрел и видел раскрутку стека при throw исключения с моста
                    Ответить
              • Где-то я видел на гейдеве говнокод на эту тему. Может вспомню. Регулярно на эту тему кидают ссылки.
                Ответить

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