- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
#include <stdio.h>
struct Gost {
int x = 42;
};
int main () {
Gost gst;
printf("%d\n", gst); // 42
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#include <stdio.h>
struct Gost {
int x = 42;
};
int main () {
Gost gst;
printf("%d\n", gst); // 42
}
http://ideone.com/fB26cs
Уб ли это?
bootcamp_dropout 06.10.2019 14:52 # +1
Как это работает с значениями а не указателями не знаю
gpyrou_nemyx 06.10.2019 23:40 # 0
MAPTbIwKA 06.10.2019 23:47 # +103
bootcamp_dropout 07.10.2019 11:39 # +1
ropuJIJIa 06.10.2019 15:36 # 0
cmepmop 06.10.2019 17:54 # −102
Dpyrou_Pycoqpo6_CEMA 07.10.2019 12:03 # −102
cmepmop 07.10.2019 13:43 # −102
А вообще, делфи пакует структуры ровно, кажется, даже галочка была в опциях.
Это вам не си ++.
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:16 # −102
cmepmop 07.10.2019 17:17 # −102
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:22 # −102
cmepmop 07.10.2019 21:11 # −102
Она бесплатна уже год как
Эмбаркадеро поумнела и решила искать баги в своих дырах ручками волонтёров.
Dpyrou_Pycoqpo6_CEMA 07.10.2019 22:35 # −102
MAPTbIwKA 06.10.2019 22:51 # +101
Никто не гарантирует тебе паддинг сзаду
gpyrou_nemyx 06.10.2019 23:43 # +1
http://port70.net/~nsz/c/c89/c89-draft.html#3.5.2.1
MAPTbIwKA 06.10.2019 23:46 # +102
ну тогда не убэ
Питух, а почему ты все еще петух, когда мы все уже давно обезьяны?
gost 06.10.2019 23:49 # 0
MAPTbIwKA 07.10.2019 00:01 # +103
хотя... может быть все будет зависеть от байтордера
gost 07.10.2019 00:02 # 0
ropuJIJIa 09.10.2019 02:27 # +1
MAPTbIwKA 09.10.2019 04:22 # +104
мне надо удалять слово onclick во всех переменных моего сайта, иначе будет XSS
не до стандартов
ropuJIJIa 09.10.2019 04:57 # +1
gost 09.10.2019 13:13 # +102
ropuJIJIa 09.10.2019 00:34 # 0
Передача параметров в функции — вообще отдельная тема. При передаче через стек компилятор аргументы функции разуплотняет, поэтому, например, на x86 нельзя передать char, он будет разуплотнён до мышиного слова (да, в документации по vararg это описано). Это не противоречит строке формата printf: "%d" как раз ожидает мышиное слово.
Dpyrou_Pycoqpo6_CEMA 09.10.2019 00:42 # −102
В ней были все необходимое для провоцирования революционной смуты. Была и жесткая критика общественных отношений, основанных на эксплуатации (изобличать может не только праведник, но и плут), и необходимость переустройства общества на основе СПРАВЕДЛИВОСТИ (мечта простых людей), и наукообразное обоснование всей этой ахинеи и обещание земного рая в светлом будущем. Незаконченность теории, системная незавершенность, эклектизм позволяли удачно пришедшим к власти ее приверженцам "творчески развивать и дополнять" новую религию в зависимости от времени, места и ситуации.
Ортодоксальные марксисты считали маловероятной возможность пролетарской революции в России, в стране, где этот самый пролетариат не составлял и 1% населения. Да и сознательность российского пролетариата, который пополнялся за счет "бомжующих" крестьян, особого энтузиазма не вызывала.
gpyrou_nemyx 06.10.2019 23:52 # +1
У меня есть обезьянья файка еще с дообезяньей епохи, но я не помню от нее пороль.
guest8 07.10.2019 00:38 # −999
CO6AKA_CTPALLIHA9I 07.10.2019 00:10 # −1
Elvenfighter 07.10.2019 01:04 # 0
guest8 07.10.2019 01:06 # −999
Elvenfighter 07.10.2019 12:58 # 0
https://www.youtube.com/watch?v=JOywXwwfXtM
guest8 08.10.2019 01:13 # −999
ropuJIJIa 09.10.2019 00:47 # 0
ВНЕЗАПНО в «PHP» работает:
http://ideone.com/vZKMeb
ropuJIJIa 07.10.2019 15:41 # +1
Почему 42? Когда вызывающий код пушит gst, на выбранной платформе он сначала пушит gst.d в стек плавающего питуха, а потом заносит gst.x в регистр. Функция printf ожидает значение "%d" в регистре, а значение "%f" в стеке плавающего питуха. Чтобы функция printf выдавала ожидаемый результат, нужно, чтобы кобенация "%f" и "%d" в первом аргументе совпадала с кобенацией плавающих и целых питухов в последующих аргументах.
А на других платформах по умолчанию сишка использует cdecl. В 32-битном коде для x86 cdecl использует стек плавающего питуха только для возврата значений, а при передаче аргументов всё пушится в стек. Поэтому такой код выведет 1374389535.
cmepmop 07.10.2019 16:10 # −102
@Результат зависит от ABI. В зависимости от атрибутов функции printf[...]
А я и не предполагал, что между сишниками и паскалистами столь значительная разница.
ropuJIJIa 07.10.2019 16:26 # 0
https://freepascal.org/docs-html/current/prog/progse22.html
https://freepascal.org/docs-html/current/ref/refsu71.html
Однако, в «стандартной» библиотеке Паскаля нет таких страшных функций, как printf, с вариабельным списком аргументов, которые не знают, какие аргументы им передали, и пытаются угадать типы и количество аргументов по строке формата.
В стандартном Паскале вообще не было функций с вариабельным списком аргументов.
Write, Writeln — это хак. Компилятор разбивает Write(x, y, z) на отдельные вызовы Write(x); Write(y); Write(z). В «Турбо Паскале» для компиляции модуля SYSTEM.PAS был специальный бутстрап-файл SYSTEM.TPS, в котором перечислены все подобные хаки.
array of const в «Delphi» — это более безопасная конструкция, чем свободный список параметров у printf. array of const пушит общее количество элементов массива, тип и размер каждого элемента. Функция с аргументом типа array of const точно знает, что ей передали.
Но сишники считают, что array of const — это оверхед, потому что в функцию передаётся много лишнего (а сишная строка "%d%f" — это не лишнее, ага).
cmepmop 07.10.2019 16:32 # −102
К слову, при открытии, делфи сразу создаёт пустую форму, будто приглашая писать гуй. Это разумно и естественно.
Так каким же нужно быть обдолбком, чтобы закрыть проект, выбрать меню и перейти New->Other->konsole application?..
На мой взгляд, это атавизм.
ropuJIJIa 07.10.2019 16:43 # 0
К слову, полезная программа может вообще не иметь ни окна, ни консоли, а общаться с другими программами по специальным каналам. В Windows такие программы называют службами, в Линуксе — демонами.
guest8 07.10.2019 17:11 # −999
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:30 # −102
cmepmop 07.10.2019 17:12 # −102
@Вывод может быть и в файл
В этом случае гораздо разумнее реализовать это с использованием API текущей операционки. Хватит писать совместимый (юзающий только stdlib), но нахуй никому не нужный код.
ropuJIJIa 07.10.2019 17:21 # 0
cmepmop 07.10.2019 17:25 # −102
Жаль, скринов не сохранилось, а то бы я показал, что вытворяет кривой format в проге на работе ("Квазар", C#).
ropuJIJIa 07.10.2019 17:31 # 0
А почему обёртки над файловыми операциями — это плохо? При использовании обёрток одну и ту же программу можно (с незначительными доработками, а то и вовсе без них) скомпилировать под разные операционные системы. При появлении очередной системы новый код один раз дописывается в стандартную библиотеку. Если же мы откажемся от обёрток, нам придётся каждый раз полностью переписывать все наши программы.
guest8 07.10.2019 17:37 # −999
cmepmop 07.10.2019 17:48 # −102
Ты словно педик-недотрога, их ещё "полупокерами" называют.
Dpyrou_Pycoqpo6_CEMA 07.10.2019 20:32 # −102
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:32 # −102
Сразу под KDE
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:16 # −102
А вообще хорошо, когда есть только Win32 ABI и можно спокойно шлепать формы.
Elvenfighter 10.10.2019 18:42 # 0
Elvenfighter 10.10.2019 18:45 # 0
MAKAKA 10.10.2019 18:46 # +1
Elvenfighter 11.10.2019 02:53 # 0
guest8 11.10.2019 03:08 # −999
gost 11.10.2019 03:37 # +102
Далее исследовательский отдел приступает к углублённому анализу Стандарта и конвенций вызова. Продолжение ждите в следующей серии.
ropuJIJIa 11.10.2019 03:45 # 0
Итак, такая программа выводит 1078523331
Для struct Gost {double d = 3.14; int x = 42;}; выводит 1374389535
Для struct Gost {int x = 42; float d = 3.14;}; выводит 42
Для struct Gost {int x = 42; double d = 3.14;}; выводит 42
Теперь меняем "%d" на "%f".
Для struct Gost {float d = 3.14; int x = 42;}; выводит ноль
Для struct Gost {double d = 3.14; int x = 42;}; выводит 3.14
Для struct Gost {int x = 42; float d = 3.14;}; выводит 49.92
Для struct Gost {int x = 42; double d = 3.14;}; выводит ноль Это для «gcc». В других компиляторах можно было бы попробовать другие calling convention. Для этих пяти у меня получились одинаковые результаты.
gost 11.10.2019 04:01 # +102
->
ropuJIJIa 11.10.2019 04:31 # 0
ropuJIJIa 11.10.2019 03:56 # 0
Вот в x86-64 (amd64) всё сложнее.
Dpyrou_Pycoqpo6_CEMA 11.10.2019 04:39 # −102
gost 10.10.2019 19:03 # +102
Берём описание формата (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) и парсим:
0 | 10000000 | 10010001111010111000011
sign = 0
exponent = 0b10000000 - 127 = 1
fraction = 10010001111010111000011, с ведущим битом: 110010001111010111000011
Переводим на «десятичную систему счисления» по формуле из «Википедии»:
nemyx_pycu4 10.10.2019 19:48 # −102
mekagem 07.10.2019 14:03 # 0
Передавать в `printf` "неожиданный" тип - это примерно то же самое, что и ub.
cmepmop 07.10.2019 14:28 # −102
cmepmop 07.10.2019 14:37 # −102
Правда, я выбрал более новый стандарт сей ++.
Значение тупо усеклось.
rycb_xpycTaJlbHblu 07.10.2019 16:12 # −102
cmepmop 07.10.2019 16:20 # −102
https://youtu.be/5R9UoGQ19MI?t=75
Dpyrou_Pycoqpo6_CEMA 07.10.2019 17:20 # −102
О чем тебе даже ворнинг был.
Но хороший формошлеп ворнингов не боится!
cmepmop 07.10.2019 17:50 # −102
Dpyrou_Pycoqpo6_CEMA 09.10.2019 00:01 # −102
Выборы в России - это когда граждане думают, что они выбирают.
Dpyrou_Pycoqpo6_CEMA 09.10.2019 00:58 # −102