Iray indray Heisenbug nandalo ny voay

Iray indray Heisenbug nandalo ny voay

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
ПовСзло!

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ

izany fortune programa misy fepetra tsy misy exit(rand()).

Afaka manazava ve ianao? inona no tsy mety eto?

Fandihizana ara-tantara

Nahafantatra voalohany an'io Heisenbug io aho tamin'ny ampahefatry ny taonjato lasa. Avy eo ho an'ny vavahady ao amin'ny FaxNET dia ilaina ny mamorona fitaovana maro amin'ny alΓ lan'ny fantsona "milalao checkers" eo ambanin'ny FreeBSD. Araka ny efa nampoizina dia nihevitra ny tenako ho programmer efa mandroso sy za-draharaha aho. Noho izany, nikasa ny hanao ny zava-drehetra araka izay azo atao amim-pitandremana sy amim-pitandremana aho, amin'ny fijerena manokana ny fitantanana ny fahadisoana ...

Ny traikefako teo aloha momba ny fiatrehana ireo bibikely ao amin'ny sendmail sy uucp/upc dia nanampy tamin'ny fahazotoako tamin'ny "fikarakarana ny fahadisoana tanteraka." Tsy misy dikany ny mitsoraka amin'ny antsipirihan'io tantara io, fa nitolona tamin'ity Heisenbug ity aho nandritra ny tapa-bolana nandritra ny 10-14 ora. Noho izany, notsiahivina, ary omaly indray ity olom-pantatra taloha ity no nitsidika indray.

TL; DR valiny

Utility head afaka akatona ny fantsona avy fortune сразу raha vao mamaky ny andalana voalohany izy. RAHA fortune dia mamoaka andalana mihoatra ny iray, avy eo ny antso mifanaraka aminy write() dia hamerina hadisoana na tatitra fa vitsy kokoa ny bytes mivoaka noho ny nangatahana. Ho setrin'izany, nosoratana tamin'ny fikarakarana fahadisoana tsara fortune manan-jo haneho izany toe-javatra izany amin'ny sata fivoahany. Avy eo noho ny fametrahana set -o pipefail dia hiasa || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Na izany aza, head mety tsy ho tonga ara-potoana akaiky aloha fortune dia hamita ny famoahana angona. Dia hiasa izany && echo "ПовСзло!".

Amin'ny iray amin'izao andro izao GNUMakefile misy toy izany silaka:

echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'

Nadika ho olombelona

Efa mahazatra eto ny GNU Manaova ΠΈ bash amin'ny fomba compiler mampiasa ny safidy --version dia manontany hoe iza izy, ary raha tsy tohanana ilay safidy dia asiana stub "Ampiasao azafady GCC na CLANG compiler compatible".

Tahaka izany boilerplate hita na aiza na aiza. Efa ela no nisehoan'ity toerana ity ary niasa tsara na aiza na aiza (Linux, Solaris, OSX, FreeBSD, WSL sns.). Fa omaly in altlinux eo amin'ny sehatra Elbrus 2000 (E2K) Tsikaritro:

#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"

Raha ny marina, dia tsy nahafantatra avy hatrany ny β€œfahalalako” taloha aho. Ankoatr'izay, ny tetikasa dia efa nosedraina imbetsaka tao amin'ny Elbrus ary tamin'ny fizarana maro samihafa, anisan'izany ny Alt. Miaraka amin'ny compiler isan-karazany, dikan-tenin'ny GNU Make sy bash. Noho izany, tsy te hahita ny fahadisoako eto aho.

Rehefa nanandrana namerina ny olana sy/na mahatakatra ny zava-mitranga, dia nanomboka nisy zavatra hafahafa kokoa.
Tsipelina andalana baiko:

echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"

Indraindray dia hamokatra lahatsoratra fanampiny, avy eo tsy ... Matetika ny iray amin'ireo safidy dia mijanona ela be, fa raha mitsambikina lava kokoa ianao dia mahazo roa foana!

Mazava ho azy, strace ny antsika rehetra! Ary rehefa nitendry strace tirade, nefa tsy nanam-potoana hanindry ny Enter, dia nahafantatra ny namako taloha Mr. Heisenbug, sy ny developers. compiler ny tenako 25 taona lasa izay, Nostalgie… Ary nanapa-kevitra ny halahelo aho ary hanoratra ity fanamarihana ity πŸ˜‰

Raha ny tokony ho izy, toy ny manaja tena Heisenbug, ambanin'ny strace aleony tsy miteraka.

