Kotahi ano Heisenbug kua hipa i te koaka

Kotahi ano Heisenbug kua hipa i te koaka

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Повезло!

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Вы проиграли

ko te reira fortune hōtaka herekore exit(rand()).

Ka taea e koe te whakamarama he aha te he i konei?

Waiata-historical digression

I mohio tuatahi ahau ki tenei Heisenbug i te hauwha o te rau tau ki muri. Na mo te kuaha i roto i te FaxNET me hanga etahi taputapu ma paipa "takaro taki" i raro i FreeBSD. Ka rite ki te tumanako, i whakaaro ahau he kaiwhakatakoto kaupapa matatau me te tino mohio. Na reira, i whakaaro ahau ki te mahi i nga mea katoa ma te tupato me te tupato ka taea, me te aro nui ki te whakahaere hapa...

Ko taku wheako o mua mo te whakahaere i nga pepeke i roto i te sendmail me te uucp/upc i taapiri atu ki taku kaha ki te "whakahaere hapa." Kaore he take mo te ruku ki nga korero o taua korero, engari i tohe ahau ki tenei Heisenbug mo nga wiki e rua mo te 10-14 haora. No reira, i maumaharatia, inanahi nei i tu atu tenei hoa tawhito ki te toro atu ano.

TL;DR Whakautu

Mahinga head taea kati te hongere mai fortune сразу ka panui ia i te rarangi tuatahi. Mehemea fortune ka whakaputa neke atu i te kotahi raina, katahi ka waea atu write() ka whakahoki mai he hapa, he ripoata ranei he iti ake nga paita ka puta mai i te tono. Ka huri, ka tuhia me te tupato ki te whakahaere hapa fortune kei a ia te tika ki te whakaata i tenei ahuatanga i roto i tona mana puta. Na na te whakaurunga set -o pipefail ka mahi || echo "Вы проиграли".

Engari, head e kore pea e tae i te waa kati i mua fortune ka mutu te whakaputa raraunga. Na ka mahi && echo "Повезло!".

I tetahi o aku ra GNUMakefile he kotahi kongakonga:

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

I whakamaoritia ki te tangata

He mea noa i konei mo GNU Hanga и Tuhinga i te huarahi whakahiato ma te whakamahi i te whiringa --version ka patai ko wai ia, a, ki te kore e tautokohia te whiringa, katahi ka whakauruhia he papa "Whakamahia koa te GCC or CLANG compiler hototahi".

rite paraharaha ka kitea ki hea. I puta mai ki tenei waahi i mua noa atu, ka mahi pai ki nga waahi katoa (Linux, Solaris, OSX, FreeBSD, WSL etc.). Engari inanahi i roto altlinux i runga i te kaupapa Elbrus 2000 (E2K) I kite ahau:

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

Te parau mau, aita vau i ite oioi i to ’u “matamua” tahito. Ano, he maha nga wa kua whakamatauria te kaupapa i runga i te Elbrus me te maha o nga tohatoha rereke, tae atu ki a Alt. Me nga momo whakahiato, nga putanga o GNU Make me te bash. Na reira, kaore au i pai kia kite i taku he i konei.

I te wa e ngana ana ki te whakaputa i te raru me te mohio ranei ki nga mea kei te haere, ka timata nga mea rereke.
Takitaki raina whakahau:

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

Ia wa, katahi ka whakaputa tuhinga taapiri, karekau... I te nuinga o te waa ka mau tonu tetahi o nga whiringa, engari mena ka roa ake koe, ka whiwhi koe i nga mea e rua!

Ko te tikanga, strace a tatou mea katoa! Na ka patopato i te strace tirade, engari kaore he wa ki te pehi i te Enter, ka mohio ahau ki taku hoa tawhito ko Mr. Heisenbug, me nga kaihanga. whakahiato ahau 25 tau ki muri, Nostalgia… Na ka whakatau ahau ki te pouri me te tuhi i tenei tuhipoka 😉

Ma te ara, pera me te whakaute-whaiaro Heisenbug, i raro i strace he pai ake kia kaua e whakaputa uri.

