Píosaí liom in áiteanna eile:

2021-07-23

Botún cló le toradh tromchúiseach

I ndiaidh dom alt a scríobh inné faoi ríomhchlárú agus intleacht shaorga léigh mé an t-alt seo maidir le botún tromchúiseach i Chrome OS, a d'fhág daoine gan rochtain ar a ngléasanna.

Chuir an míniú mearbhall orm i dtosach - "&" in áit "&&" a bhí i gceist. Ní bheadh a leithéid tromchúiseach i C - cé go bhféadfadh sé toradh mícheart a thabhairt. Is éard is ciall le "&" le dhá oibreann i C ná agus de réir giotáin - beidh an giotán san toradh fíor má tá an ghiotán san dá oibreann fíor. Mar shampla, ag úsáid uimhreacha déanárta:

0b1010 & 0b1011 => 0b1010.

ach

0b0101 & 0b1010 => 0b0000

I C ciallaíonn && agus loighice; má tá an dá oibreann fíor, beidh an toradh fíor. Níl an luach ar fíor sáinmhínithe, is ionann aon luach nach náid agus fíor. Go hiondúil, is 1 a bhaineann an tionsaitheoir feidhm as mar fíor.

Mar sin is ionann

0b1010 && 0b1011 = (0 != 0b1010) && (0 != 0b1011) => FÍOR = 1

agus

0b0101 && 0b1010 = (0 != 0b0101 ) && (0 != 0b1010 ) => FÍOR = 1

Bhí corr eile i gceist leis an bhfadhb a tháinig chun cinn i gcás Chrome, áit a bhfuil C++ in úsáid, agus brí beagáinín éagsúil i gceist le & agus &&. 

Tá feidhm loighice acu araon; ach má tá an oibreann ar chlé bréagach, ní dhéanann && an oibreann ar dheis a ríomh in aon chor. Seo, is, cosúil, an feidhm a spreag an fadhb.

std::string VaultKeyset::GetLabel() const {
  if (key_data_.has_value() & !key_data_->label().empty()) {
    return key_data_->label();
  }
  // Fallback for legacy keys, for which the label has to be inferred from the
  // index number.
  return base::StringPrintf("%s%d", kKeyLegacyPrefix, legacy_index_);
}

Dá mbeadh && úsáidte, agus dá mbeadh key_data_.has_value() bréagach, ní ríomhfaí in aon chor key_data_->label().empty(). Déanaim amach, sa chás go raibh an chéad oibreann bréagach, nach mbeadh an dara ceann bhailí, agus go mbeadh fabht ann dá ndéanfaí iarracht é a ríomh.

Is cosúil, dar liom, go raibh feidhm nua a thabhairt isteach diaidh ar ndiaidh, ach go raibh an sean feidhm ("legacy keys") de dhíth dáiríre. Shamhlóinn freisin gurb é sin an chúis nár aimsigh na scrúdaithe an fhadhb sular scaoileadh é - go raibh siad ag díriú ar an feidhm nua a bheith ag obair ceart. Ba cheart ar ndóigh bheith cinnte, má tá seanfeidhmeanna in úsaid, nach bristear iad. Ach is éasca do forbróir dearmad a dhéanamh ar an tsean-rud!

Is minic, san ríomhchlárú, go mbíonn fabht tromchúiseach mar thoradh ar bhotún fánach mar seo.