Dia inona no mitranga?

  • Utility head manana zo (na ny marimarina kokoa aza, voatery) hanidy ny fantsona vakina raha vao mamaky ny isan'ny andalana nangatahana.
  • Mpanoratra programa mpamokatra data (amin'ity tranga ity cc) afaka manonta tsipika maromaro ary maimaim-poana manao izany amin'ny alalan'ny antso maro write().
  • raha ny mpamaky dia hanana fotoana hanidy ny fantsona eo anilany alohan'ny fiafaran'ny fandraisam-peo eo amin'ny lafiny mpanoratra, dia hahazo fahadisoana ny mpanoratra.
  • Programa mpanoratra manana ny zo samy tsy miraharaha ny fahadisoana manoratra ny fantsona ary maneho izany ao amin'ny kaody famitanao.
  • Noho ny fametrahana set -o pipefail ny kaody famenoana fantsona dia tsy aotra (diso) raha tsy aotra ny vokatra avy amin'ny singa iray farafaharatsiny, ary avy eo dia hiasa || echo "Please use GCC or CLANG compatible compiler".

Mety hisy fiovaovana miankina amin'ny fomba fiasan'ny programa mpanoratra miaraka amin'ny famantarana. Ohatra, mety hifarana amin'ny fomba tsy ara-dalΓ na ny programa (miaraka amin'ny famoronana automatique tsy aotra/fahadisoana sata famaranana), na write() dia hamerina ny vokatry ny fanoratana bytes vitsy kokoa noho ny nangatahana sy napetraka errno = EPIPE.

Iza no meloka?

Amin'ny tranga voalaza kely ny zavatra rehetra. Hadisoana amin'ny fitantanana cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) tsy miverimberina. Amin'ny toe-javatra maro dia tsara kokoa ny manao fahadisoana amin'ny lafiny fitandremana, na dia mampiseho lesoka tampoka eo amin'ny boilerplate natao ho an'ny fitondran-tena mahazatra aza izany.

Inona no tokony ataoko?

Diso:

fortune | head -1 && echo "ПовСзло, Π½ΠΎ Π²Ρ‹ рискуСтС!" || echo "WTF?"

hanitsy:

  1. (fortune && echo "УспСшно" || echo "Ошибка") | head -1

    Eto, ny fanakatonana sodina aloha dia hokarakarain'ny mpandika teny baiko rehefa mikarakara ny fantsona misy akany ("ao anatin'ny" fononteny). Araka izany, raha fortune dia hitatitra fahadisoana an-tsoratra amin'ny fantsona mihidy ao amin'ny sata, dia ny vokatra || echo "Ошибка" tsy ho tonga na aiza na aiza, satria efa mihidy ny fantsona.

  2. fortune | cat - | head -1 && echo "УспСшно" || echo "Ошибка"

    Ity ny utility cat miasa toy ny damper satria tsy miraharaha ny fahadisoana EPIPE rehefa misintona. Ampy izay ho fehin-kevitra izao fortune kely (andalana maromaro) ary mifanaraka amin'ny buffer fantsona (avy amin'ny 512 bytes ka hatramin'ny β‰ˆ64K, amin'ny ankamaroan'ny OS β‰₯4K). Raha tsy izany dia mety hiverina ny olana.

Ahoana ny fikarakarana tsara EPIPE sy ny fahadisoana hafa momba ny firaketana?

Tsy misy vahaolana tokana tokana, fa misy soso-kevitra tsotra:

  • EPIPE ilaina tsy maintsy karakaraina (ary hita taratra amin'ny sata fivoahana) rehefa mamoaka angon-drakitra mitaky fahamendrehana. Ohatra, mandritra ny fiasan'ny archiver na fitaovana backup.
  • EPIPE aleo tsinontsinoavina rehefa mampiseho fampahalalana sy hafatra fanampiny. Ohatra, rehefa mampiseho fampahalalana momba ny safidy --help na --version.
  • Raha ny code novolavolaina dia azo ampiasaina amin'ny fantsona mialoha | head, then EPIPE Tsara kokoa ny tsy miraharaha, raha tsy izany dia tsara kokoa ny mandinika sy mandinika ny sata fivoahana.

Te-hanararaotra izao fotoana izao aho hanehoana ny fankasitrahana ny ekipa MCST ΠΈ altlinux ho an'ny asa mahavokatra lehibe. Mahagaga ny fahavononanao!
Tohizo izany ry Camarades, ambony fivoriana amin'ny fararano!

Бпасибо berez ho fanitsiana ny lesoka sy ny lesoka.
KDPV avy amin'ny Georgy A.

Source: www.habr.com

Add a comment