Na he aha kei te haere?

  • Mahinga head kei a ia te tika (he kaha ake ranei) ki te kati i te hongere e panuitia ana ina panuitia te maha o nga rarangi i tonoa.
  • Ko te kaupapa-whakaputa raraunga-kaituhi (i tenei keehi cc) taea tāngia ngā rārangi maha me te kore utu mahia tenei ma nga waea maha write().
  • ki te ka whai wa te kaipanui ki te kati i te hongere i tona taha i mua i te mutunga o te rekoata ki te taha o te kaituhi, katahi ka hapa te kaituhi.
  • Hōtaka kaituhi kei a nga tangata tika ka warewarehia te hongere tuhi hapa me te whakaata i roto i to waehere whakaotinga.
  • Nā te tāutanga set -o pipefail ka kore-kore te waehere whakaoti paipa (he pohehe) mena he kore-kore te hua mai i te mea kotahi, katahi ka mahi || echo "Please use GCC or CLANG compatible compiler".

He rereke pea kei te ahua o te mahi a te kaituhi me nga tohu. Hei tauira, ka mutu kino pea te hotaka (me te whakaputa aunoa i te mana kore-kore/whakamutu hapa), ranei write() ka whakahokia te hua o te tuhi i nga paita iti ake i te tono me te tautuhi errno = EPIPE.

Ko wai te mea he?

I roto i te keehi kua whakaahuatia iti o nga mea katoa. Hapa te whakahaere i roto cc (lcc:1.23.20:Sep—4-2019:e2k-v3-linux) ehara nui. I te nuinga o nga wa he pai ake te kotiti i te taha o te whakatupato, ahakoa ka kitea nga hapa ohorere i roto i te pereti kohua i hangaia mo te whanonga tuku iho.

Me aha ahau?

Hape:

fortune | head -1 && echo "Повезло, но вы рискуете!" || echo "WTF?"

Tika:

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

    I konei, ko te katinga moata o te paipa ka whakahaerea e te kaiwhakamaori whakahau i te wa e mahi ana i te paipa kohanga ("kei roto" i nga reu). No reira, mena fortune ka ripoata he hapa i roto i te tuhi ki tetahi hongere kati i roto i te mana, katahi ko te putanga || echo "Ошибка" e kore e tae ki hea, i te mea kua kati te hongere.

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

    Anei te whaipainga cat ka mahi hei whakamarumaru na te mea ka warewarehia te hapa EPIPE i runga i te tangohanga. He nui tenei mo te whakatau inaianei fortune iti (he maha nga raina) ka uru ki roto i te parapara hongere (mai i te 512 paita ki te ≈64K, i te nuinga o te OS ≥4K). Ki te kore ka hoki mai ano te raru.

Me pehea te tukatuka tika EPIPE me etahi atu hapa tuhi?

Karekau he otinga tika kotahi, engari he tohutohu ngawari:

  • EPIPE hiahiatia me tukatuka (me te whakaata i te mana puta) i te whakaputanga raraunga e tika ana. Hei tauira, i te wa e mahi ana nga purongo, taputapu taapiri ranei.
  • EPIPE pai ake te wareware i te wa e whakaatu ana i nga korero me nga karere awhina. Hei tauira, i te wa e whakaatu ana i nga korero mo nga whiringa --help ranei --version.
  • Mena ka whakawhanakehia te waehere ka taea te whakamahi i roto i te paipa i mua | head, ka EPIPE He pai ake te wareware, ki te kore he pai ake te tukatuka me te whakaata i te ahua o te putanga.

E hiahia ana ahau ki te whai waahi ki te whakapuaki i taku mihi ki nga kapa MCST и altlinux mo nga mahi whai hua nui. He mea whakamiharo to whakatau!
Kia mau e hoa ma, ki runga hui i te ngahuru!

Tuhinga berez mo te whakatika hapa me nga hapa.
KDPV mai Georgy A.

Source: will.com

Tāpiri i te kōrero