Sunteți pe pagina 1din 7

Constructing an Error Correcting Code

Andrew E. Phelps University of Wisconsin, Madison Nov 9, 2006 . !ntrod"ction

error soft error

Whenever data is stored or trans#itted, there is so#e chance that one or #ore $its will %flip& '' that is, will chan(e to an incorrect val"e. )"ch incorrect val"es are called errors* they #ay $e d"e to a per#anent fa"lt +$ro,en hardware- or a transient condition. .ransient or soft errors often occ"r when storin( data in /0AM or trans#ittin( a pac,et across a networ, connection. As transistors shrin,, errors are $eco#in( #"ch #ore co##on* in a #odern chip the devices are so s#all that cos#ic rays or alpha particles can chan(e the val"e of $its that are stored in )0AM or re(isters, or are si#ply #ovin( across the die. .o co"nteract this pro$le# and ens"re relia$le operation, error correctin( codes +ECC- are "sed. E1tra $its are sent or stored alon(side the data $its to provide red"ndant infor#ation. With eno"(h $its of caref"lly chosen red"ndant infor#ation, we can detect or correct the #ost pro$a$le classes of errors. A trivial e1a#ple of red"ndant infor#ation wo"ld $e to si#ply send an additional copy of each $it. !f there is a sin(le error +one or the other $it is wron(-, we can detect it +$eca"se the two $its no lon(er #atch-. 2"t this code has two disadvanta(es3 it has a hi(h overhead + 004-, and it does not allow error correction $eca"se it does not tell "s which of the two $its is wron(. A co##only "sed code is parity. 5ne e1tra $it is "sed with a (ro"p of data $its* this 6parity $it6 is set s"ch that the total n"#$er of 6 6 $its is odd. +.his is called 6odd parity6* another code is 6even parity6 in which the total n"#$er of 6 6 $its is even.- .his code has a low overhead for a reasona$le si7e of data word, and it allows detection of any one error* $"t it still does not allow correction.

ECC

SECDED

5ne of the co##onest error correctin( codes is the SECDED code* this stands for 6)in(le Error 8orrection, /o"$le Error /etection6. We shall see $elow how to create the lo(ic for s"ch a code. 2. 9a##in( /istance :irst, we need a few definitions.

data bits check bits codeword valid codeword Hamming distance

