- 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
Уб ли это?
Как это работает с значениями а не указателями не знаю
А вообще, делфи пакует структуры ровно, кажется, даже галочка была в опциях.
Это вам не си ++.
Она бесплатна уже год как
Эмбаркадеро поумнела и решила искать баги в своих дырах ручками волонтёров.
Никто не гарантирует тебе паддинг сзаду
http://port70.net/~nsz/c/c89/c89-draft.html#3.5.2.1
ну тогда не убэ
Питух, а почему ты все еще петух, когда мы все уже давно обезьяны?
хотя... может быть все будет зависеть от байтордера
мне надо удалять слово onclick во всех переменных моего сайта, иначе будет XSS
не до стандартов
Передача параметров в функции — вообще отдельная тема. При передаче через стек компилятор аргументы функции разуплотняет, поэтому, например, на x86 нельзя передать char, он будет разуплотнён до мышиного слова (да, в документации по vararg это описано). Это не противоречит строке формата printf: "%d" как раз ожидает мышиное слово.
В ней были все необходимое для провоцирования революционной смуты. Была и жесткая критика общественных отношений, основанных на эксплуатации (изобличать может не только праведник, но и плут), и необходимость переустройства общества на основе СПРАВЕДЛИВОСТИ (мечта простых людей), и наукообразное обоснование всей этой ахинеи и обещание земного рая в светлом будущем. Незаконченность теории, системная незавершенность, эклектизм позволяли удачно пришедшим к власти ее приверженцам "творчески развивать и дополнять" новую религию в зависимости от времени, места и ситуации.
Ортодоксальные марксисты считали маловероятной возможность пролетарской революции в России, в стране, где этот самый пролетариат не составлял и 1% населения. Да и сознательность российского пролетариата, который пополнялся за счет "бомжующих" крестьян, особого энтузиазма не вызывала.
У меня есть обезьянья файка еще с дообезяньей епохи, но я не помню от нее пороль.
https://www.youtube.com/watch?v=JOywXwwfXtM
ВНЕЗАПНО в «PHP» работает:
http://ideone.com/vZKMeb
Почему 42? Когда вызывающий код пушит gst, на выбранной платформе он сначала пушит gst.d в стек плавающего питуха, а потом заносит gst.x в регистр. Функция printf ожидает значение "%d" в регистре, а значение "%f" в стеке плавающего питуха. Чтобы функция printf выдавала ожидаемый результат, нужно, чтобы кобенация "%f" и "%d" в первом аргументе совпадала с кобенацией плавающих и целых питухов в последующих аргументах.
А на других платформах по умолчанию сишка использует cdecl. В 32-битном коде для x86 cdecl использует стек плавающего питуха только для возврата значений, а при передаче аргументов всё пушится в стек. Поэтому такой код выведет 1374389535.
@Результат зависит от ABI. В зависимости от атрибутов функции printf[...]
А я и не предполагал, что между сишниками и паскалистами столь значительная разница.
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" — это не лишнее, ага).
К слову, при открытии, делфи сразу создаёт пустую форму, будто приглашая писать гуй. Это разумно и естественно.
Так каким же нужно быть обдолбком, чтобы закрыть проект, выбрать меню и перейти New->Other->konsole application?..
На мой взгляд, это атавизм.
К слову, полезная программа может вообще не иметь ни окна, ни консоли, а общаться с другими программами по специальным каналам. В Windows такие программы называют службами, в Линуксе — демонами.
@Вывод может быть и в файл
В этом случае гораздо разумнее реализовать это с использованием API текущей операционки. Хватит писать совместимый (юзающий только stdlib), но нахуй никому не нужный код.
Жаль, скринов не сохранилось, а то бы я показал, что вытворяет кривой format в проге на работе ("Квазар", C#).
А почему обёртки над файловыми операциями — это плохо? При использовании обёрток одну и ту же программу можно (с незначительными доработками, а то и вовсе без них) скомпилировать под разные операционные системы. При появлении очередной системы новый код один раз дописывается в стандартную библиотеку. Если же мы откажемся от обёрток, нам придётся каждый раз полностью переписывать все наши программы.
Ты словно педик-недотрога, их ещё "полупокерами" называют.
Сразу под KDE
А вообще хорошо, когда есть только Win32 ABI и можно спокойно шлепать формы.
Далее исследовательский отдел приступает к углублённому анализу Стандарта и конвенций вызова. Продолжение ждите в следующей серии.
Итак, такая программа выводит 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. Для этих пяти у меня получились одинаковые результаты.
->
Вот в x86-64 (amd64) всё сложнее.
Берём описание формата (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) и парсим:
0 | 10000000 | 10010001111010111000011
sign = 0
exponent = 0b10000000 - 127 = 1
fraction = 10010001111010111000011, с ведущим битом: 110010001111010111000011
Переводим на «десятичную систему счисления» по формуле из «Википедии»:
Передавать в `printf` "неожиданный" тип - это примерно то же самое, что и ub.
Правда, я выбрал более новый стандарт сей ++.
Значение тупо усеклось.
https://youtu.be/5R9UoGQ19MI?t=75
О чем тебе даже ворнинг был.
Но хороший формошлеп ворнингов не боится!
Выборы в России - это когда граждане думают, что они выбирают.