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

    −47

    1. 1
    while((*dst++ = *src++));

    двойные скобки, чтоб заткнуть ворнинг

    warning: suggest parentheses around assignment used as truth value [-Wparentheses]

    Запостил: j123123, 08 Июля 2016

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

    • strcpy из k&r?
      Ответить
      • http://netlib.narod.ru/library/book0003/ch05_05.htm нет, там по-другому. Два раза в скобки не засовывают
        Ответить
        • Потому что на !=0 не зажмотились.
          Ответить
          • можно было б еще !! сделать
            Ответить
          • Но ведь там != '\0'. То есть они не зажмотились вставить символьную константу, чтобы не было неявного каста символа в число.

            В Паскале, например, это важно, потому что в нём byte и char — это принципиально разные типы и для преобразования из одного в другой нужен явный каст.
            Ответить
            • с точки зрения си разницы вообще никакой. != '\0' это просто стандартный способ заткнуть ворнинг любого шибко умного компилятора
              Ответить
            • Заметив, что сравнение с '\0' здесь лишнее
              Ответить
              • Да, в сишке лишнее, потому что ещё со времён K&R в сишке автоматический вывод типов.
                Ответить
    • --винни, зачем ты ешь говно?
      --заткнись, ворнинг!
      Ответить
    • Да ну? Я такое даже в списках вопросов видел для собеседований - че-то матерых лидов такие штуки не смущают.
      Ответить
    • > In the C99 standard, §7.17.3 states that NULL “expands to an implementation defined null pointer constant”. Meanwhile §6.3.2.3.3 defines null pointer constant as “an integer constant expression with the value 0, or such an expression cast to type void *”.

      Если царь превратится в опасного кусачего зомби, я, кажется, знаю, как спастись. Надо пропатчить линух, чтобы он мапил страницу с нулевым адресом в RAM, а не сегфолтил. На таком линуксе не будет работать сишкин стандарт -- получится ОС, куда он забраться не сможет никогда!
      Ответить
      • А каст числа 0 в указатель void* разве не имеет права сделать какую-то implementation-defined магию (например (void*)0 внезапно будет указывать на ячейку с адресом 0xFFFFFFFF)?

        Или трансляция число <-> указатель не implementation-defined? Лень открывать стандарт...
        Ответить
        • Я об этом думал, но тогда и арифметика указателей должна быть хитрой? Если guard-страница будет где-то в середине адресного пространства, например. Хотя ты прав:

          As according to the C99: 6.3.2.3 quote:
          
              5 An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.56)
          
              6 Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.
          Ответить
          • А арифметика указателей, емнип, и не обязана работать за пределами объекта. Если реализация не будет задевать адрес с "NULL" своим аллокатором и стеком - всё ок. Вылез за объекты - получи UB, сука.
            Ответить
          • > and might be a trap representation
            Класс! Т.е. можно сделать реализацию сишечки, в которой числа бесполезно кастовать в указатели, т.к. всегда получается какой-нибудь NULL, который крашится при разадресации. Ну и при обратном касте всегда возвращать 0.

            Ибо нехуй.
            Ответить
            • Насколько помнится, при касте валидного указателя в достаточно широкое число и обратно, должен получится этот же указатель.
              Ответить
              • Даже отдельно предусмотрен тип достаточно широкого числа. uintptr_t.
                Ответить
      • Патчить не надо -- это можно сделать через sysctl и mmap.
        Но null pointer dereference -- это UB. Почему это B не может быть возвратом числа 0x6c6f6c7069647229?
        Ответить
      • Где-то в микроконтроллерном аду видел прямой каст NULL к указателю на функцию. Резетились они так.
        Ответить
        • Да это даже в ядре линукса есть (для арма вроде).
          Ответить
        • А если по нулевому адресу надо прочитать или записать значение (и чтоб без UB) то как это сделать в С?
          Ответить
          • Если это необходимо на данной платформе, то это проблема негров реализации. Как это сделать решают авторы компилятора и документируют.
            Ответить

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