.he data bits are the ori(inal $its we want to protect. .he check bits are the e1tra $its that we send or store alon(side the data $its. .he codeword is the entire set of data $its and chec, $its. A valid codeword is one where the chec, $its are correctly (enerated fro# the data $its accordin( to the r"les of the code. .he Hamming distance $etween two words is the n"#$er of $its that are different $etween the two words. :or e1a#ple, 600 6 and 60 6 have a 9a##in( distance of one, $eca"se only the #iddle $it is different. 600 6 and 60 0006 have a 9a##in( distance of fo"r. .he #ini#"# 9a##in( distance $etween any two valid codewords in a code deter#ines how #any errors #ay $e detected or corrected "sin( that code. :or e1a#ple, if the #ini#"# 9a##in( distance is one, then it is possi$le for a sin(le $it error to
Page 1 of 7

#a,e one valid codeword into another valid codeword, so it is not possi$le in (eneral to detect or correct even a sin(le error. 2"t if the #ini#"# 9a##in( distance is two, then a sin(le error #"st t"rn a valid codeword into an invalid one, th"s allowin( the error to $e detected. !f the #ini#"# 9a##in( distance is three, then a sin(le error can $e corrected. 8onsider fi("re . )"ppose %0000& is a valid codeword in a code with #ini#"# distance three. !f it is corr"pted $y an error to %000 &, we ,now it is not a valid codeword +since the 9a##in( distance is only one-, and f"rther#ore we ,now it is in the set of codewords that co"ld only have started as %0000&. No other valid codeword is only a sin(le $it'flip away fro# %000 &, since that wo"ld violate the ass"#ed #ini#"# 9a##in( distance for this code. .h"s invalid codewords can $e placed into dis;oint sets that each correspond to at #ost one valid codeword. Suppose 0000 and 0111 are valid codewords. A single error will produce a codeword that is correctable to the original valid codeword. But a double error could, for example, change 0000 into 0011, which would be falsely corrected to 0111.

0010 0000 0100


All #ap to 0000

1111 0001 1000 0011 0101


All #ap to 0

0111 0110

Figure 1 Code with Minimum Hamming Distance of 3


!f the #ini#"# 9a##in( distance is fo"r, then we can correct any sin(le'$it error and detect any two'$it error. 8onsider fi("re 2. 5nce a(ain, there are dis;oint sets of invalid codewords that arise fro# sin(le'$it errors. 2"t a two'$it error cannot ta,e "s into a different set* it can only ta,e "s halfway to another valid codeword and th"s leaves "s in a no'#an<s'land which indicates a do"$le' $it error. Suppose 00000 and 01111 are valid codewords. A single error will produce a codeword that is correctable to the original valid codeword. A double error could, for example, change 00000 into 00011, which is Hamming distance two from the nearest valid codewords and thus is nown to be an uncorrectable error.

00010 00000 00100

10000 00001 01000 00011


Uncorrecta$le

01110 00111 01011

11111 01111 01101

All #ap to 00000

All #ap to 0

Figure 2 Code with Minimum Hamming Distance of 4


!n (eneral, a code that can correct n errors and detect m errors +m = n- #"st have a #ini#"# 9a##in( distance of n>m> .

Page 2 of 7

!n order to i#ple#ent an error correctin( code, we need three thin(s3 ?o(ic to create the chec, $its with the desired #ini#"# 9a##in( distance ?o(ic on the receivin( end to chec, the chec, $its and deter#ine if there was an error ?o(ic to correct the data, if correcta$le @. A )i#ple Error'8orrectin( 8ode :irst, we will consider a sin(le'error'correctin( code with a #ini#"# 9a##in( distance of three.

name

.o create the chec, $its, we will choose a pattern of chec, $its associated with each data $it. ?et<s call this the name for that data $it. .he chec, $its for an entire word will $e the e1cl"sive'50 of the na#es for each data $it whose val"e is one. :or e1a#ple, if we choose the na#e %0 0 0 & to (o with data $it 7ero, and %0 0 0& to (o with data $it one, then a codeword with ;"st data $its 7ero and one set wo"ld have chec, $its %0 0 0 &. 2"t how do we choose na#es so that the #ini#"# 9a##in( distance is threeA .his is act"ally easier than it #ay so"nd. We #ay choose any na#es we li,e s"ch that3 Each data $it has a "niB"e na#e* Each na#e has at least two $its set. .o see that we have achieved o"r #ini#"# distance, consider any two valid nonidentical codewords. .he data portion #"st differ, since two valid codewords co"ldn<t have identical data $"t different chec,$its. !f the data portion differs in3 A sin(le data $it, then their chec, words differ in the two or #ore $its correspondin( to the na#e for that data $it. )o the #ini#"# distance is three + data > 2 chec,-. .wo data $its, then their chec, words differ $y the e1cl"sive'50 of the two correspondin( na#es. )ince each na#e is "niB"e, they #"st differ in at least one $it, so the #ini#"# distance is three +2 data > chec,-. .hree or #ore data $its, then we have #et o"r #ini#"# distance of three re(ardless of the chec, $its. .he code is often represented in a ta$le, s"ch as the one $elow. .he na#e of each data $it #ay $e read $y loo,in( down the col"#n $elow the $it. !n this case, we have assi(ned na#es in order startin( with $it 7ero, "sin( each possi$le na#e that #eets the criterion of havin( two or #ore $its set. .h"s, we "sed these na#es3 00 , 0 0 , 0 0, 0 , 00 , 0 , 00. We co"ld also have "sed 0 , 0, or , $"t we only needed ei(ht of the eleven possi$le na#es. +We co"ld have chosen any ei(ht, and assi(ned the# in any order.Data bits 7 6 5 4 3 2 1 0 Check bit 0: 0 1 0 1 1 0 1 1 Check bit 1: 0 1 1 0 1 1 0 1 Check bit 2: 1 0 0 0 1 1 1 0 Check bit 3: 1 1 1 1 0 0 0 0 Each chec, $it then is si#ply the e1cl"sive'50 of each data $it that has a % & in the correspondin( row. .he lo(ic +in Cerilo(- that (enerates the chec, $its for this e1a#ple is (iven here. +!n Cerilo(, the %D& operator denotes e1cl"sive'50. )ince e1cl"sive'50 is co##"tative and associative, the (ro"pin( of these operations into (ates is i##aterial.assign assign assign assign checkbits[0] checkbits[1] checkbits[2] checkbits[3] = = = = d[6] d[6] d[7] d[7] ^ ^ ^ ^ d[4] d[5] d[3] d[6] ^ ^ ^ ^ d[3] d[3] d[2] d[5] ^ ^ ^ ^ d[1] ^ d[0]; d[2] ^ d[0]; d[1]; d[4];

.his is not standard ter#inolo(y, $"t is a ter# that the a"thor $elieves is "sef"l.

Page 3 of 7

When the code word is received +or retrieved fro# stora(e-, one or #ore errors #ay have occ"rred. Each error is considered to $e a sin(le $it that has chan(ed state. +Errors s"ch as readin( the wron( location in #e#ory are not considered here.- .o deter#ine if the received codeword is valid, we (enerate a new set of chec,$its fro# the data and co#pare it to the received chec,$its. !f no error has occ"rred, the two versions of the chec,$its #"st #atch.

syndrome

.he e1cl"sive'50 of the new and old chec,$its is called the syndrome. .he syndro#e tells "s what we need to ,now a$o"t the error. 8onsider what happens if a sin(le data $it i flips fro# 7ero to one. !f the ori(inal data $its were 10, 1 , ... 1n, the ori(inal chec,$its were na#e10 D na#e1 ... D na#e1n .he new chec,$its will $e na#e10 D na#e1 ... D na#ei ... D na#e1n 0ecallin( that e1cl"sive'50 is co##"tative and associative, and its own inverse, the e1cl"sive'50 of the a$ove two e1pressions is +na#e10 D na#e10- D +na#e1 D na#e1 - D ... D +na#e1n D na#e1n- D na#ei E 0 D 0 D ... D 0 D na#ei E na#ei .h"s, in this case, the syndro#e is si#ply the na#e of the $ad $it. !n the case where data $it i flipped fro# one to 7ero, the ori(inal chec,$its were na#e10 D na#e1 ... D na#ei ... D na#e1n and the new chec,$its are na#e10 D na#e1 ... D na#e1n .hese are the sa#e two e1pressions as a$ove, in the opposite order* the e1cl"sive'50 is the sa#e. Either way, the res"lt is the na#e of the flipped $it. 5f co"rse, errors can occ"r in chec, $its as well as in data $its* the cos#ic rays do not care which $its are which. !f there is a sin(le $it error in a chec,$it, the syndro#e will have ;"st that $it set. .his is easily distin("ished fro# a data $it na#e, since na#es have at least two $its set. A si#ple decoder on the syndro#e can $e "sed to (enerate the si(nals with which to e1cl"sive'50 the data $its to correct sin(le'$it errors. 2"t a decode of 7ero +no error-, or of , 2, F, G, ... +chec, $it error-, will indicate that the data does not need to $e corrected. .his code is not desi(ned for do"$le errors. !f there are errors in two data $its, the syndro#e will eB"al the e1cl"sive'50 of the two na#es, and this will $e so#e ar$itrary non'7ero n"#$er. !f that n"#$er happens to $e the na#e of so#e other $it, the circ"it will #ista,enly %correct& that $it, ca"sin( a third error. !f this sit"ation is li,ely to occ"r, then we need a stron(er code. F. )E8/E/ 8odes .he #ost co##only'"sed error'correctin( codes are )E8/E/ codes* as stated earlier this stands for %sin(le error correctin(, do"$le error detectin(&. .he lo(ic is very si#ilar to that of the sin(le'error correctin( code we ;"st loo,ed at, $"t, we saw a$ove, we now need a #ini#"# 9a##in( distance of fo"r. .o do this, we will add one #ore r"le in choosin( na#es for $its. +.he first two r"les are the sa#e as in the code a$ove.

Each data $it has a "niB"e na#e* Each na#e has at least two $its set* Each na#e #"st have an odd n"#$er of $its set in it.
Page 4 of 7

5ne way to do this is $y increasin( the si7e of the chec,$it field $y one, and "sin( this $it as a parity for the chec,$its. .his will also ("arantee that the entire codeword has consistent parity, since each additional $it set in the codeword ca"ses an even n"#$er of $its to $e flipped +an odd n"#$er in the chec,$its pl"s the one data $it-. Act"ally, one can eB"ivalently thin, of the e1tra chec,$it as the e1cl"sive'50 of the rest of the codeword, and it is so#eti#es descri$ed this way* $"t it is "nli,ely that one wo"ld i#ple#ent it that way since this wo"ld $eco#e the critical path of the lo(ic. Note that each na#e now has at least three $its set in it. Now let<s re'e1a#ine the cases to see if we #eet o"r #ini#"# 9a##in( distance. 8onsider any two valid nonidentical codewords. !f their data $its differ in3

A sin(le data $it, then their chec, words differ in the three or #ore $its correspondin( to the na#e for that data $it. )o the #ini#"# distance is fo"r + data > @ chec,-. .wo data $its, then their chec, words differ $y the e1cl"sive'50 of the two correspondin( na#es. )ince each na#e is "niB"e, they #"st differ in at least one $it. 2"t since each na#e has odd parity, it is i#possi$le for the# to differ in only a sin(le $it. )o the #ini#"# distance is fo"r +2 data > 2 chec,-. .hree data $its3 )ince the e1cl"sive'50 of three val"es with odd parity #"st have odd parity, it #"st have at least one $it set. )o the #ini#"# distance is fo"r +@ data > chec,-. :o"r or #ore data $its, then we have #et o"r #ini#"# distance of fo"r re(ardless of the chec, $its.

9ere is the code in ta$le for#. While one approach wo"ld have $een to si#ply choose the first ei(ht na#es that #eet all o"r criteria, we have instead chosen to define chec, $its 0'@ as in the previo"s code and si#ply add chec, $it F as a parity $it3
7 0 0 1 1 1 Data 6 5 4 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 bits 3 2 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1

Check Check Check Check Check

bit bit bit bit bit

0: 1: 2: 3: 4:

5ne additional i#prove#ent we can #a,e to the code3 We can invert the o"tp"t of so#e of the e1cl"sive'50 operations +eB"ivalent to replacin( the e1cl"sive'50 with e1cl"sive'N50-. With the sa#e chan(e #ade in $oth the sender and the receiver, this has no real effect e1cept to chan(e the %$aseline& val"e of so#e of the chec,$its. .his is "sef"l $eca"se one co##on type of #"lti'$it error is to have the entire word t"rned %off& in so#e way, so that it $eco#es entirely 7ero. !t is (ood practice to have the all'7ero codeword represent an "ncorrecta$le error. !n o"r e1a#ple, let<s pic, chec, $its @ and F to #a,e e1cl"sive'N50. .he res"ltin( Cerilo( for (eneratin( the chec, $its is3
assign assign assign assign assign checkbits[0] checkbits[1] checkbits[2] checkbits[3] checkbits[4] = d[6] ^ = d[6] ^ = d[7] ^ = ~(d[7] ^ = ~(d[7] ^ d[4] d[5] d[3] d[6] d[5] ^ ^ ^ ^ ^ d[3] d[3] d[2] d[5] d[4] ^ ^ ^ ^ ^ d[1] ^ d[0]; d[2] ^ d[0]; d[1]; d[4] ; d[2] ^ d[1] ^ d[0] ;

5n the receivin( end, once a(ain, we (enerate new chec,$its, and e1cl"sive'50 the# with the received chec,$its to for# the syndro#e. !f there is no error, the syndro#e will $e 7ero* and if there is a sin(le error the syndro#e will eB"al the na#e of the $ad $it. )o far this is the sa#e as the sin(le'error'correctin( code a$ove. 2"t now consider what happens when there are two errors. .he syndro#e will $e the e1cl"sive'50 of two na#es +or a na#e and a chec,$it, or two chec,$its-, $"t it
Page 5 of 7

cannot possi$ly $e eB"al to so#e valid na#e $eca"se the parity will not #atch. Whether na#es or chec,$its, it will $e the e1cl"sive'50 of two odd'parity n"#$ers and th"s will have even parity. Parity ("arantees that we will detect that an "ncorrecta$le error has occ"rred. 9ere is the Cerilo( of the chec,Hcorrect $loc,3
!! ca"c#"ate s$nd%&'e: assign assign assign assign assign s$nd[0] s$nd[1] s$nd[2] s$nd[3] s$nd[4] = c[0] ^ = c[1] ^ = c[2] ^ = ~(c[3] ^ = ~(c[4] ^ d[6] d[6] d[7] d[7] d[7] ^ ^ ^ ^ ^ d[4] d[5] d[3] d[6] d[5] ^ ^ ^ ^ ^ d[3] d[3] d[2] d[5] d[4] ^ ^ ^ ^ ^ d[1] ^ d[0]; d[2] ^ d[0]; d[1]; d[4] ; d[2] ^ d[1] ^ d[0] ;

!! Dec&de% (&% s$nd%&'es: !! )he *("i+, signa"s -i"" be #sed t& c&%%ect the data bits !! )he *chkb, signa"s indicate a sing"e checkbit e%%&% !! )he *db", signa"s indicate a d&#b"e.bit e%%&% !! )he *badc&de, signa"s indicate #n#sed na'es and th#s '#"tibit e%%&%s assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign assign n&e%%&% = ~s$nd[4] / chkb[0] = ~s$nd[4] / chkb[1] = ~s$nd[4] / db"[0] = ~s$nd[4] / chkb[2] = ~s$nd[4] / db"[1] = ~s$nd[4] / db"[2] = ~s$nd[4] / ("i+[3] = ~s$nd[4] / chkb[3] = ~s$nd[4] / db"[3] = ~s$nd[4] / db"[4] = ~s$nd[4] / ("i+[6] = ~s$nd[4] / db"[5] = ~s$nd[4] / badc&de[0]=~s$nd[4]/ badc&de[1]=~s$nd[4]/ db"[6] = ~s$nd[4] / chkb[4] = s$nd[4] / db"[7] = s$nd[4] / db"[0] = s$nd[4] / ("i+[3] = s$nd[4] / db"[1] = s$nd[4] / ("i+[3] = s$nd[4] / ("i+[3] = s$nd[4] / db"[10] = s$nd[4] / db"[11] = s$nd[4] / ("i+[4] = s$nd[4] / ("i+[5] = s$nd[4] / db"[12] = s$nd[4] / ("i+[7] = s$nd[4] / db"[13] = s$nd[4] / db"[14] = s$nd[4] / badc&de[2]=s$nd[4] / ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] ~s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] s$nd[3] / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ~s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] s$nd[2] s$nd[2] s$nd[2] s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] s$nd[2] s$nd[2] s$nd[2] s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] s$nd[2] s$nd[2] s$nd[2] s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] ~s$nd[2] s$nd[2] s$nd[2] s$nd[2] s$nd[2] / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] ~s$nd[1] ~s$nd[1] s$nd[1] s$nd[1] / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0]; ~s$nd[0]; s$nd[0];

!! (ina" %es#"ts: Page of 7

assign c&%%ected2data = d ^ ("i+; assign #nc&%%ectab"e = (3 db"[14:0] !! e4en n#'be% &( e%%&%s 3 (3 badc&de[2:0] ; !! 3 &% '&%e (&dd e%%&%s !! that d&n5t e4en 6778 "ike !! c&%%ectab"e e%%&%s !! 9&te: )he chkb[] signa"s: indicating an e%%&% in the checkbits: a%e !! #n#sed beca#se n& acti&n is necessa%$ in this case;

What happens if three $its (et flippedA )ince this is a )E8/E/ code, it #a,es no ("arantees. .he e1cl"sive'50 of three odd'parity na#es #i(ht or #i(ht not eB"al so#e other valid na#e, ca"sin( a #is'correction. +.he few cases that don<t loo, li,e a valid na#e tri((er the %$adcode& si(nals in the lo(ic a$ove.- Any even n"#$er of errors, however, will always $e fla((ed as an "ncorrecta$le error, since the parity of the syndro#e will $e sa#e as for a two'$it error. I. 5ther codes When choosin( a code, it is i#portant to consider what types of errors are e1pected in the syste# $ein( protected. .he )E8/E/ code a$ove ass"#es that sin(le'$it errors are i#portant, two'$it errors are rare, and three'$it +or #ore- errors are so rare that they can $e i(nored. .his is often a (ood ass"#ption, $"t not always. )"ppose yo" are storin( data in a #e#ory that is $"ilt fro# F'$it' wide chips, and there is so#e possi$ility of an entire chip failin(. What code wo"ld we "se thenA We do not need to detect any ar$itrary F'$it error, $"t we do want to detect the case where a sin(le chip fails ca"sin( , 2, @, or F errors within one ali(ned (ro"p of fo"r $its +one %ni$$le&-. 5"r code already detects any , 2, or F $its, $"t what a$o"t @A 9ere is another way to state the pro$le#3 :or any ali(ned (ro"p of fo"r $its, their na#es #"st $e chosen s"ch that the e1cl"sive'50 of any three of the# cannot loo, li,e any valid na#e. 9ere is one sol"tion3 8hoose the na#es s"ch that $its 0, , and 2 have these val"es3 2it 0 of any ni$$le3 000 2it of any ni$$le3 00 2it 2 of any ni$$le3 0 0 2it @ of any ni$$le3 00 .he rest of the $its of the na#e are chosen so the na#es #eet the sa#e r"les (iven $efore. 5ne can see $y inspection that the e1cl"sive'50 of any three of these cannot eB"al a valid na#e, since it will have two or three $its set a#on( $its 0, , and 2, while all valid na#es have only 7ero or one $its set. .his code reB"ires an additional chec,$it, which is not s"rprisin( since we are deli$erately #a,in( valid codewords #ore sparse. 8odes e1ist, however, for doin( ni$$le detection with lar(er data words witho"t any addition $its $eyond what is needed for )E8/E/. .he code a$ove corrects any one error, detects any two, and detects any error within one ni$$le. More co#ple1 codes can $e "sed to correct any error within a ni$$le, or even to do that while correctin( sin(le additional errors as well. Addin( #ore chec, $its allows #a,in( a code stron(er in order to overco#e #ore types of e1pected errors.

Page 7 of 7

S-ar putea să vă placă și