% Generated from json/card_source.json by tools/render_card.py. % Do not edit manually; update the JSON and regenerate. \documentclass[12pt,a4paper]{article} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage[utf8]{inputenc} \usepackage[polish]{babel} \usepackage{csquotes} \usepackage{amsmath} \usepackage{amssymb} \usepackage{xcolor} \usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry} \usepackage{eso-pic} \usepackage{marginnote} \usepackage{array} \usepackage{tabularx} \usepackage{graphicx} \usepackage{pdflscape} \usepackage{float} \usepackage{silence} \WarningFilter{soulutf8}{This package is obsolete} \usepackage{pdfcomment} \usepackage{enumitem} \usepackage{needspace} \usepackage{fancyhdr} \usepackage{lastpage} \usepackage{microtype} \usepackage[most]{tcolorbox} \usepackage{qrcode} \IfFileExists{references.bib}{% \usepackage[backend=biber,style=numeric,sorting=none]{biblatex}% \addbibresource{references.bib}% }{} \hypersetup{hidelinks} \IfFileExists{build-meta.tex}{% \input{build-meta.tex}% }{% \newcommand{\BuildCommit}{lokalna}% } \newcommand{\DocumentAuthor}{M. Pabiszczak} \newcommand{\DocumentYear}{2026} \newcommand{\CardSeries}{c} \newcommand{\CardNumber}{09} \newcommand{\CardCount}{13} \newcommand{\CardSlug}{smalloc-sbrk-libc} \newcommand{\CardVersion}{v00.01} \newcommand{\DocumentUUID}{47826ae5-6370-5ac2-bd91-9acb89116d40} \newcommand{\EmptyCheck}{\(\square\)} \newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill} \newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}} \setlength{\parindent}{0pt} \setlength{\parskip}{0.45em} \setlength{\headheight}{24mm} \setlength{\headsep}{3mm} \setlength{\footskip}{8mm} \setlength{\marginparwidth}{1.5cm} \setlength{\marginparsep}{0.25cm} \renewcommand{\arraystretch}{1.22} % Margin separator lines disabled for layout trial. \newcommand{\ESCPageResourceHeader}{% \begingroup% \setlength{\parskip}{0pt}% \setlength{\fboxsep}{0pt}% \setlength{\fboxrule}{0.35pt}% \setlength{\arrayrulewidth}{0.35pt}% \noindent\fbox{% \begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}% \begin{minipage}[c][23mm][c]{24mm}\centering% \href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-smalloc-sbrk-libc}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-smalloc-sbrk-libc}}% \end{minipage}% \vrule width0.35pt% \begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}% \setlength{\tabcolsep}{0pt}% \renewcommand{\arraystretch}{0}% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries smalloc, sbrk i minimalne libc}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C na RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries C · Freestanding RV32I and K\&R}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 09/13}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 47826ae5-6370-5ac2-bd91-9acb89116d40}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily 8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}X@{}}% \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-smalloc-sbrk-libc}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-smalloc-sbrk-libc}}}} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}X@{}}% \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0}}}} \\% \end{tabularx}% \end{minipage}% \vrule width0.35pt% \begin{minipage}[c][23mm][c]{24mm}\centering% \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0}}% \end{minipage}% \end{minipage}% }% \endgroup% } \pagestyle{fancy} \fancyhf{} \fancyhead[C]{\ESCPageResourceHeader} \renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{0pt} \newcommand{\ESCMarginTag}[4]{% \hspace*{#1}\textcolor{#2}{#3~#4}% } \newcommand{\ESCSectionBlockStart}{% \Needspace{8\baselineskip}% \par\vspace{0.35em}% \noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}% \par\vspace{0.15em}% } \newcommand{\ESCSectionBlockEnd}{% \par\vspace{0.45em}% } \newcommand{\ESCTinyStepSeparator}{% \par\vspace{0.10em}% \noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}% \par\vspace{0.10em}% } \newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}} \newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}} \newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}} \newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries WNIOSEK}} \newcommand{\ESCLearningTreeWidget}{% \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń porównuje mapę linkera, kontrolowany błąd symbolu, globalne checkpointy, wynik hosta i\textCR kod wyjścia Hazard3, a wnioski ogranicza do naprawdę zmierzonych własności.}}\par% \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% \end{minipage}% }% \end{minipage}% ]{} \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń wyprowadza osobno: wybór członu archiwum, wiązanie symbolu dostawcy pamięci oraz\textCR inwarianty polityki alokacji, zamiast nazywać wszystkie trzy mechanizmy stertą.}}\par% \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% \end{minipage}% }% \end{minipage}% } } \begin{document} \sloppy \vspace{1.0em} \noindent{\Large\bfseries Cel karty}\par \vspace{0.35em} Uczeń rozdziela wybór funkcji z archiwum libc, kontrakt dostawcy pamięci sbrk i politykę alokatora. Najpierw dowodzi, że strlen nie potrzebuje sterty, potem kontrolowanie zrywa zależność malloc do sbrk, buduje ograniczony model break i wyrównany smalloc, a na końcu traktuje prawdziwe malloc/free picolibc jako czarną skrzynkę sprawdzaną przez kontrakt. \vspace{0.8em} \noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} \vspace{0.7em} \noindent{\Large\bfseries Zakres i zachowane przykłady}\par \vspace{0.35em} Pięć zachowanych przykładów działa na hoście i RV32I tam, gdzie istnieje program uruchamialny. Task02 jest zamierzonym expected-fail linkera i nie ma obrazu runtime. W aktualnym GCC 15.2 biblioteka to picolibc: jej malloc odwołuje się do sbrk, podczas gdy vendorowy init.S Hazard3 definiuje inny symbol \_sbrk. Własny linker ogranicza stertę symbolami \_\_heap\_start i \_\_heap\_end oraz rezerwuje 64 KiB stosu.\par\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód. \vspace{0.55em} \small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}@{}} \textbf{K\&R} & \textbf{Numer tasku} & \textbf{Najważniejsza idea} & \textbf{Priorytet} \\ \hline \hline \textbf{\texttt{7.8}} & \textbf{\texttt{Task01}} & \textbf{libc.a: wybór strlen.c.o} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{5.4 + ABI}} & \textbf{\texttt{Task02}} & \textbf{expected-fail: malloc -> sbrk} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{5.4}} & \textbf{\texttt{Task03}} & \textbf{ograniczony break i atomowy błąd} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{5.4}} & \textbf{\texttt{Task04}} & \textbf{nagłówek, alignment i reset areny} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{7.8 + ABI}} & \textbf{\texttt{Task05}} & \textbf{malloc/free picolibc jako black box} & \textbf{kluczowe} \\ \hline \end{tabularx} \normalsize \vspace{0.8em} \noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} \clearpage \ESCSectionBlockStart \section{1 — Funkcja z libc nie oznacza automatycznie sterty} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] Archiwum \texttt{libc.a} nie jest włączane do programu w całości. Linker pobiera człon, który rozwiązuje potrzebny symbol, a następne człony tylko wtedy, gdy pojawią się kolejne nierozwiązane odwołania. Dlatego bezpośrednie wywołanie \texttt{strlen} z opcją \texttt{-fno-builtin} wybiera \texttt{strlen.c.o}, lecz nie wybiera \texttt{libc\_stdlib\_malloc.c.o} ani \texttt{libc\_misc\_picosbrk.c.o}. Dowodem jest mapa linkera, a nie samo dołączenie nagłówka \texttt{string.h}. Task01 rozstrzyga wyłącznie tę zależność. Nie dowodzi, że każda funkcja tekstowa jest bezkosztowa ani że całe libc nie używa pamięci dynamicznej. \ESCSectionBlockEnd \ESCSectionBlockStart \section{2 — malloc potrzebuje sbrk, lecz \_sbrk to inna nazwa} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] W badanym GCC 15.2 używane jest \textbf{picolibc}, nie newlib. Człon \texttt{libc\_stdlib\_malloc.c.o} ma niezdefiniowane odwołanie do \texttt{sbrk}. Picolibc może dostarczyć je z \texttt{libc\_misc\_picosbrk.c.o}; ten kod opiera granice na symbolach linkera \texttt{\_\_heap\_start} i \texttt{\_\_heap\_end}. Z kolei \texttt{vendor/Hazard3/.../init.S} definiuje \texttt{\_sbrk} z jednym podkreśleniem. Dla linkera są to dwa różne symbole, więc mogą współistnieć w Task05. Task02 używa \texttt{--wrap=sbrk}: każde odwołanie do \texttt{sbrk} zostaje skierowane do celowo brakującego \texttt{\_\_wrap\_sbrk}. Oczekiwany błąd jest kontrolowanym testem krawędzi \texttt{malloc -> sbrk}, a nie awarią całego projektu. \ESCSectionBlockEnd \ESCSectionBlockStart \section{3 — Od alloc z K\&R 5.4 do bounded sbrk i smalloc} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] Liniowy \texttt{alloc} z K\&R 5.4 przesuwa wskaźnik w stałej tablicy. Jest prosty, ale nie odzyskuje dowolnego bloku, nie wybiera najlepszego dopasowania, nie dzieli i nie scala wolnych obszarów. \texttt{afree} może cofnąć wskaźnik jedynie do adresu należącego do areny, więc bez dyscypliny stosowej łatwo unieważnić późniejsze przydziały. Historyczna tablica bajtów nie jest też ogólną deklaracją wyrównania dla każdego typu. Task03 zachowuje istotę modelu, lecz jawnie wymusza \texttt{heap\_start <= brk <= heap\_end}; odrzucona operacja nie zmienia break. Task04 dodaje 16-bajtowe wyrównanie i 16-bajtowy nagłówek bezpośrednio przed payloadem. Nadal jest to alokator append-only: nie ma \texttt{sfree}, listy wolnych bloków, split ani coalescing. Jedyną operacją odzyskania jest reset całej areny, który unieważnia wszystkie wcześniejsze wskaźniki. \ESCSectionBlockEnd \ESCSectionBlockStart \section{4 — Prawdziwe malloc/free jako czarna skrzynka} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] Task05 nie zakłada, że picolibc ma taki sam nagłówek lub strategię jak \texttt{c09\_smalloc}. Program sprawdza tylko publiczny kontrakt potrzebny klientowi: dwa udane przydziały dają używalne, rozłączne obszary; zapisane bajty można odczytać; adresy spełniają mierzone wyrównanie; oba bloki są przekazane do \texttt{free}. Nie odczytuje pamięci po \texttt{free} i nie wymaga ponownego użycia tego samego adresu. Minimalny startup ustawia \texttt{gp}, pojedynczą bazę TLS \texttt{tp}, zeruje \texttt{.tbss} i \texttt{.bss}, a następnie wywołuje \texttt{main}. Skrypt linkera pozostawia \texttt{\_\_heap\_end} 64 KiB przed \texttt{\_\_stack\_top} i ma \texttt{ASSERT} zatrzymujący obraz, gdy sekcje zajmą zarezerwowany obszar. \ESCSectionBlockEnd \clearpage \ESCSectionBlockStart \section{Zadania — zachowane przykłady w profilu A1–A8} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] \begin{ESCTaskFrame}{TASK01 · strlen z libc bez sterty} {\scriptsize\ttfamily 839b8401-9f15-5edc-a214-176c06ba5cb1}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — klient, archiwum i brak dostawcy pamięci} \textbf{Zachowany przykład:} \texttt{src/tasks/task01\_libc\_without\_heap.c}.\par Klient wywołuje publiczne \texttt{strlen}. Granicą systemu jest linker wybierający potrzebny człon \texttt{libc.a}; Task01 nie deklaruje ani nie wywołuje \texttt{malloc}, \texttt{free} lub \texttt{sbrk}. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — jedna krawędź symboliczna} Przy \texttt{-fno-builtin} obiekt tasku zachowuje niezdefiniowany symbol \texttt{strlen}. Linker rozwiązuje go przez \texttt{strlen.c.o}. Ten człon nie tworzy następnej krawędzi do alokatora, dlatego graf zależności kończy się bez warstwy sterty. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · N/D} \textbf{N/D.} strlen i checkpoint są wywołaniami bezpośrednimi; program nie ma callbacku, ISR, wskaźnika funkcji ani dynamicznego wyboru implementacji. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — dwa niezależne warunki sukcesu} Warunek wykonania to długość 16 dla napisu \texttt{picolibc-no-heap}. Warunek obrazu to obecność wyłącznie potrzebnego członu tekstowego i brak trzech nazw członów związanych z przydziałem. Sam kod wyjścia nie zastępuje kontroli mapy. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — kompilacja, selekcja archiwum, wywołanie} Kompilator pozostawia call do \texttt{strlen}; linker przegląda archiwum i pobiera \texttt{strlen.c.o}; startup uruchamia \texttt{main}; funkcja oblicza 16; checkpoint publikuje wynik; \texttt{main} zwraca 0. Każdy etap ma inny artefakt dowodowy. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · N/D} \textbf{N/D.} Program wykonuje jednorazowy, czysty pomiar długości i nie ma domenowego obiektu przechodzącego przez istotne stany ani zasobu o cyklu życia. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — global i mapa odpowiadają na inne pytania} W \texttt{task01\_debug\_checkpoint} global \texttt{g\_task01\_length} ma wartość 16, a \texttt{g\_task01\_pass} wartość 1. Osobno \texttt{prog.map} wskazuje \texttt{libc.a(strlen.c.o)}; test mapy odrzuca każdą nazwę członu heap. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — płać za osiągalne symbole, nie za nagłówek} Dla archiwum statycznego właściwym wzorcem audytu jest śledzenie nierozwiązanych symboli i pobranych członów. \texttt{\#include } dostarcza deklarację; nie jest poleceniem dołączenia całej implementacji libc. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Przed linkowaniem przewidź, które człony \texttt{libc.a} są potrzebne przez bezpośrednie \texttt{strlen}. Uruchom program, a potem w mapie udowodnij obecność \texttt{strlen.c.o} i nieobecność członów malloc, free oraz picosbrk. \par\textbf{Evidence:} Przewidywany wynik, odczyt programu hostowego wraz z kodem powrotu, wartość obiektu wynikowego w obrazie RV32I oraz krótki wniosek wyjaśniający zgodność albo różnicę. \par\textbf{Acceptance:} Host i Hazard3: length=16, pass=1, kod 0. Mapa RV32I zawiera libc.a(strlen.c.o), ale nie zawiera libc\_stdlib\_malloc.c.o, libc\_stdlib\_free.c.o ani libc\_misc\_picosbrk.c.o. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Wynik programu hostowego}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Wynik RV32I i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK02 · Kontrolowany brak dostawcy sbrk} {\scriptsize\ttfamily 9c55597f-3145-5744-b13e-f1c0ee83abc8}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — kontrolowane przecięcie granicy platformy} \textbf{Zachowany przykład:} \texttt{src/tasks/task02\_malloc\_requires\_sbrk.c}.\par Kod klienta żąda 16 B przez \texttt{malloc}. Opcja linkera przechwytuje wyłącznie symbol dostawcy pamięci, dzięki czemu testuje granicę libc--platforma bez usuwania lub modyfikowania systemowego archiwum. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — caller, człon malloc i brakujący wrapper} Obiekt tasku wnosi odwołanie do \texttt{malloc}; linker pobiera \texttt{libc\_stdlib\_malloc.c.o}. Jego odwołania do \texttt{sbrk} są przez \texttt{--wrap} przepisywane na \texttt{\_\_wrap\_sbrk}. Żaden obiekt celowo nie definiuje tej ostatniej nazwy. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · N/D} \textbf{N/D.} Wywołanie malloc jest bezpośrednie, a --wrap jest transformacją nazw podczas linkowania, nie mechanizmem callbacku, ISR ani dynamicznego dispatchu w programie. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — porażka ma precyzyjną sygnaturę} Sukces testu oznacza jednocześnie: obiekt C powstał, link zwrócił status różny od zera, diagnostyka zawiera \texttt{\_\_wrap\_sbrk} oraz nazwę członu malloc, a końcowy ELF nie istnieje. Inny błąd linkera nie spełnia kryterium. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — expected-fail jako kontrolowany przebieg} Skrypt usuwa stary artefakt, kompiluje task, uruchamia link w trybie dopuszczającym błąd, zapisuje status i log, po czym przywraca rygor \texttt{set -e}. Dopiero cztery asercje zamieniają oczekiwaną porażkę programu w sukces testu. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · N/D} \textbf{N/D.} Linkowanie kończy się przed utworzeniem obrazu wykonywalnego, więc nie istnieje runtime, breakpoint ani obiekt domenowy zmieniający stan w czasie wykonania. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — dowodem jest diagnostyka przed runtime} Odczytaj \texttt{expected-link-failure.log}: cztery relokacje z \texttt{libc\_stdlib\_malloc.c.o} wskazują brak \texttt{\_\_wrap\_sbrk}. Następnie sprawdź nieobecność \texttt{must-not-exist.elf}; nie wolno wymyślać wartości runtime dla nieistniejącego programu. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — test negatywny musi odrzucać zły powód} Wzorzec expected-fail wymaga konkretnej sygnatury błędu i braku produktu końcowego. Sam warunek „polecenie nie przeszło” byłby za słaby, bo zaliczyłby literówkę, brak kompilatora lub błędny skrypt linkera. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Narysuj łańcuch \texttt{main -> malloc -> sbrk}. Następnie uruchom \texttt{make expected-fail} i wyjaśnij, dlaczego \texttt{--wrap=sbrk} zmienia ostatnią krawędź na \texttt{\_\_wrap\_sbrk}, dlaczego brak ELF jest wynikiem poprawnym oraz czego ten test nie mówi o runtime. \par\textbf{Evidence:} Przewidywana brakująca nazwa, status kompilacji obiektu, niezerowy status linkera, cytat dwóch sygnatur z logu oraz sprawdzenie, że końcowy ELF nie istnieje. \par\textbf{Acceptance:} Kompilacja task.o kończy się sukcesem. Link ma niezerowy status, log wymienia libc\_stdlib\_malloc.c.o i undefined reference to \_\_wrap\_sbrk, a must-not-exist.elf nie istnieje. Nie wykonuje się testu host ani Hazard3. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Wynik kompilacji task.o}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Status i sygnatury błędu linkera}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK03 · Bounded sbrk i atomowy błąd} {\scriptsize\ttfamily 5a69ff6d-bda9-5b20-a18c-a8da2f88c64a}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — model oddzielony od libc} \textbf{Zachowane materiały:} \texttt{src/tasks/task03\_bounded\_sbrk.c}, \texttt{src/runtime/c09\_bounded\_sbrk.c}, \texttt{src/runtime/c09\_bounded\_sbrk.h}, \texttt{link/hazard3\_c09.ld}.\par Task03 eksportuje nazwę \texttt{c09\_sbrk}, aby nie przejąć symbolu \texttt{sbrk} picolibc. Na hoście granice obejmują statyczną arenę 512 B; na RV32I pochodzą z linkera. Ten sam algorytm widzi tylko trzy adresy. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — start, break i end} Stan ma jedną zmienną \texttt{g\_c09\_break} oraz niezmienne granice \texttt{start} i \texttt{end}. Każdy poprawny stan spełnia \texttt{start <= break <= end}; wolny obszar ma rozmiar \texttt{end-break}, a zajęty prefiks \texttt{break-start}. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · N/D} \textbf{N/D.} Wszystkie operacje c09\_sbrk i gettery są wywoływane bezpośrednio; nie ma callbacku, ISR, tablicy funkcji ani wyboru implementacji w runtime. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — tabela pięciu przejść} Od offsetu 0 operacje dają kolejno: \texttt{+16 -> 16}, \texttt{+24 -> 40}, zbyt duży wzrost \texttt{-> 40}, \texttt{-8 -> 32}, zejście o 33 \texttt{-> 32}. Udany call zwraca stary break; porażka zwraca wszystkie bity ustawione. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — najpierw zakres, potem commit} Dla wzrostu kod porównuje wielkość z \texttt{end-current}; dla spadku oblicza bezpiecznie moduł także dla \texttt{PTRDIFF\_MIN} i porównuje go z \texttt{current-start}. Dopiero po zaliczeniu warunku zapisuje \texttt{g\_c09\_break=next}. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — VALID pozostaje VALID także po odrzuceniu} Break przechodzi przez offsety \texttt{0 -> 16 -> 40 -> 40 -> 32 -> 32}. Obie porażki są samopętlą stanu: zmienia się wynik operacji, ale nie break. Nie ma przejścia do wartości poniżej start ani powyżej end. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — offsety zamiast niestabilnych adresów} Checkpoint publikuje cztery offsety \texttt{40,40,32,32} oraz flagi \texttt{preserved=1} i \texttt{bounds=1}. Adresy bezwzględne hosta mogą się zmieniać przez ASLR, dlatego dowód porównuje różnice względem startu. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — validate then commit} Wzorzec silnej gwarancji błędu brzmi: najpierw policz bez przepełnienia, następnie sprawdź granice, a dopiero potem zmień jedyny stan. Wskaźnik break pozostaje obserwowalnie niezmieniony po odrzuconej operacji. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Zapisz stan break po sekwencji \texttt{+16,+24,fail,-8,fail}. Dla obu porażek wskaż sprawdzaną granicę i udowodnij, że zwrot \texttt{(void *)-1} nie zmienia break. Porównaj stałe offsety hosta i RV32I. \par\textbf{Evidence:} Przewidywany wynik, odczyt programu hostowego wraz z kodem powrotu, wartość obiektu wynikowego w obrazie RV32I oraz krótki wniosek wyjaśniający zgodność albo różnicę. \par\textbf{Acceptance:} Host i Hazard3: grow=40, rejected\_grow=40, shrink=32, rejected\_shrink=32, preserved=1, bounds=1, pass=1 i kod 0. Linker: \_\_heap\_start oraz \_\_heap\_end są wyrównane do 16 B, \_\_heap\_end == \_\_stack\_bottom. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Wynik programu hostowego}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Wynik RV32I i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK04 · Wyrównany smalloc append-only} {\scriptsize\ttfamily e745e1ea-9494-5b75-9596-816022153237}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — API ma celowo małą władzę} \textbf{Zachowane materiały:} \texttt{src/tasks/task04\_smalloc.c}, \texttt{src/runtime/c09\_smalloc.c}, \texttt{src/runtime/c09\_smalloc.h}, \texttt{src/runtime/c09\_bounded\_sbrk.c}, \texttt{src/runtime/c09\_bounded\_sbrk.h}.\par Klient może przydzielić payload i zresetować całą arenę. Nie może zwolnić jednego bloku ani przekazać modelowi wskaźnika do picolibc. \texttt{c09\_smalloc} pobiera surowy fragment wyłącznie przez ograniczone \texttt{c09\_sbrk}. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — 16 B metadanych bezpośrednio przed payloadem} Nagłówek ma cztery pola \texttt{uint32\_t}: magic, requested, reserved i sequence. Jego rozmiar wynosi 16 B. Zwrócony adres to \texttt{header+1}; inspekcja kontrolnie cofa się o dokładnie jeden rzeczywisty nagłówek. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · N/D} \textbf{N/D.} smalloc, inspect, reset i c09\_sbrk są zwykłymi wywołaniami bezpośrednimi; przykład nie zawiera callbacku, ISR ani dynamicznie wybieranej strategii. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — geometria dwóch bloków} Żądanie 1 B daje \texttt{align16(16+1)=32}; żądanie 17 B daje \texttt{align16(16+17)=48}. Pierwszy payload leży 16 B od startu, drugi 48 B od startu, więc ich delta wynosi 32 B. Oba adresy są wielokrotnością 16. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — size, align, reserve, header, payload} Kod odrzuca zero i przepełnienie, zaokrągla sumę nagłówka i żądania, sprawdza reprezentowalność jako \texttt{ptrdiff\_t}, rezerwuje cały blok jednym \texttt{c09\_sbrk}, zapisuje cztery pola nagłówka i dopiero wtedy zwraca payload. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — EMPTY, TWO BLOCKS, RESET} Arena przechodzi \texttt{EMPTY -> seq1 -> seq1+seq2}. Brak indywidualnego free oznacza, że break tylko rośnie. \texttt{c09\_smalloc\_reset} wykonuje jedno przejście z dowolnej zawartości do EMPTY i unieważnia oba wskaźniki naraz. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — pamięć potwierdza header przed payloadem} W checkpointcie odczytaj \texttt{first-16}: słowo magic to \texttt{0x534D414C}, requested=1, reserved=32, sequence=1. Pod \texttt{second-16} odpowiednie wartości to 17, 48 i 2. Globale potwierdzają deltę 32 i reset. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — bump allocator z jawną granicą użycia} Append-only arena jest wartościowa dla fazowego scratch storage, gdy wszystkie obiekty mają wspólny czas życia. Nie zastępuje ogólnego malloc: brak selekcji, ponownego użycia pojedynczych luk, split, coalescing i niezależnego free. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Dla żądań 1 B i 17 B wyprowadź rozmiar nagłówka, rezerwację po align-up, adres obu payloadów i zmianę break. Wskaż, dlaczego brak \texttt{c09\_sfree} jest częścią kontraktu, a reset areny nie jest odpowiednikiem \texttt{free(pointer)}. \par\textbf{Evidence:} Przewidywany wynik, odczyt programu hostowego wraz z kodem powrotu, wartość obiektu wynikowego w obrazie RV32I oraz krótki wniosek wyjaśniający zgodność albo różnicę. \par\textbf{Acceptance:} Host i Hazard3: header=16, first=32, second=48, delta=32, aligned=1, metadata=1, append=1, reset=1, pass=1 i kod 0. Nagłówki mają sequence 1 i 2; po resecie pierwszy payload wraca pod poprzedni pierwszy adres. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK04 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Wynik programu hostowego}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Wynik RV32I i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK05 · malloc/free picolibc jako czarna skrzynka} {\scriptsize\ttfamily 9a7174f1-efb7-5c18-afbe-1a34ee6da0b7}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — klient nie zna wnętrza picolibc} \textbf{Zachowane materiały:} \texttt{src/tasks/task05\_picolibc\_malloc.c}, \texttt{crt0.S}, \texttt{link/hazard3\_c09.ld}.\par Kod tasku używa tylko \texttt{malloc} i \texttt{free}. Linker łączy picolibc z platformą przez \texttt{sbrk} oraz symbole granic. Vendorowe \texttt{\_sbrk} pozostaje osobnym, nieużywanym przez malloc symbolem startu Hazard3. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — obraz składa się z czterech warstw} ELF zawiera klienta, człony \texttt{malloc/free}, człon \texttt{picosbrk} i platformowy startup. Skrypt linkera dostarcza \texttt{\_\_heap\_start/\_\_heap\_end}; crt0 ustawia \texttt{gp/tp} i zeruje BSS/TBSS. Mapa pokazuje, który obiekt wniósł każdy publiczny symbol. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · N/D} \textbf{N/D.} Klient wywołuje malloc i free bezpośrednio; badany przebieg nie przekazuje callbacku, nie obsługuje ISR i nie wybiera alokatora przez tablicę funkcji. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — kontrakt dwóch niezależnych payloadów} Program żąda 13 B i 29 B, zapisuje dwie różne sekwencje, sumuje odczytane bajty do 4612 i sprawdza rozłączność półotwartych zakresów adresów. Mierzy co najmniej 8-bajtowe wyrównanie, ale nie narzuca odległości między blokami. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — allocate, use, verify, release} Po dwóch udanych przydziałach kod zapisuje i natychmiast odczytuje oba zakresy, oblicza checksum i warunki adresowe, zwalnia najpierw drugi, potem pierwszy blok, ustawia \texttt{freed=1} i zatrzymuje się w checkpointcie. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — własność payloadu kończy się w free} Każdy wskaźnik przechodzi od braku zasobu do stanu OWNED po udanym malloc, następnie USED po zapisie i RELEASED po free. Program nie dereferencjuje wskaźnika w RELEASED i nie bada, czy następny malloc odzyska ten sam adres. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — wykonanie plus audyt ELF} Hazard3 kończy program kodem 0; globale pokazują checksum 4612, rozłączność, alignment i oba free. \texttt{nm} musi równocześnie pokazać \texttt{\_sbrk} oraz \texttt{sbrk}, a mapa trzy człony picolibc związane z malloc, free i dostawcą pamięci. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — test kontraktu bez zgadywania implementacji} Poprawny test czarnej skrzynki wymusza własności API, ale nie zależy od prywatnego nagłówka, kierunku wzrostu sterty, dokładnej delty adresów ani ponownego użycia po free. Dzięki temu pozostaje wartościowy po zmianie implementacji libc. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Nie zakładając formatu nagłówka libc, wypisz własności możliwe do sprawdzenia przez klienta dwóch przydziałów. Uruchom host i Hazard3, sprawdź checksum oraz mapę, a w ELF wykaż współistnienie vendorowego \texttt{\_sbrk} i picolibc \texttt{sbrk}. \par\textbf{Evidence:} Przewidywany wynik, odczyt programu hostowego wraz z kodem powrotu, wartość obiektu wynikowego w obrazie RV32I oraz krótki wniosek wyjaśniający zgodność albo różnicę. \par\textbf{Acceptance:} Host i Hazard3: nonnull=1, delta\_nonzero=1, checksum=4612, nonoverlap=1, aligned=1, freed=1, pass=1 i kod 0. Mapa RV32I zawiera libc\_stdlib\_malloc.c.o, libc\_stdlib\_free.c.o i libc\_misc\_picosbrk.c.o. ELF definiuje \_sbrk, sbrk, malloc, free, \_\_heap\_start i \_\_heap\_end. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK05 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Wynik programu hostowego}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Wynik RV32I i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \ESCSectionBlockEnd \end{document}